浏览代码

Merge pull request #3 from Unity-Technologies/zgh/add_chatroom

Zgh/add chatroom
/add_hero_sample
GitHub 3 年前
当前提交
8798f33c
共有 76 个文件被更改,包括 11459 次插入111 次删除
  1. 864
      AwesomeUIWidgets/Assets/Scenes/ShowRoom.unity
  2. 99
      AwesomeUIWidgets/Assets/Scenes/SimpleWorldSpaceUI.unity
  3. 3
      AwesomeUIWidgets/Assets/Scripts/CountDemo.cs
  4. 675
      AwesomeUIWidgets/Assets/Scenes/ChatRoomScene.unity
  5. 367
      AwesomeUIWidgets/Assets/Scripts/ChatPage.cs
  6. 36
      AwesomeUIWidgets/Assets/Scripts/ChatPanelDemo.cs
  7. 99
      AwesomeUIWidgets/Assets/Scripts/ChatPanelManager.cs
  8. 144
      AwesomeUIWidgets/Assets/Scripts/DateAndTimePicker.cs
  9. 74
      AwesomeUIWidgets/Assets/Scripts/Utils/FlyCamera.cs
  10. 64
      AwesomeUIWidgets/Assets/Scripts/chat_l10n.cs
  11. 487
      AwesomeUIWidgets/Assets/Scripts/chat_theme.cs
  12. 228
      AwesomeUIWidgets/Assets/Scripts/utils.cs
  13. 465
      AwesomeUIWidgets/Assets/StreamingAssets/MaterialIcons-Regular.ttf
  14. 132
      AwesomeUIWidgets/Assets/Resources/assets/messages.json
  15. 250
      AwesomeUIWidgets/Assets/Resources/wallpaper.jpg
  16. 525
      AwesomeUIWidgets/Assets/Scripts/AdditionalWidgets/LinkPreview/linkpreview.cs
  17. 140
      AwesomeUIWidgets/Assets/Scripts/AdditionalWidgets/LinkPreview/url_linkifier.cs
  18. 241
      AwesomeUIWidgets/Assets/Scripts/AdditionalWidgets/circleavatar.cs
  19. 135
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Message.cs
  20. 138
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Room.cs
  21. 147
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/User.cs
  22. 49
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Util.cs
  23. 134
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/preview_data.cs
  24. 156
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/file_message.cs
  25. 164
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/image_message.cs
  26. 62
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/partial_file.cs
  27. 70
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/partial_image.cs
  28. 36
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/partial_text.cs
  29. 131
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/text_message.cs
  30. 102
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/unsupported_message.cs
  31. 97
      AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/custom_message.cs
  32. 135
      AwesomeUIWidgets/Assets/Scripts/Conditional/conditional.cs
  33. 98
      AwesomeUIWidgets/Assets/Scripts/Equatable/equatable.cs
  34. 44
      AwesomeUIWidgets/Assets/Scripts/Equatable/equatable_config.cs
  35. 73
      AwesomeUIWidgets/Assets/Scripts/Equatable/equatable_mixin.cs
  36. 113
      AwesomeUIWidgets/Assets/Scripts/Equatable/equatable_utils.cs
  37. 20
      AwesomeUIWidgets/Assets/Scripts/Models/date_header.cs
  38. 25
      AwesomeUIWidgets/Assets/Scripts/Models/message_spacer.cs
  39. 27
      AwesomeUIWidgets/Assets/Scripts/Models/preview_image.cs
  40. 55
      AwesomeUIWidgets/Assets/Scripts/Widgets/attachment_button.cs
  41. 299
      AwesomeUIWidgets/Assets/Scripts/Widgets/chat_list.cs
  42. 33
      AwesomeUIWidgets/Assets/Scripts/Widgets/inherited_l10n.cs
  43. 33
      AwesomeUIWidgets/Assets/Scripts/Widgets/inherited_theme.cs
  44. 33
      AwesomeUIWidgets/Assets/Scripts/Widgets/inherited_user.cs
  45. 272
      AwesomeUIWidgets/Assets/Scripts/Widgets/message.cs
  46. 45
      AwesomeUIWidgets/Assets/Scripts/Widgets/send_button.cs
  47. 156
      AwesomeUIWidgets/Assets/Scripts/Widgets/text_message.cs
  48. 455
      AwesomeUIWidgets/Assets/Scripts/Widgets/chat.cs
  49. 260
      AwesomeUIWidgets/Assets/Scripts/Widgets/input.cs
  50. 78
      AwesomeUIWidgets/Assets/Smartphone/StandardColorMask.shader
  51. 82
      AwesomeUIWidgets/Assets/Smartphone/screen.mat
  52. 102
      AwesomeUIWidgets/Assets/Smartphone/smartphone.FBX
  53. 101
      AwesomeUIWidgets/Assets/Smartphone/smartphone.mat
  54. 82
      AwesomeUIWidgets/Assets/Smartphone/smartphone.prefab
  55. 664
      AwesomeUIWidgets/Assets/Smartphone/smartphone_d.jpg
  56. 702
      AwesomeUIWidgets/Assets/Smartphone/smartphone_mask.jpg
  57. 1001
      AwesomeUIWidgets/Assets/Smartphone/smartphone_screen.jpg
  58. 257
      AwesomeUIWidgets/Assets/Smartphone/demo.unity
  59. 4
      AwesomeUIWidgets/Assets/StreamingAssets/assets/icon-attachment.png
  60. 3
      AwesomeUIWidgets/Assets/StreamingAssets/assets/icon-seen.png
  61. 4
      AwesomeUIWidgets/Assets/StreamingAssets/assets/icon-send.png

864
AwesomeUIWidgets/Assets/Scenes/ShowRoom.unity
文件差异内容过多而无法显示
查看文件

99
AwesomeUIWidgets/Assets/Scenes/SimpleWorldSpaceUI.unity


m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 705507994}
m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}
m_IndirectSpecularColor: {r: 0.44657826, g: 0.49641263, b: 0.57481676, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:

m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 169, y: -153}
m_AnchoredPosition: {x: 94, y: -153}
m_SizeDelta: {x: 300, y: 400}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &373829884

m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Texture: {fileID: 1803575975}
m_Texture: {fileID: 492280231}
m_UVRect:
serializedVersion: 2
x: 0

m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 373829882}
m_CullTransparentMesh: 0
--- !u!28 &492280231
Texture2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_ImageContentsHash:
serializedVersion: 2
Hash: 00000000000000000000000000000000
m_ForcedFallbackFormat: 4
m_DownscaleFallback: 0
serializedVersion: 3
m_Width: 0
m_Height: 0
m_CompleteImageSize: 0
m_TextureFormat: 0
m_MipCount: 1
m_IsReadable: 1
m_IgnoreMasterTextureLimit: 0
m_IsPreProcessed: 0
m_StreamingMipmaps: 0
m_StreamingMipmapsPriority: 0
m_AlphaIsTransparency: 0
m_ImageCount: 0
m_TextureDimension: 2
m_TextureSettings:
serializedVersion: 2
m_FilterMode: 1
m_Aniso: 1
m_MipBias: 0
m_WrapU: 0
m_WrapV: 0
m_WrapW: 0
m_LightmapFormat: 0
m_ColorSpace: 0
image data: 0
_typelessdata:
m_StreamData:
offset: 0
size: 0
path:
m_OriginalWidth: 0
m_OriginalHeight: 0
m_OriginalAssetGuid: 00000000000000000000000000000000
--- !u!1 &705507993
GameObject:
m_ObjectHideFlags: 0

m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!28 &1803575975
Texture2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_ImageContentsHash:
serializedVersion: 2
Hash: 00000000000000000000000000000000
m_ForcedFallbackFormat: 4
m_DownscaleFallback: 0
serializedVersion: 2
m_Width: 0
m_Height: 0
m_CompleteImageSize: 0
m_TextureFormat: 0
m_MipCount: 1
m_IsReadable: 1
m_IgnoreMasterTextureLimit: 0
m_IsPreProcessed: 0
m_StreamingMipmaps: 0
m_StreamingMipmapsPriority: 0
m_AlphaIsTransparency: 0
m_ImageCount: 0
m_TextureDimension: 2
m_TextureSettings:
serializedVersion: 2
m_FilterMode: 1
m_Aniso: 1
m_MipBias: 0
m_WrapU: 0
m_WrapV: 0
m_WrapW: 0
m_LightmapFormat: 0
m_ColorSpace: 0
image data: 0
_typelessdata:
m_StreamData:
offset: 0
size: 0
path:
--- !u!1 &1882612338
GameObject:
m_ObjectHideFlags: 0

m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2074331820}
m_LocalRotation: {x: 0, y: -0.3507795, z: 0, w: 0.9364581}
m_LocalPosition: {x: -174, y: 50.01288, z: 432}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -80, y: -1, z: 229}
m_LocalEulerAnglesHint: {x: 0, y: -41.07, z: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

3
AwesomeUIWidgets/Assets/Scripts/CountDemo.cs


public override Widget build(BuildContext context)
{
return new CupertinoApp(
home: new CounterApp()
home: new ChatPage()
);
}
}

675
AwesomeUIWidgets/Assets/Scenes/ChatRoomScene.unity


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 0
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0.44657826, g: 0.49641263, b: 0.57481676, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 11
m_GIWorkflowMode: 1
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings:
serializedVersion: 12
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_ExtractAmbientOcclusion: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 1
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 2
m_BakeBackend: 1
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 512
m_PVRBounces: 2
m_PVREnvironmentSampleCount: 256
m_PVREnvironmentReferencePointCount: 2048
m_PVRFilteringMode: 1
m_PVRDenoiserTypeDirect: 1
m_PVRDenoiserTypeIndirect: 1
m_PVRDenoiserTypeAO: 1
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVREnvironmentMIS: 1
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_LightProbeSampleCountMultiplier: 4
m_LightingDataAsset: {fileID: 0}
m_UseShadowmask: 1
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 2
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &1125948832
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1125948836}
- component: {fileID: 1125948835}
- component: {fileID: 1125948834}
- component: {fileID: 1125948833}
m_Layer: 0
m_Name: Cube
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!65 &1125948833
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1125948832}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 0
serializedVersion: 2
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &1125948834
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1125948832}
m_Enabled: 0
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!33 &1125948835
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1125948832}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &1125948836
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1125948832}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -80, y: -1.166, z: 229}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1315574209}
m_Father: {fileID: 0}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1252940034
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1252940037}
- component: {fileID: 1252940036}
- component: {fileID: 1252940035}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!81 &1252940035
AudioListener:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1252940034}
m_Enabled: 1
--- !u!20 &1252940036
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1252940034}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_FocalLength: 50
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 60
orthographic: 0
orthographic size: 5
m_Depth: -1
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &1252940037
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1252940034}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 1, z: -10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1315574208
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1315574209}
- component: {fileID: 1315574212}
- component: {fileID: 1315574211}
- component: {fileID: 1315574210}
m_Layer: 5
m_Name: Canvas
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1315574209
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1315574208}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 232}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1558042840}
m_Father: {fileID: 1125948836}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: -46, y: 152}
m_SizeDelta: {x: 398, y: 784}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1315574210
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1315574208}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreReversedGraphics: 1
m_BlockingObjects: 0
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
--- !u!114 &1315574211
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1315574208}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_UiScaleMode: 0
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 800, y: 600}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
--- !u!223 &1315574212
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1315574208}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 2
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 0
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_AdditionalShaderChannelsFlag: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
--- !u!1 &1511805122
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1511805125}
- component: {fileID: 1511805124}
- component: {fileID: 1511805123}
m_Layer: 0
m_Name: EventSystem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1511805123
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1511805122}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical
m_SubmitButton: Submit
m_CancelButton: Cancel
m_InputActionsPerSecond: 10
m_RepeatDelay: 0.5
m_ForceModuleActive: 0
--- !u!114 &1511805124
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1511805122}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_FirstSelected: {fileID: 0}
m_sendNavigationEvents: 1
m_DragThreshold: 10
--- !u!4 &1511805125
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1511805122}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1542210717
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1542210719}
- component: {fileID: 1542210718}
m_Layer: 0
m_Name: Directional Light
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!108 &1542210718
Light:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1542210717}
m_Enabled: 1
serializedVersion: 10
m_Type: 1
m_Shape: 0
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
m_Intensity: 1
m_Range: 10
m_SpotAngle: 30
m_InnerSpotAngle: 21.80208
m_CookieSize: 10
m_Shadows:
m_Type: 2
m_Resolution: -1
m_CustomResolution: -1
m_Strength: 1
m_Bias: 0.05
m_NormalBias: 0.4
m_NearPlane: 0.2
m_CullingMatrixOverride:
e00: 1
e01: 0
e02: 0
e03: 0
e10: 0
e11: 1
e12: 0
e13: 0
e20: 0
e21: 0
e22: 1
e23: 0
e30: 0
e31: 0
e32: 0
e33: 1
m_UseCullingMatrixOverride: 0
m_Cookie: {fileID: 0}
m_DrawHalo: 0
m_Flare: {fileID: 0}
m_RenderMode: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingLayerMask: 1
m_Lightmapping: 4
m_LightShadowCasterMode: 0
m_AreaSize: {x: 1, y: 1}
m_BounceIntensity: 1
m_ColorTemperature: 6570
m_UseColorTemperature: 0
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
m_UseBoundingSphereOverride: 0
m_ShadowRadius: 0
m_ShadowAngle: 0
--- !u!4 &1542210719
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1542210717}
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
m_LocalPosition: {x: 0, y: 3, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
--- !u!1 &1558042839
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1558042840}
- component: {fileID: 1558042842}
- component: {fileID: 1558042841}
m_Layer: 5
m_Name: RawImage
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1558042840
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1558042839}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -125}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1315574209}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 169, y: -153}
m_SizeDelta: {x: 300, y: 400}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1558042841
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1558042839}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 95cfb90e363891b40b68575b9bf6b7dc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Texture: {fileID: 1916630145}
m_UVRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
hardwareAntiAliasing: 0
fonts: []
--- !u!222 &1558042842
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1558042839}
m_CullTransparentMesh: 0
--- !u!28 &1916630145
Texture2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_ImageContentsHash:
serializedVersion: 2
Hash: 00000000000000000000000000000000
m_ForcedFallbackFormat: 4
m_DownscaleFallback: 0
serializedVersion: 3
m_Width: 0
m_Height: 0
m_CompleteImageSize: 0
m_TextureFormat: 0
m_MipCount: 1
m_IsReadable: 1
m_IgnoreMasterTextureLimit: 0
m_IsPreProcessed: 0
m_StreamingMipmaps: 0
m_StreamingMipmapsPriority: 0
m_AlphaIsTransparency: 0
m_ImageCount: 0
m_TextureDimension: 2
m_TextureSettings:
serializedVersion: 2
m_FilterMode: 1
m_Aniso: 1
m_MipBias: 0
m_WrapU: 0
m_WrapV: 0
m_WrapW: 0
m_LightmapFormat: 0
m_ColorSpace: 0
image data: 0
_typelessdata:
m_StreamData:
offset: 0
size: 0
path:
m_OriginalWidth: 0
m_OriginalHeight: 0
m_OriginalAssetGuid: 00000000000000000000000000000000

367
AwesomeUIWidgets/Assets/Scripts/ChatPage.cs


using System;
using System.Collections.Generic;
using System.Linq;
using ChatComponents;
using uiwidgets;
using Unity.UIWidgets.async;
using Unity.UIWidgets.cupertino;
using Unity.UIWidgets.engine;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.rendering;
using Unity.UIWidgets.widgets;
using UnityEditor.Build.Content;
using UnityEngine;
using Color = Unity.UIWidgets.ui.Color;
using Random = System.Random;
using TextStyle = Unity.UIWidgets.ui.TextStyle;
namespace UIWidgetsSample
{
public class ChatRoomDemo : UIWidgetsPanel
{
protected void OnEnable()
{
base.OnEnable();
}
protected override void main()
{
ui_.runApp(new MyApp());
}
class MyApp : StatelessWidget
{
public override Widget build(BuildContext context)
{
return new CupertinoApp(
home: new DateAndTimePickerWidget()
);
}
}
}
[System.Serializable]
public class ChatMessages
{
public List<ChatMessage> chatMessages;
}
[System.Serializable]
public class ChatMessage
{
public ChatUser author;
public int createdAt;
public string id;
public string status;
public string text;
public string type;
}
[System.Serializable]
public class ChatUser
{
public string firstName;
public string id;
public string imageUrl;
}
public class ChatPage : StatefulWidget
{
public ChatPage(Key key = null) : base(key)
{
}
public override State createState()
{
return new _ChatPageState();
}
}
public class _ChatPageState : State<ChatPage>
{
public readonly ChatComponents.User _user = new ChatComponents.User("06c33e8b-e835-4736-80f4-63f44b66666c");
private List<ChatComponents.Message> _messages = new List<ChatComponents.Message>();
public int _page = 0;
public override void initState()
{
base.initState();
_loadMessages();
}
private void _addMessage(ChatComponents.Message message)
{
setState(() =>
{
_messages.Insert(0, message);
});
}
private void _handleAtachmentPressed()
{
material_.showModalBottomSheet<object>(
context,
context =>
{
return new SizedBox(
height: 144,
child: new Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: new List<Widget>
{
new CupertinoButton(
onPressed: () =>
{
Navigator.pop(context);
//_handleImageSelection();
},
child: new Align(
alignment: Alignment.centerLeft,
child: new Text("Photo")
)
),
new CupertinoButton(
onPressed: () =>
{
Navigator.pop(context);
//_handleFileSelection();
},
child:
new Align(
alignment: Alignment.centerLeft,
child: new Text("File")
)
),
new CupertinoButton(
onPressed: () => Navigator.pop(context),
child: new Align(
alignment: Alignment.centerLeft,
child: new Text("Cancel")
)
)
}
)
);
}
);
}
/* private void _handleFileSelection()
{
var result = FilePicker.platform.pickFiles(
type: FileType.any
);
if (result != null)
{
var message = new ChatComponents.FileMessage(
_user,
createdAt: DateTime.Now.Millisecond,
name: result.files.single.name,
id: Uuid().v4(),
mimeType:
lookupMimeType(result.files.single.path ?? ""),
size:
result.files.single.size,
uri:
result.files.single.path ?? ""
);
_addMessage(message);
}
}*/
/* private void _handleImageSelection()
{
var result = new ImagePicker().getImage(
imageQuality: 70,
maxWidth: 1440,
source: ImageSource.gallery
);
if (result != null)
{
var bytes = result.readAsBytes();
var image = decodeImageFromList(bytes);
var name = result.path.split("/").last;
var message = new ChatComponents.ImageMessage(
_user,
createdAt: DateTime.Now.Millisecond,
height: image.height.toDouble(),
id: Uuid().v4(),
name:
name,
size:
bytes.length,
uri:
result.path,
width:
image.width.toDouble()
);
_addMessage(message);
}
}*/
private void _handleMessageTap(ChatComponents.Message message)
{
if (message is ChatComponents.FileMessage)
//OpenFile.open(message.uri);
Debug.Log("OPEN FILE");
}
private void _handlePreviewDataFetched(
ChatComponents.TextMessage message,
ChatComponents.PreviewData previewData
)
{
var index = 0;
foreach (var element in _messages)
{
if (element.id == message.id)
{
index = _messages.IndexOf(element);
}
}
var updatedMessage = _messages[index].copyWith(previewData: previewData);
WidgetsBinding.instance?.addPostFrameCallback(_ =>
{
setState(() => { _messages[index] = updatedMessage; });
});
}
private void _handleSendPressed(ChatComponents.PartialText message)
{
var textMessage = new ChatComponents.TextMessage(
_user,
createdAt: DateTime.Now.Millisecond,
id: "b4878b96-efbc-479a-8291-474ef323aa" + _messages.Count.ToString(),
text: message.text
);
_addMessage(textMessage);
}
private Future _handleEndReached()
{
List<ChatComponents.TextMessage> messages = new List<ChatComponents.TextMessage>();
List<string> ids = new List<string>() { };
for (int i = 1; i < 10; i++)
{
ids.Add(i.ToString());
}
foreach (var id in ids)
{
messages.Add(new ChatComponents.TextMessage(
_user,
id: "b4878b96-efbc-479a-8291-474ef323a"+ _page + id,
text: id + "......"
) );
}
setState(()=> {
{
_messages.AddRange(messages);
_page = _page + 1;
}
});
return Future.value();
}
private void _loadMessages()
{
List<ChatComponents.Message> results = new List<ChatComponents.Message>();
TextAsset info = Resources.Load<TextAsset>("assets/messages");
List<ChatMessage> chatMessages = new List<ChatMessage>();
List<string> jsoninfo = info.text.Split('&').ToList();
foreach (var _info in jsoninfo)
{
var _message = JsonUtility.FromJson<ChatMessage>(_info);
chatMessages.Add(_message);
}
foreach (var _message in chatMessages)
{
results.Add( new ChatComponents.TextMessage(
author: new User(
id: _message.author.id,
firstName: _message.author.firstName,
imageUrl: _message.author.imageUrl
),
createdAt: _message.createdAt,
id: _message.id,
status: ChatRoomUtils.getStatusFromString(_message.status),
text: _message.text
)
);
}
setState(() => { _messages = results; });
}
public override Widget build(BuildContext context)
{
// return new Container(
// color: Color.fromARGB(0, 0, 0, 0),
// child: new Chat(
// messages: _messages,
// onAttachmentPressed: _handleAtachmentPressed,
// onMessageTap: _handleMessageTap,
// onPreviewDataFetched: (
// previewData,
// message) =>
// {
// _handlePreviewDataFetched(message, previewData);
// },
// onTextChanged: (_str) => { },
// onSendPressed: _handleSendPressed,
// onEndReached: _handleEndReached,
// //onEndReachedThreshold: 0.65f,
// user: _user
// )
// );
return new MaterialApp(
home: new Scaffold(
backgroundColor:Color.fromARGB(0,0,0,0),
appBar: new AppBar(
backgroundColor: Color.white,
title: new IconButton(
icon: new Icon(Icons.arrow_back, color: Color.black),
onPressed: () => { ChatPanelManager.Switch(); },
padding: EdgeInsets.zero
)
),
body: new Container(
child: new Chat(
messages: _messages,
onAttachmentPressed: _handleAtachmentPressed,
onMessageTap: _handleMessageTap,
onPreviewDataFetched: (
previewData,
message) =>
{
_handlePreviewDataFetched(message, previewData);
},
onTextChanged: (_str) => { },
onSendPressed: _handleSendPressed,
onEndReached: _handleEndReached,
//onEndReachedThreshold: 0.65f,
user: _user
)
)
)
);
}
}
}

36
AwesomeUIWidgets/Assets/Scripts/ChatPanelDemo.cs


using System.Collections.Generic;
using uiwidgets;
using Unity.UIWidgets.cupertino;
using Unity.UIWidgets.engine;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using Text = Unity.UIWidgets.widgets.Text;
using ui_ = Unity.UIWidgets.widgets.ui_;
using TextStyle = Unity.UIWidgets.painting.TextStyle;
namespace UIWidgetsSample
{
public class ChatPanelDemo : UIWidgetsPanel
{
protected override void onEnable()
{
base.onEnable();
AddFont("Material Icons", new List<string> {"MaterialIcons-Regular.ttf"}, new List<int> {0});
}
protected override void main()
{
ui_.runApp(new ChatRoomApp());
}
class ChatRoomApp : StatelessWidget
{
public override Widget build(BuildContext context)
{
return new CupertinoApp(
home: new ChatPage()
);
}
}
}
}

99
AwesomeUIWidgets/Assets/Scripts/ChatPanelManager.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ChatPanelManager : MonoBehaviour
{
public RectTransform transformPosition;
public RectTransform transformedPosition;
public RectTransform canvasPosition;
public RectTransform imagePosition;
public Vector2 standerdImageSize;
public GameObject panel;
public GameObject dateAndTimePicker;
private static bool isLerp = false;
private static bool isOpenPanel = false;
public float speed = 5.0f;
private static bool isFirstTime = true;
private bool wait = false;
void Update()
{
if(Input.GetKeyDown(KeyCode.Tab))
{
Switch();
}
if (isLerp)
{
if (isOpenPanel)
{
canvasPosition.anchoredPosition3D = Vector3.Lerp(canvasPosition.anchoredPosition3D,
transformedPosition.anchoredPosition3D, speed * Time.deltaTime);
canvasPosition.localRotation = Quaternion.Lerp(canvasPosition.localRotation,
transformedPosition.localRotation, speed * Time.deltaTime);
canvasPosition.localScale = Vector3.Lerp(canvasPosition.localScale, transformedPosition.localScale,
speed * Time.deltaTime);
if(Vector3.Distance(canvasPosition.anchoredPosition3D,transformedPosition.anchoredPosition3D) < 0.1f)
{
isLerp = false;
canvasPosition.GetComponent<Canvas>().renderMode = RenderMode.ScreenSpaceOverlay;
//canvasPosition.GetComponent<Canvas>().worldCamera = null;
imagePosition.sizeDelta = standerdImageSize;
panel.SetActive(false);
dateAndTimePicker.SetActive(false);
}
}
else
{
if (isFirstTime)
{
canvasPosition.GetComponent<Canvas>().renderMode = RenderMode.WorldSpace;
canvasPosition.GetComponent<Canvas>().worldCamera = Camera.main;
canvasPosition.anchoredPosition3D = transformedPosition.anchoredPosition3D;
canvasPosition.localRotation = transformedPosition.localRotation;
canvasPosition.localScale = transformedPosition.localScale;
panel.SetActive(true);
dateAndTimePicker.SetActive(true);
isFirstTime = false;
wait = true;
StartCoroutine(SkipForAFrame());
}
if (!wait)
{
canvasPosition.anchoredPosition3D = Vector3.Lerp(canvasPosition.anchoredPosition3D,
transformPosition.anchoredPosition3D, speed * Time.deltaTime);
canvasPosition.localRotation = Quaternion.Lerp(canvasPosition.localRotation,
transformPosition.localRotation, speed * Time.deltaTime);
canvasPosition.localScale = Vector3.Lerp(canvasPosition.localScale, transformPosition.localScale,
speed * Time.deltaTime);
if(Vector3.Distance(canvasPosition.anchoredPosition3D, transformedPosition.anchoredPosition3D)<0.1f)
{
isLerp = false;
}
}
}
}
}
IEnumerator SkipForAFrame()
{
yield return new WaitForSeconds(0.1f);
wait = false;
}
public static void Switch()
{
isLerp = true;
isOpenPanel = !isOpenPanel;
isFirstTime = true;
}
}

144
AwesomeUIWidgets/Assets/Scripts/DateAndTimePicker.cs


using System;
using System.Collections.Generic;
using uiwidgets;
using Unity.UIWidgets.cupertino;
using Unity.UIWidgets.engine;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.rendering;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using UnityEngine;
using Color = Unity.UIWidgets.ui.Color;
using Text = Unity.UIWidgets.widgets.Text;
using ui_ = Unity.UIWidgets.widgets.ui_;
using TextStyle = Unity.UIWidgets.painting.TextStyle;
namespace UIWidgetsSample
{
public class DateAndTimePicker : UIWidgetsPanel
{
protected void OnEnable()
{
base.OnEnable();
}
protected override void main()
{
ui_.runApp(new MyApp());
}
class MyApp : StatelessWidget
{
public override Widget build(BuildContext context)
{
return new CupertinoApp(
home: new DateAndTimePickerWidget()
);
}
}
}
public class DateAndTimePickerWidget : StatefulWidget {
public override State createState() {
return new DateAndTimePickerWidgetState();
}
}
public class DateAndTimePickerWidgetState : State<DateAndTimePickerWidget>
{
Widget _buildMenu(List<Widget> children) {
return new Container(
decoration: new BoxDecoration(
color: CupertinoTheme.of(this.context).scaffoldBackgroundColor,
border: new Border(
top: new BorderSide(color: new Color(0xFFBCBBC1), width: 0.0f),
bottom: new BorderSide(color: new Color(0xFFBCBBC1), width: 0.0f)
)
),
height: 44.0f,
child: new Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0f),
child: new SafeArea(
top: false,
bottom: false,
child: new Row(
//mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: children
)
)
)
);
}
DateTime dateTime = DateTime.Now;
Widget _buildBottomPicker(Widget picker) {
return new Container(
height: 216f,
width : 500f,
padding: EdgeInsets.only(top: 6.0f),
color: Colors.white,
child: new DefaultTextStyle(
style: new TextStyle(
color: Colors.red,
fontSize: 12.0f
),
child: new GestureDetector(
// Blocks taps from propagating to the modal sheet and popping.
onTap: () => { },
child: new SafeArea(
top: false,
child: picker
)
)
)
);
}
Widget _buildDateAndTimePicker(BuildContext context) {
return new GestureDetector(
onTap: () => {
CupertinoRouteUtils.showCupertinoModalPopup(
context: context,
builder: (BuildContext _context) => {
return this._buildBottomPicker(
new CupertinoTheme(
data: new CupertinoThemeData(
textTheme: new CupertinoTextThemeData(
dateTimePickerTextStyle: new TextStyle(
fontSize: 16,
color: Color.fromARGB(255, 226, 255, 255)
)
)
),
child :new CupertinoDatePicker(
backgroundColor: Color.fromARGB(180, 0, 123, 255),
mode: CupertinoDatePickerMode.dateAndTime,
initialDateTime: this.dateTime,
onDateTimeChanged: (DateTime newDateTime) => {
this.setState(() => this.dateTime = newDateTime);
}
)
));
}
);
},
child: new Text(
this.dateTime.ToString("MMMM dd, yyyy h:mm tt"),
style: new TextStyle(color: Colors.white)
)
);
}
public override Widget build(BuildContext context)
{
return new Container(
color : Color.fromARGB(180, 0, 123, 255),
child : this._buildDateAndTimePicker(context)
);
}
}
}

74
AwesomeUIWidgets/Assets/Scripts/Utils/FlyCamera.cs


using UnityEngine;
using System.Collections;
namespace UIWidgetsSample.Utils
{
public class FlyCamera : MonoBehaviour {
/*
Writen by Windexglow 11-13-10. Use it, edit it, steal it I don't care.
Converted to C# 27-02-13 - no credit wanted.
Simple flycam I made, since I couldn't find any others made public.
Made simple to use (drag and drop, done) for regular keyboard layout
wasd : basic movement
shift : Makes camera accelerate
space : Moves camera on X and Z axis only. So camera doesn't gain any height*/
float mainSpeed = 10.0f; //regular speed
float shiftAdd = 25.0f; //multiplied by how long shift is held. Basically running
float maxShift = 100.0f; //Maximum speed when holdin gshift
float camSens = 0.025f; //How sensitive it with mouse
private Vector3 lastMouse = new Vector3(255, 255, 255); //kind of in the middle of the screen, rather than at the top (play)
private float totalRun= 1.0f;
void Update () {
lastMouse = UnityEngine.Input.mousePosition - lastMouse ;
lastMouse = new Vector3(-lastMouse.y * camSens, lastMouse.x * camSens, 0 );
lastMouse = new Vector3(transform.eulerAngles.x + lastMouse.x , transform.eulerAngles.y + lastMouse.y, 0);
transform.eulerAngles = lastMouse;
lastMouse = UnityEngine.Input.mousePosition;
//Mouse camera angle done.
//Keyboard commands
float f = 0.0f;
Vector3 p = GetBaseInput();
if (p.sqrMagnitude > 0){ // only move while a direction key is pressed
if (UnityEngine.Input.GetKey (KeyCode.LeftShift)){
totalRun += Time.deltaTime;
p = p * totalRun * shiftAdd;
p.x = Mathf.Clamp(p.x, -maxShift, maxShift);
p.y = Mathf.Clamp(p.y, -maxShift, maxShift);
p.z = Mathf.Clamp(p.z, -maxShift, maxShift);
} else {
totalRun = Mathf.Clamp(totalRun * 0.5f, 1f, 1000f);
p = p * mainSpeed;
}
p = p * Time.deltaTime;
Vector3 newPosition = transform.position;
transform.Translate(p);
newPosition.x = transform.position.x;
newPosition.z = transform.position.z;
transform.position = newPosition;
}
}
private Vector3 GetBaseInput() { //returns the basic values, if it's 0 than it's not active.
Vector3 p_Velocity = new Vector3();
if (UnityEngine.Input.GetKey (KeyCode.W)){
p_Velocity += new Vector3(0, 0 , 1);
}
if (UnityEngine.Input.GetKey (KeyCode.S)){
p_Velocity += new Vector3(0, 0, -1);
}
if (UnityEngine.Input.GetKey (KeyCode.A)){
p_Velocity += new Vector3(-1, 0, 0);
}
if (UnityEngine.Input.GetKey (KeyCode.D)){
p_Velocity += new Vector3(1, 0, 0);
}
return p_Velocity;
}
}
}

64
AwesomeUIWidgets/Assets/Scripts/chat_l10n.cs


using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Unity.UIWidgets.foundation;
namespace UIWidgetsSample
{
public abstract class ChatL10n
{
/// Accessibility label (hint) for the attachment button
public readonly string attachmentButtonAccessibilityLabel;
/// Placeholder when there are no messages
public readonly string emptyChatPlaceholder;
/// Accessibility label (hint) for the tap action on file message
public readonly string fileButtonAccessibilityLabel;
/// Placeholder for the text field
public readonly string inputPlaceholder;
/// Accessibility label (hint) for the send button
public readonly string sendButtonAccessibilityLabel;
/// Creates a new chat l10n based on provided copy
public ChatL10n(
string attachmentButtonAccessibilityLabel = null,
string emptyChatPlaceholder = null,
string fileButtonAccessibilityLabel = null,
string inputPlaceholder = null,
string sendButtonAccessibilityLabel = null
)
{
this.inputPlaceholder = inputPlaceholder;
this.attachmentButtonAccessibilityLabel = attachmentButtonAccessibilityLabel;
this.emptyChatPlaceholder = emptyChatPlaceholder;
this.fileButtonAccessibilityLabel = fileButtonAccessibilityLabel;
this.sendButtonAccessibilityLabel = sendButtonAccessibilityLabel;
}
}
/// English l10n which extends [ChatL10n]
public class ChatL10nEn : ChatL10n
{
/// Creates English l10n. Use this constructor if you want to
/// override only a couple of variables, otherwise create a new class
/// which extends [ChatL10n]
public ChatL10nEn(
string attachmentButtonAccessibilityLabel = "Send media",
string emptyChatPlaceholder = "No messages here yet",
string fileButtonAccessibilityLabel = "File",
string inputPlaceholder = "Message",
string sendButtonAccessibilityLabel = "Send"
) : base(
attachmentButtonAccessibilityLabel,
emptyChatPlaceholder,
fileButtonAccessibilityLabel,
inputPlaceholder,
sendButtonAccessibilityLabel
)
{
}
}
}

487
AwesomeUIWidgets/Assets/Scripts/chat_theme.cs


using System.Collections.Generic;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using TextStyle =Unity.UIWidgets.painting.TextStyle;
namespace UIWidgetsSample
{
public class ChatThemeUtils
{
public static List<Color> COLORS = new List<Color>
{
new Color(0xffff6767),
new Color(0xff66e0da),
new Color(0xfff5a2d9),
new Color(0xfff0c722),
new Color(0xff6a85e5),
new Color(0xfffd9a6f),
new Color(0xff92db6e),
new Color(0xff73b8e5),
new Color(0xfffd7590),
new Color(0xffc78ae5)
};
/// Dark
public static Color DARK = new Color(0xff1f1c38);
/// Error
public static Color ERROR = new Color(0xffff6767);
/// N0
public static Color NEUTRAL_0 = new Color(0xff1d1c21);
/// N2
public static Color NEUTRAL_2 = new Color(0xff9e9cab);
/// N7
public static Color NEUTRAL_7 = new Color(0xffffffff);
/// N7 with opacity
public static Color NEUTRAL_7_WITH_OPACITY = new Color(0x80ffffff);
/// Primary
public static Color PRIMARY = new Color(0xff6f61e8);
/// Secondary
public static Color SECONDARY = new Color(0xfff5f5f7);
/// Secondary dark
public static Color SECONDARY_DARK = new Color(0xff2b2250);
public static float ratio = 0.5f;
}
/// Base chat theme containing all required variables to make a theme.
/// Extend this class if you want to create a custom theme.
public abstract class ChatTheme
{
/// Icon for select attachment button
public readonly Widget attachmentButtonIcon;
/// Used as a background color of a chat widget
public readonly Color backgroundColor;
/// Text style of the date dividers
public readonly Unity.UIWidgets.painting.TextStyle dateDividerTextStyle;
/// Icon for message's `delivered` status. For the best look use size of 16.
public readonly Widget deliveredIcon;
/// Icon inside file message
public readonly Widget documentIcon;
/// Text style of the empty chat placeholder
public readonly TextStyle emptyChatPlaceholderTextStyle;
/// Color to indicate something bad happened (usually - shades of red)
public readonly Color errorColor;
/// Icon for message's `error` status. For the best look use size of 16.
public readonly Widget errorIcon;
/// Color of the bottom bar where text field is
public readonly Color inputBackgroundColor;
/// Top border radius of the bottom bar where text field is
public readonly BorderRadius inputBorderRadius;
/// Color of the text field's text and attachment/send buttons
public readonly Color inputTextColor;
/// Text style of the message input. To change the color use [inputTextColor].
public readonly TextStyle inputTextStyle;
/// Border radius of message container
public readonly float messageBorderRadius;
/// Primary color of the chat used as a background of sent messages
/// and statuses
public readonly Color primaryColor;
/// Body text style used for displaying text on different types
/// of received messages
public readonly TextStyle receivedMessageBodyTextStyle;
/// Caption text style used for displaying secondary info (e.g. file size)
/// on different types of received messages
public readonly TextStyle receivedMessageCaptionTextStyle;
/// Color of the document icon on received messages. Has no effect when
/// [documentIcon] is used.
public readonly Color receivedMessageDocumentIconColor;
/// Text style used for displaying link description on received messages
public readonly TextStyle receivedMessageLinkDescriptionTextStyle;
/// Text style used for displaying link title on received messages
public readonly TextStyle receivedMessageLinkTitleTextStyle;
/// Secondary color, used as a background of received messages
public readonly Color secondaryColor;
/// Icon for message's `seen` status. For the best look use size of 16.
public readonly Widget seenIcon;
/// Icon for send button
public readonly Widget sendButtonIcon;
/// Body text style used for displaying text on different types
/// of sent messages
public readonly TextStyle sentMessageBodyTextStyle;
/// Caption text style used for displaying secondary info (e.g. file size)
/// on different types of sent messages
public readonly TextStyle sentMessageCaptionTextStyle;
/// Color of the document icon on sent messages. Has no effect when
/// [documentIcon] is used.
public readonly Color sentMessageDocumentIconColor;
/// Text style used for displaying link description on sent messages
public readonly TextStyle sentMessageLinkDescriptionTextStyle;
/// Text style used for displaying link title on sent messages
public readonly TextStyle sentMessageLinkTitleTextStyle;
/// Colors used as backgrounds for user avatars and corresponded user names.
/// Calculated based on a user ID, so unique across the whole app.
public readonly List<Color> userAvatarNameColors;
/// Text style used for displaying initials on user avatar if no
/// image is provided
public readonly TextStyle userAvatarTextStyle;
/// User names text style. Color will be overwritten with [userAvatarNameColors].
public readonly TextStyle userNameTextStyle;
/// Creates a new chat theme based on provided colors and text styles.
public ChatTheme(
Widget attachmentButtonIcon,
Color backgroundColor,
TextStyle dateDividerTextStyle,
Widget deliveredIcon,
Widget documentIcon,
TextStyle emptyChatPlaceholderTextStyle,
Color errorColor,
Widget errorIcon,
Color inputBackgroundColor,
BorderRadius inputBorderRadius,
TextStyle inputTextStyle,
Color inputTextColor,
float messageBorderRadius,
Color primaryColor,
TextStyle receivedMessageBodyTextStyle,
TextStyle receivedMessageCaptionTextStyle,
Color receivedMessageDocumentIconColor,
TextStyle receivedMessageLinkDescriptionTextStyle,
TextStyle receivedMessageLinkTitleTextStyle,
Color secondaryColor,
Widget seenIcon,
Widget sendButtonIcon,
TextStyle sentMessageBodyTextStyle,
TextStyle sentMessageCaptionTextStyle,
Color sentMessageDocumentIconColor,
TextStyle sentMessageLinkDescriptionTextStyle,
TextStyle sentMessageLinkTitleTextStyle,
List<Color> userAvatarNameColors,
TextStyle userAvatarTextStyle,
TextStyle userNameTextStyle
)
{
this.attachmentButtonIcon = attachmentButtonIcon;
this.backgroundColor = backgroundColor;
this.dateDividerTextStyle = dateDividerTextStyle;
this.deliveredIcon = deliveredIcon;
this.documentIcon = documentIcon;
this.emptyChatPlaceholderTextStyle = emptyChatPlaceholderTextStyle;
this.errorColor = errorColor;
this.errorIcon = errorIcon;
this.inputBackgroundColor = inputBackgroundColor;
this.inputBorderRadius = inputBorderRadius;
this.inputTextStyle = inputTextStyle;
this.inputTextColor = inputTextColor;
this.messageBorderRadius = messageBorderRadius;
this.primaryColor = primaryColor;
this.receivedMessageBodyTextStyle = receivedMessageBodyTextStyle;
this.receivedMessageCaptionTextStyle = receivedMessageCaptionTextStyle;
this.receivedMessageDocumentIconColor = receivedMessageDocumentIconColor;
this.receivedMessageLinkDescriptionTextStyle = receivedMessageLinkDescriptionTextStyle;
this.receivedMessageLinkTitleTextStyle = receivedMessageLinkTitleTextStyle;
this.secondaryColor = secondaryColor;
this.seenIcon = seenIcon;
this.sendButtonIcon = sendButtonIcon;
this.sentMessageBodyTextStyle = sentMessageBodyTextStyle;
this.sentMessageCaptionTextStyle = sentMessageCaptionTextStyle;
this.sentMessageDocumentIconColor = sentMessageDocumentIconColor;
this.sentMessageLinkDescriptionTextStyle = sentMessageLinkDescriptionTextStyle;
this.sentMessageLinkTitleTextStyle = sentMessageLinkTitleTextStyle;
this.userAvatarNameColors = userAvatarNameColors;
this.userAvatarTextStyle = userAvatarTextStyle;
this.userNameTextStyle = userNameTextStyle;
}
}
/// Default chat theme which extends [ChatTheme]
internal class DefaultChatTheme : ChatTheme
{
/// Creates a default chat theme. Use this constructor if you want to
/// override only a couple of variables, otherwise create a new class
/// which extends [ChatTheme]
public DefaultChatTheme(
Widget attachmentButtonIcon =null,
Widget deliveredIcon = null,
Widget documentIcon = null,
Widget seenIcon = null,
Widget sendButtonIcon = null,
Widget errorIcon = null,
TextStyle dateDividerTextStyle = null,
TextStyle emptyChatPlaceholderTextStyle = null,
Color inputBackgroundColor = null,
BorderRadius inputBorderRadius = null,
Color inputTextColor = null,
TextStyle inputTextStyle = null,
float messageBorderRadius = 0.0f,
Color primaryColor = null,
TextStyle receivedMessageBodyTextStyle = null,
TextStyle receivedMessageCaptionTextStyle = null,
Color receivedMessageDocumentIconColor = null,
TextStyle receivedMessageLinkDescriptionTextStyle = null,
TextStyle receivedMessageLinkTitleTextStyle = null,
Color secondaryColor = null,
TextStyle sentMessageBodyTextStyle = null,
TextStyle sentMessageCaptionTextStyle = null,
Color sentMessageDocumentIconColor = null,
TextStyle sentMessageLinkDescriptionTextStyle = null,
TextStyle sentMessageLinkTitleTextStyle = null,
List<Color> userAvatarNameColors = null,
TextStyle userAvatarTextStyle = null,
TextStyle userNameTextStyle = null,
Color backgroundColor = null,
Color errorColor = null
) : base(
attachmentButtonIcon,
backgroundColor ?? ChatThemeUtils.NEUTRAL_7,
dateDividerTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_2, fontFamily: "Avenir", fontSize:ChatThemeUtils.ratio * 50,
fontWeight: FontWeight.w800, height: 1.333f)
: dateDividerTextStyle,
deliveredIcon,
documentIcon,
emptyChatPlaceholderTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_2, fontFamily: "Avenir",
fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w500, height: 1.5f)
: emptyChatPlaceholderTextStyle,
errorColor ?? ChatThemeUtils.ERROR,
errorIcon,
inputBackgroundColor ?? ChatThemeUtils.NEUTRAL_7,
inputBorderRadius == null ? BorderRadius.vertical(Radius.circular(20f)) : inputBorderRadius,
inputTextColor: inputTextColor ?? ChatThemeUtils.NEUTRAL_0,
inputTextStyle: inputTextStyle == null
? new TextStyle(fontFamily: "Avenir", fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w500, height: 1.5f)
: inputTextStyle,
messageBorderRadius: messageBorderRadius == 0.0 ? 20.0f : messageBorderRadius,
primaryColor: primaryColor ?? ChatThemeUtils.PRIMARY,
receivedMessageBodyTextStyle: receivedMessageBodyTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_0, fontFamily: "Avenir",
fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w500, height: 1.5f)
: receivedMessageBodyTextStyle,
receivedMessageCaptionTextStyle: receivedMessageCaptionTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_2, fontFamily: "Avenir",
fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w500, height: 1.333f)
: receivedMessageCaptionTextStyle,
receivedMessageDocumentIconColor: receivedMessageDocumentIconColor ?? ChatThemeUtils.PRIMARY,
receivedMessageLinkDescriptionTextStyle:
receivedMessageLinkDescriptionTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_0,
fontFamily: "Avenir", fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w400, height: 1.428f)
: receivedMessageLinkDescriptionTextStyle,
receivedMessageLinkTitleTextStyle: receivedMessageLinkTitleTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_0, fontFamily: "Avenir",
fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w800, height: 1.375f)
: receivedMessageLinkTitleTextStyle,
secondaryColor: secondaryColor ?? ChatThemeUtils.SECONDARY,
seenIcon: seenIcon,
sendButtonIcon: sendButtonIcon,
sentMessageBodyTextStyle: sentMessageBodyTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_7, fontFamily: "Avenir",
fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w500, height: 1.5f)
: sentMessageBodyTextStyle,
sentMessageCaptionTextStyle: sentMessageCaptionTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_7_WITH_OPACITY,
fontFamily: "Avenir", fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w500, height: 1.333f)
: sentMessageCaptionTextStyle,
sentMessageDocumentIconColor: sentMessageDocumentIconColor ?? ChatThemeUtils.NEUTRAL_7,
sentMessageLinkDescriptionTextStyle:
sentMessageLinkDescriptionTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_7, fontFamily: "Avenir",
fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w400, height: 1.428f)
: sentMessageLinkDescriptionTextStyle,
sentMessageLinkTitleTextStyle: sentMessageLinkTitleTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_7, fontFamily: "Avenir",
fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w800, height: 1.375f)
: sentMessageLinkTitleTextStyle,
userAvatarNameColors: userAvatarNameColors ?? ChatThemeUtils.COLORS,
userAvatarTextStyle: userAvatarTextStyle == null
? new TextStyle(color:ChatThemeUtils.NEUTRAL_7, fontFamily: "Avenir", fontSize:ChatThemeUtils.ratio * 50,
fontWeight: FontWeight.w800, height: 1.333f)
: userAvatarTextStyle,
userNameTextStyle: userNameTextStyle == null
? new TextStyle(fontFamily: "Avenir", fontSize:ChatThemeUtils.ratio * 50, fontWeight: FontWeight.w800, height: 1.333f)
: userNameTextStyle
)
{
}
}
/*
/// Dark chat theme which extends [ChatTheme]
@immutable
class DarkChatTheme extends ChatTheme {
/// Creates a dark chat theme. Use this constructor if you want to
/// override only a couple of variables, otherwise create a new class
/// which extends [ChatTheme]
const DarkChatTheme({
Widget? attachmentButtonIcon,
Color backgroundColor = DARK,
TextStyle dateDividerTextStyle = const TextStyle(
color: NEUTRAL_7,
fontFamily: 'Avenir',
fontSize: 12,
fontWeight: FontWeight.w800,
height: 1.333,
),
Widget? deliveredIcon,
Widget? documentIcon,
TextStyle emptyChatPlaceholderTextStyle = const TextStyle(
color: NEUTRAL_2,
fontFamily: 'Avenir',
fontSize: 16,
fontWeight: FontWeight.w500,
height: 1.5,
),
Color errorColor = ERROR,
Widget? errorIcon,
Color inputBackgroundColor = SECONDARY_DARK,
BorderRadius inputBorderRadius = const BorderRadius.vertical(
top: Radius.circular(20),
),
Color inputTextColor = NEUTRAL_7,
TextStyle inputTextStyle = const TextStyle(
fontFamily: 'Avenir',
fontSize: 16,
fontWeight: FontWeight.w500,
height: 1.5,
),
double messageBorderRadius = 20.0,
Color primaryColor = PRIMARY,
TextStyle receivedMessageBodyTextStyle = const TextStyle(
color: NEUTRAL_7,
fontFamily: 'Avenir',
fontSize: 16,
fontWeight: FontWeight.w500,
height: 1.5,
),
TextStyle receivedMessageCaptionTextStyle = const TextStyle(
color: NEUTRAL_7_WITH_OPACITY,
fontFamily: 'Avenir',
fontSize: 12,
fontWeight: FontWeight.w500,
height: 1.333,
),
Color receivedMessageDocumentIconColor = PRIMARY,
TextStyle receivedMessageLinkDescriptionTextStyle = const TextStyle(
color: NEUTRAL_7,
fontFamily: 'Avenir',
fontSize: 14,
fontWeight: FontWeight.w400,
height: 1.428,
),
TextStyle receivedMessageLinkTitleTextStyle = const TextStyle(
color: NEUTRAL_7,
fontFamily: 'Avenir',
fontSize: 16,
fontWeight: FontWeight.w800,
height: 1.375,
),
Color secondaryColor = SECONDARY_DARK,
Widget? seenIcon,
Widget? sendButtonIcon,
TextStyle sentMessageBodyTextStyle = const TextStyle(
color: NEUTRAL_7,
fontFamily: 'Avenir',
fontSize: 16,
fontWeight: FontWeight.w500,
height: 1.5,
),
TextStyle sentMessageCaptionTextStyle = const TextStyle(
color: NEUTRAL_7_WITH_OPACITY,
fontFamily: 'Avenir',
fontSize: 12,
fontWeight: FontWeight.w500,
height: 1.333,
),
Color sentMessageDocumentIconColor = NEUTRAL_7,
TextStyle sentMessageLinkDescriptionTextStyle = const TextStyle(
color: NEUTRAL_7,
fontFamily: 'Avenir',
fontSize: 14,
fontWeight: FontWeight.w400,
height: 1.428,
),
TextStyle sentMessageLinkTitleTextStyle = const TextStyle(
color: NEUTRAL_7,
fontFamily: 'Avenir',
fontSize: 16,
fontWeight: FontWeight.w800,
height: 1.375,
),
List<Color> userAvatarNameColors = COLORS,
TextStyle userAvatarTextStyle = const TextStyle(
color: NEUTRAL_7,
fontFamily: 'Avenir',
fontSize: 12,
fontWeight: FontWeight.w800,
height: 1.333,
),
TextStyle userNameTextStyle = const TextStyle(
fontFamily: 'Avenir',
fontSize: 12,
fontWeight: FontWeight.w800,
height: 1.333,
),
}) : super(
attachmentButtonIcon: attachmentButtonIcon,
backgroundColor: backgroundColor,
dateDividerTextStyle: dateDividerTextStyle,
deliveredIcon: deliveredIcon,
documentIcon: documentIcon,
emptyChatPlaceholderTextStyle: emptyChatPlaceholderTextStyle,
errorColor: errorColor,
errorIcon: errorIcon,
inputBackgroundColor: inputBackgroundColor,
inputBorderRadius: inputBorderRadius,
inputTextColor: inputTextColor,
inputTextStyle: inputTextStyle,
messageBorderRadius: messageBorderRadius,
primaryColor: primaryColor,
receivedMessageBodyTextStyle: receivedMessageBodyTextStyle,
receivedMessageCaptionTextStyle: receivedMessageCaptionTextStyle,
receivedMessageDocumentIconColor: receivedMessageDocumentIconColor,
receivedMessageLinkDescriptionTextStyle:
receivedMessageLinkDescriptionTextStyle,
receivedMessageLinkTitleTextStyle: receivedMessageLinkTitleTextStyle,
secondaryColor: secondaryColor,
seenIcon: seenIcon,
sendButtonIcon: sendButtonIcon,
sentMessageBodyTextStyle: sentMessageBodyTextStyle,
sentMessageCaptionTextStyle: sentMessageCaptionTextStyle,
sentMessageDocumentIconColor: sentMessageDocumentIconColor,
sentMessageLinkDescriptionTextStyle:
sentMessageLinkDescriptionTextStyle,
sentMessageLinkTitleTextStyle: sentMessageLinkTitleTextStyle,
userAvatarNameColors: userAvatarNameColors,
userAvatarTextStyle: userAvatarTextStyle,
userNameTextStyle: userNameTextStyle,
);
}*/
}

228
AwesomeUIWidgets/Assets/Scripts/utils.cs


using System;
using System.Collections.Generic;
using ChatComponents;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.ui;
using UnityEngine;
using Color = Unity.UIWidgets.ui.Color;
namespace UIWidgetsSample
{
public static class ChatUtils
{
public static string REGEX_LINK =
@"([\w+]+\:\/\/)?([\w\d-]+\.)*[\w-]+[\.\:]\w+([\/\?\=\&\#\.]?[\w-]+)*\/?";
public static string formatBytes(int size, int fractionDigits = 2)
{
List<string> profix = new List<string>()
{
"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"
};
if (size <= 0) return "0 B";
var multiple = (log(size) / log(1024)).floor();
return (size / Mathf.Pow(1024, multiple)).ToString("D3") +
" " + profix[multiple];
}
public static float log(int num)
{
if (num == 0)
return float.NegativeInfinity;
else if (num < 0)
return Single.NaN;
else
return num * 1f;
}
/// Returns user avatar and name color based on the ID
public static Color getUserAvatarNameColor(User user, List<Color> colors)
{
var index = user.id.GetHashCode() % colors.Count;
return colors[0];
}
/// Returns user name as joined firstName and lastName
public static string getUserName(User user) =>
$"{user.firstName ?? ""} {user.lastName ?? ""}";
/// Returns formatted date used as a divider between different days in the
/// chat history
public static string getVerboseDateTimeRepresentation(
DateTime dateTime,
DateTime? dateFormat = null,
string dateLocale = null,
DateTime? timeFormat = null
)
{
var formattedDate
= //dateFormat != null ? dateFormat.ToString().Format(dateTime) : DateTime.MMMd(dateLocale).format(dateTime);
dateTime.ToString("MMM-dd");
var formattedTime = //timeFormat != null ? timeFormat.format(dateTime) : DateTime.Hm(dateLocale).format(dateTime);
dateTime.ToString("hh:mm");
var localDateTime = dateTime.ToLocalTime();
var now = DateTime.Now;
if (localDateTime.Day == now.Day &&
localDateTime.Month == now.Month &&
localDateTime.Year == now.Year)
return formattedTime;
return $"{formattedDate}, {formattedTime}";
}
/// Parses provided messages to chat messages (with headers and spacers) and
/// returns them with a gallery
public static List<object> calculateChatMessages(
List<ChatComponents.Message> messages,
User user,
bool showUserNames,
CustomDateHeaderText customDateHeaderText = null,
DateTime? dateFormat = null,
string dateLocale = null,
DateTime? timeFormat = null
)
{
var chatMessages = new List<object>();
var gallery = new List<PreviewImage>();
var shouldShowName = false;
for (var i = messages.Count - 1; i >= 0; i--)
{
var isFirst = i == messages.Count - 1;
var isLast = i == 0;
var message = messages[i];
var messageHasCreatedAt = message.createdAt != null;
ChatComponents.Message nextMessage = isLast ? null : messages[i - 1];
bool nextMessageHasCreatedAt = isLast ? true : nextMessage.createdAt != null;
bool nextMessageSameAuthor = isLast ? false : message.author.id == nextMessage.author.id;
bool notMyMessage = message.author.id != user.id;
bool nextMessageDateThreshold = false;
bool nextMessageDifferentDay = false;
bool nextMessageInGroup = false;
bool showName = false;
if (showUserNames)
{
var previousMessage = isFirst ? null : messages[i + 1];
var isFirstInGroup = notMyMessage &&
(message.author.id != previousMessage?.author.id ||
message.createdAt != null &&
previousMessage?.createdAt != null &&
(int)message.createdAt - (int)previousMessage.createdAt > 60000);
if (isFirstInGroup)
{
shouldShowName = false;
if (message.type == MessageType.text)
showName = true;
else
shouldShowName = true;
}
if (message.type == MessageType.text && shouldShowName)
{
showName = true;
shouldShowName = false;
}
}
if (messageHasCreatedAt && nextMessageHasCreatedAt)
{
nextMessageDateThreshold = isLast ? false : (int) nextMessage?.createdAt - (int) message.createdAt >= 900000;
nextMessageDifferentDay =
TimeSpan.FromMilliseconds(message.createdAt == null ? 0 : (int)message.createdAt).Days !=
TimeSpan.FromMilliseconds(nextMessage?.createdAt == null ? 0 : (int)nextMessage?.createdAt).Days;
nextMessageInGroup = nextMessageSameAuthor &&
(int)nextMessage?.createdAt - (int)message.createdAt <= 60000;
}
if (isFirst && messageHasCreatedAt)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
var timeSend = epoch.AddTicks((message.createdAt == null ? 0 : (int) message.createdAt) * 1000000000);
chatMessages.Insert(
0,
new DateHeader(
customDateHeaderText != null
? customDateHeaderText(
new DateTime(timeSend.Year,timeSend.Month,timeSend.Day,timeSend.Hour,timeSend.Minute,timeSend.Second)
)
: getVerboseDateTimeRepresentation(
new DateTime(timeSend.Year,timeSend.Month,timeSend.Day,timeSend.Hour,timeSend.Minute,timeSend.Second),//new DateTime((int) TimeSpan.FromMilliseconds(message.createdAt == null ? 0 : (int)message.createdAt).TotalMilliseconds ),//DateTime.FromFileTime(message.createdAt == null ? 0 : (int)message.createdAt),//
dateFormat,
dateLocale,
timeFormat
)
)
);
}
var _message =
new Dictionary<string, object>
{
{"message", message},
{"nextMessageInGroup", nextMessageInGroup},
{"showName", notMyMessage &&
showUserNames &&
showName && getUserName(message.author).isNotEmpty()
},
{"showStatus", true}
};
chatMessages.Insert(0, _message);
if (!nextMessageInGroup)
{
chatMessages.Insert(
0,
new MessageSpacer(
12,
message.id
)
);
}
if (nextMessageDifferentDay || nextMessageDateThreshold)
{
chatMessages.Insert(
0,
new DateHeader(
customDateHeaderText != null
? customDateHeaderText(
DateTime.Now)//DateTime.FromFileTime(isLast ? 0 : (int) nextMessage?.createdAt) )
: getVerboseDateTimeRepresentation(
DateTime.Now,//DateTime.FromFileTime(isLast ? 0 : (int) nextMessage?.createdAt),
dateFormat,
dateLocale,
timeFormat
)
)
);
}
if (message is ImageMessage)
{
if (foundation_.kIsWeb)
{
if (((ImageMessage) message).uri.StartsWith("http"))
gallery.Add(new PreviewImage(message.id, ((ImageMessage) message).uri));
}
gallery.Add(new PreviewImage(message.id, ((ImageMessage) message).uri));
}
}
var results = new List<object>(){chatMessages,gallery};
//results.AddRange(chatMessages);
//results.AddRange(gallery);
return results;
}
}
}

465
AwesomeUIWidgets/Assets/StreamingAssets/MaterialIcons-Regular.ttf


�pGDEF5S��$GPOS�����6GSUB B�b��o�OS/2
s"cx`cmap��; �cvt D�gasp����glyfwL"���head �c�6hhea4$hmtxr�p5�
loca�5��maxp\�X name5���zpost��2�x א�3�_<� ���E���H���@.�LfGLf���0�� +++@U+@@U@U5+@@Ukk@+++++�++�++++@+@@UU��+�+++@+k�@@+@"UUUUUU+U+U++,@++@@@+@Uw@kU+@++@U++k@@+k+++3@+[kk++@U+*+@U+k@k@++@+k++@@+@kU=@+++!k++@@@@+@k++@@+++k+@++++++�����k@U@+U@+++@kU++3+ +f+@��@@@@@@@@@@@@@@@�+U@@� 5+Uk@@kUk�@+U+@+@w+@kU@UUUUWUK+U5+k@++U@++kk+++++�+@@+����@�++k@Ukk@@@UkkU@+U@+k++@k�+@55+k�@+++kk+@@+@@@+@@@@@@@@kU+@@+U+U+�@@+,1@+�@@U+@*@+@@@+@@@@@@+++�k+��@++U+@U+++@WU@+++@+Y@%++@@@+L++@@@@+U@%UUU�+@++++@+@+@@U@U@@U+�@@@+++:+@@@`kk+:@@U>kk@k@@U@+Uk++@k++�+UU�+�U+I��k��kk@U�V��UkUU�w���}k@+++@@@@++@@@@@UU++U=@k+@+* +@@+U+�UU@U+�++U++@+@++UUU+U@+UUU@+@U+++++@@+++++@+@@+++#+++@@@@@@@UUkkU++U++@kU@I @@++++++UU@@k+++++��U++U@@+@@UUU++U@@+++@kU@ @+++@+k+@-@k�k@UZk++4+@U+@k+U@@++@+kk@+U+U+UUUUU++++++k++@@@+5'�k@+Z+>kek+@++@@U+�@U@+@Uk@+k@�++U+@Kk*@@7I@k+?+@++UU+U+++++,
$,
$�z@:9_z���!�$�,�1�9�S�s���������q�����������������i���������:������.�>�6�{��� �E��������������:�Q�s��������?�L��0_a����#�(�.�3�;�U���������E�����������������&��������
���������0�-�9����#������������� ��4�M�S�u��������;�������� (      ����oQKEA=62����a`_�����
�������������������� �=09__ az��(��-��!.�#�$5�(�,7�.�1<�3�9@�;�SG�U�s`��������������������E�q�������������������� ����
�������������&�i����Z����c����g��h�
�j��:y����������������.�0�>(�-�67�9�{A������� ��#�E������������������������������� ������4�:��M�Q�S�s�u��)����k������������?��;�L�����
 !"#$%&'D)))19AIQYaiqy���������������� !)19AIQn���A���1Bh��.Y���1k��0Xd{���%[���%7J���  < ] � � � �

>
z
� B � V � { �e��5i���#j���;]|��5����-@]��� Z�� 9n��?Y|��-v��4Wy���Ov��/��Gr���-[����O~���A{�����^���  ! . E g { � � �!Z!k!�!�!�!�""P"�"�"�##7#{#�#�$$7$^$�$�$�%%;%[%{%�%�&&=&v&�&�&�'!'Q'�'�'�(9(j(�(�)/)U)b)x)�** *g*�++S+}+�+�+�,,,0,?,�,�,�--U-�-�. .F.k.�/L/p/�0*0�0�1(1^1�2+2P2v2�2�2�33J3o3�3�3�3�44W4�4�4�4�5535U5u5�5�5�66B6r6�6�6�77757G7�7�7�7�88H8Z8�8�8�9 9)9g9y9�9�:
:2:v:�:�:�;;G;�;�;�<<<:<_<�<�<�=<=a=�=�=�>">H>m>�>�>�?? ?0?E?[?�?�?�@@:@W@�@�@�AAGAtA�A�B.BYB|B�B�CCbC�C�C�DD-DPDvD�D�E!EaE�E�E�F%F9FTF�G}H[IOI`IzI�I�I�JJBJpJ�J�K KLK�K�L LTL�L�L�M+MUM�M�M�M�NN=NaN�N�N�OO(OAOTOsO�O�O�PPTP�P�QQdQ�Q�R!RoR�S SXS�S�TTUT�T�T�U+U�U�U�VV VjV�W+W�W�XX\X�X�Y!YEY~Y�Y�ZZTZfZ�Z�Z�[[W[{[�[�\ \G\`\}\�\�\�]"]F]c]�]�]�^^I^^�_ _E_q_�_�``A`r`�`�aaKa{a�b#b�b�ccec�c�dd'd]d~d�d�e+eOe�ff;fpf�ggGg�g�g�hNhh�h�i,isi�jjDjsj�j�k k/kMk~k�k�l"l?lfl�mm2m�m�nn>nbn�n�oo@ojo�o�o�pp<pap�p�p�q1qxq�q�r rrFrnr�r�r�s"s5s�s�s�t*t;tot�t�uuFu�u�vvdv�v�v�w^w�w�w�w�xxNxcxox�x�x�x�x�x�x�yy*y;y_y�y�y�y�zz/zJz_zuz�z�z�z�z�z�z�{{G{�{�{�{�|?|t|�|�}}8}u}�}�~3~u~�?i��߀�R�������9�r�����#�O�o���͂��D��������G�g���̅�N���ą��
�!�A�k�����҇-������E��������X���̊�G��ۊ��!�U�s���܋��0�b���ۍ�h���ȍ�� �1�H�i������D�{���Ԑ%�Y����������ܒ�H���Ǔ�8�p���ɓ���"�p���ɔܔ��)�L�g�����ϕ��@�Q�q���Ԗ��7�s���ٗ��3�h�ƙ�&�=�q���՚��<�Q�����њ���6�X������K���ȝ
�.�\��������E���Ÿ6�c���˟���G�d������� �N���š���B�l�ΣF�u���ۤ�I�����E�o�Ǧ�>�t������R���ʨ�)�K�o���¨ۨ���G�l�Ѫ�?�m���ݫ�<�����٫����8�W�������Ԭ���F�m������� �`�����-�X�����ְ�1�i���԰��&�P�o��������V��A�}�����6�����յ�4�u���ڵ��i������M���ɷ��!�Z�Ź �F�}���ع��$�A�N�[�u���ܻ�!�6�`���̻���6�W�x����>�p����{������B����������]�����U.�/<��2��<��2�/<��2��<��233'3#�wffU��31111111111111111111111111111111111111++��%5#5#2"&4***C�}}�}뀀V++@}�}}�++��6264&"2"&473#3#��ee�eS�}}�}�****Ue�ee�}�}}��++@��
%5#5#***����VVU++@��k@�� %%5#5##335!57546754623"&U@*@@*~-��-@11@�T"�+@@+@@Q--|3Q  Q3�U+��
"%"&5375#5#3!5754675462V***�+��+3--3+�UUU**++j2J    J2++��2"&4264&"62"&4�  P88P8�}}�}  i8P88P�}�}}�@@��*26462"6"&462'32"&5475'2654&'#462"�  �  �Ppp�pM�t!W|WJ6*  �    �p�ppP`9�s)5>WW>8T)�  @U��/?54&##"332655##53#54&##"332655##5372#!"&5463� @ @ ++u @ @ ++��� V  @  V  @ ��UU�� 3#!5333UVV�V*V@뫫V��@@�� 5#35#535#572#!"&5463@��UUU���@+�++*+���*U���#��������5���7#'7���������++�� 3#'7##5%'53`uu@`@@� @@u@@�@�@`@@u@@� @@u@+��5462"'&472653#"'&'&'&'&5462#4&"� ,,r88EE�+2#))W~V+=Z>$( *,,�8�8E�E�o#27%)*?VV?->>- "& @U��#3%5354&##"33353265##5#35372#!"&54635+ @   � + +����@@ V V �55�++��U��%55"&5472'654&#'7UUFeK5FeK5UU�@UV@eF2)!5K+eF2)!5K@UVk@��3#5&&5326"&55462q$K5*5K$C\CW4&&4&6QFFQ6/==&�&&�k@��(3#5&&5326'326574&""&55462q$K5*5K$C\C�
44&&4&6QFFQ6/==��
 � �&�&&�@@��!''#5&&53327'#"&55''5462'65[eY!*5K$C.#&��&4&U ���YFFQ6/= #&��&&�%!+U��3#!"&546333'33'33�U��*@**+@+++@���VVVVV++�� $5#5##33572#!"&5463!!"&5�U+UU+k�V+��+UU+UU��U��*+++�� $5#5#75#72#!"&5463!!"&5�Հ�����V+��k**�++U++��U��*+++��&!!"&55#&#"265572#!"&5463U+��UU ,k����*+*u ,vj�!��%5#5#%'''7'7'777***4M(II(M44M(II(M뀀V++k;ODCO;<NDDO++��%654&#"27'2"&4�$eF<-i<-�$e�}}�}�-<Fe$��$�-<Fe�}�}}��k��3##3+UU�U���*��++��%5##5#2"&4@+*+�}}�}�����*}�}}�++�� %53264&"2"&453+��ee�eS�}}�}�+���Ve�ee�}�}}�����k��������++��
77'&2"&4Հ�-�}}�}�``u}�}}�++��6264&"2"&45��ee�eS�}}�}��Ue�ee�}�}}���`+U��75373##5#5353'!5!5+��UU+UU+U���****VV*VU++U++++�� $5#5##33572#!"&5463!!"&5�U+UU+k�V+��+UU+UU��U��*+@U�� 3#"&4632537!5%!5kj@&4&&�իU���+�&&4&&**�++U++++��!5!!53264&"%32#!"&54���+��4&&4&����UU++�&4&&4n$G�k��#'%54&"6"26472#!"&546333# B<Bs&&P � @*+++��&&W �  ��*��*��@+��%53!'75#5!55k*�UU*UU�V�@UU@�V�@UU@@+��%#5#57353!'75#5!55 +V*�UU*UU�U�V�@UU@�V�@UU@U@��2"&53264&#'7Gde�e+KjKK5kk�dFGddG5KKjKVkkUU�� %7#7'73'''7<C,v,Cv,�� o�C,v,C�v,�� Co����3##U++յ�������73#˵�++���++�� !533#57264&"62"&4%'7'7��MM�MK|WW|WE�pp�p�b�bb+&Z+'Y�X|WW|�q�qq�L!S R R����!!����+U�� %5#5##5#535%2#!"&5463���V*�V���++U++++�++��+U��!12"&464'&264&"&547'2#!"&5463�""�22&%~F22F2&%22$��+""�2�2&46%2F22F7&46%2�2$�++��%7'72#!"&5463!!"&5����V+���``J�U��*+@���7'#!"&55463!2kUU �   U�UK � +@��'#!"&554633''32FzD� :��� ���D � :E�� KkU�� 37'#$5kUkkU 6@k��k{v��UU�37'#�VjjV@k��k@@��$'''567''#53'4&'5'6''5-xe,%)[kUeeU;/AT 545�Z-B��,
,[�k�e�3N,iD0)! 4/@E�� 5664&'537'#+ATTA/;;/55�UkkU�i�i,NfNSx�k��k+U�� %5#'5#5#2#!"&5463�V���V�����kUUkUU+�@@�� )%53'326554&#5##5#3532#!"&54635+KV � + +����@@`� V ��55�++��*"1�� %3#57#533''3#'##3#7P��~}���S*#`'m'�c23e2�"�"�o.�44#2l2+��2##53!3#"&54637�UU��UU@����*�*�k��U@��4;O%3277655&4&#"7#"#"'&&'&55477632632#557346355"2653"&
 (     Y&�dGkk4LLhL+e�e�++      5F FdVkkVKjKK5GddU@��'G�746355"2653"&73277655&4&#"7#"#"'&'&55477632632#255&4##"#4632632#"#"#"'&&'&53336255&4##5UdGkk4LLhL+e�e�
 *  q        �FdVkkVKjKK5Gdd++         U@��2F7#73#25465332#"'&&'&533277655''&#'46355"2653"&� 3%    �dGkk4LLhL+e�e�/  
  FdVkkVKjKK5GddU@��4;O%3277655&4&#"7#"#"'&&'&55477632632#557372"&53264&#'7
 *     [&Gde�e+LhLL4kk�++      5F �dFGddG5KKjKVkkU@��5w�%32776554&54&#"7#"#"'&'&55477632632#255&4##"#4632632#"#"#"'&&'&53336255&4##572"&53264&#'7 (  q        3Gde�e+LhLL4kk�++         �dFGddG5KKjKVkkU@��4H7#73#25465332#"'&&'&533277655''&#52"&53264&#'7�3%    Gde�e+LhLL4kk�/  
 �dFGddG5KKjKVkk@�� ###5#5353!2###5#"&5463U@*@@*����k�k++@@+@@��+�++@�� .2654&##3533'67#'#'54&##326%2#!"&54633#%3#�K  �&  %B KK �� ++++ �++- 6�II� @����*�@@+U��'7%5##5##5#3326'5#35#535#55#'#35%2#!"&5463� U �UU555667���k`KK`k Y�e�KK�KK��UU��
%'3#5!!!!+jj֫����@@�*�+*++��k 7''7##"&5546332535#5#53�0%%���+������@0 0����++�++�*UU��6462"Ue�ee���ee�eU�� 5664&'462"k8HH8&//&��e�ee��\v\, BTB ��ee�e@�� !6463253#"!2#!"&5463�&k@&4�������4&�+�%*��U��*++��%'%#!"&55463!2'!5!5!U���VU�+��V�E�����**�++U�� '7%537!5!5� �a A�ժV�� �` @**�++U++ �(%'7'7'3##5#535372#5!!##5#"&5463` @@ �@@*@@*�+��@+�k�` @@ K+@@+@U���*++@��#5!2###5#"&5463U����k�k+++��+�++,,�� #'5664&'57&'&'7#677'67�nQ?VV?Q�%/?U)M+)�/%3?+??AR�z+a�a+��+�/$3?~%/?3")�//1@U��%5!2#!"&5463���*�����+�+U�� )-%5#'#35#5#'54&##3532672#!"&54633#�56� +K +��� ++��KK�KK��K�+���@��%5#2#!"&5463�����k��U��*@��%5!2#!"&5463������k@@U��*@��5#5#%2#!"&5463������k**V++���*@��5#%2#!"&5463���������*+U��37#"&5463!@u ���v�@��� %5#5##33577'#!"&55463!2+@+@@+�UU �  �*@@*@@5U�UK � @��%5!2#!"&5463�����������*@@��
(%'7#5#35'5#5##5#33572#!"&5463�++%* *` @ ����@@@@�@@ @@@` ���*@���
77''35#3577'#!"&55463!2�kZB6^�UU �  �k[C^6 U�UK � +@��#'+/39%#57#55#3#3#5#5#5#5#5#5#5#5#3!3�+++V�+++++*******++++++++���V��++U**��+*++***V++U++U****V++U++U**���@@��7632#"&546332�0]/
$( �� K  ]0/
 K Ֆ ($ �k""''&476 "'&'&55&4. 5i"i5 2@B5dd5BUU��3#5'7#��*����Ս��wM�� 7#'75'7�``K�t�IIU``��sw��HH@��k
'#53#���+�bwk��b�+wkk��3#537����*���*Ս�UU��#5'533''7�1q*e1ր1>>�1q��e1��1>>++�� 5!5#5!572#!463����+��UU++�++k++��U�@��k !!5!%5!�+��U+�*k+�++V**++�� 5!5!5!%'!"&5463!2����UU��VU++@++@++���U+�#'%54&"6"26472#!"&54635!!5kIDI(({��V���  �((W��U++++@@�� &26%2#"&5463327675#'3##'#535#53#7#5� �� K  //^/ $(@+@@++@+V� K Ֆ ($ /\1/  �+@+@@@+kk
U��'/7?GO2"&42"&462"&42"&4&2"&46"&4622"&462"&462"&42"&4�""""�""""f""�""��""""""�""�""f""""f""""�""�""�""�""��""+U��5'72#!"&5463�������U+kk+j��++�� ##463!22'#"&55!5k �U  U U�  V+ @ ��U +�k@�� %3'353'##5#U@UU@*�U@*@�UU��U��@ ��'7'5''#"'&&7'71Oy&�fL�:/<G2.);+�0Oy&k/��gf"+4L:&2/�2;��@��,654&"34623475#2##'#"&5463A2F2*" **�U@@U%#33#" ! "�++U��@@+++��#'.547'77"'632'654&�mDH$
4' D�E,@>W$M lDG. EAR D�gD.W>0ENk+��264&"&2.54�,, |W,+4'  ,,�W>PF=EAR>++�� 5!5!5!2#!463����+��UU++@++@++�U�++�� 2#!463���U��U�++��%!72#!463���++��U���+*�U�3�� '##"&55'%'732Nu( �8b�2����)�8��2@@��7632#"&546332�0]/
$( �� K  ]0/
 K Ֆ ($ +5��"2B'#"&57'&&547'&&547'"'632'654&'654&#"'632Fe�" *#!.'19,,�+%2=X} e1#2# #5K����"1%;#&.6.O%c:J9-}X=2')Fe�# #2# K5@�/%&4737'7'54&""26472#!"&5463}# *,,* uXPX�4&&4&��V�,*+!4,4!+*U%%&4&&4f��*@� #)5#54&""26472#!"&5463'57ժXPX�4&&4&��V�@@@@���%%&4&&4f��*k**++C� *&'77#5'7"'&'&55&""''&476 �JLn*�LLU5 .h. 5i"/JL�jj[KL�5BB5d[+��#%5#72##"&55463&2&"'62&"@�}

z

#�E8�8:,~,ZU���

�E88=,,k��!!%463!2#!"&5���*�����k���k��%#2##"&5463k���k*�����k��!!%463!2#!"&5���*�����k���k��%#2##"&5463k���k*�����+k��!#"&554&"3'354622655#�U@2F2"@UU@2F2"@�V�#22#��UU�#33#��++�� 5##5##5#%2#!463k++*++��U++++++��U���#$264&"264&"$2#!"&4623&54l>++>,�>,,>+/bDD1��1DDbE`�,>++>,,>++>�DbEEbDD1+ +1���6264&"73##5##"&4632�""��+U] B*5KK5*B�""<VUU&/KjK/@��#2##"&5533##5463''7'77��+��+UUUUVUUVU���@+V+@�UVUUVUUUU��554&"32##"&55463546272##"&5533##5463�[
 u

%.$��+��+   K
 K
  ���@+V+@+��"%#2##"&5463'6'7'64'+���+B((UV�������4B&k%O*��]2##"&5533##5463264&"7''##"5'&'''&6774&465'&776677433276��+��+&  x ,  +���@*@��  %

%%
 %@��
#7##!2#!"&5463�*UU*V������UUUA,��V��*5�� &%5&#"6322#"'&#"&#""#"&56326�!*A44A''L*)=A4+J60+KJ++u�
�  �� 9 +U��7!5'2#!"&5463���V��V��k��jj�+�U�%7'633!53"&55463!2VVi+U�U�UV�PP.n:z++���!%767'''!53"&5547''7'"'!23#�1" n�:�}U!�v"Vp;�( "��[:+� !�� v O-o�+@��k
77#53#5@�wb�+�M�w+�b�UU��2#4&#52#4&#462#"&UX|=Y>��<�q()|X>Y�Éq��(++��-6264&"&2#"'"&46226554&"33#"&4�4&&4&�}+' X??X?e�eeFkkX}�&4&&4�}X , ?X??,  Fee�e*}�k�� %"675#2##"&5463C#RDDZ����/Z $@?V*�����@@�� (##5#53532#"&54633276�@+@@++ �� K  //^/ $�+@@+@@� K Ֆ ($ /\1/  kk�� %##5#53533��*��*�뀀*��@@�� %5#5##33572#!"&5463kV*VV*����*VV*VV���*++�� %5#5##335&2"&4kV*VV*m�}}�}�*VV*VV�}�}}�++��6264&"2"&473##5#535��ee�eS�}}�}�VV*VVUe�ee�}�}}�V*VV*V@@��
!'!7#5##%#!"&547763!2m&��uJVJ+
��


���u++� ��
 $ @� %'7''72#!"''763�LLLMMMML^��ss�MMMMMMMM+����++��%2654''7&#"62"&4Fe$�-o$�-<FeS�}}�}UeF<-�$�<-�$e�}�}}�kk�� ''7'77�wwwwwwwwwwwwwwwww+��%#2##"&54637!#463������*@+��U��+V+��+++��53'24"264&"6264&"#'"&46327'#"&462�@�+ �""""y@�22F22#22#22F2��+K�$$�$$���2#22F2222F22#@+�%%##5#"26472#!"&54633662�*�*�  ���Y * UV@@���   ��V@@�� '7627#�'P'2���P�Pj'P'2��P�+U��%7'#!"&55477���������ngg�� qq @��� 75!%!!53�������V�**�+�++k@�� 3#'##33x�x*���*�kUU��55#5���UV��V�=@��E%267''67632327676323##"&5467.#"&54>76'&(
�%
#  09*)54>!(<7
;  #2  t%&&  �$ ('$$<7"5E>'!H
 I 0$$"@@�� %5!32652#!"&5463���V&4&U�����&&��*+��k#2##53264&##553$33#"&4633#"k,>>,VV''Vj���'VV,>>,VVk?X?)'6')�**06')?X?)+U��5'72#!"&5463�������U+kk+j��+U��5'72#!"&5463�������U+kk+j��!��k7#7&#"'6632�L�N0>8Y2uIUM�M(A4DVk��%!5!���*�*++�� %5#62"&4k��}}�}�**�}�}}�++��6264&"2"&43#��ee�eS�}}�}j��Ue�ee�}�}}�C*@U��&#'7�hqM���@�[mW��U�&#'7'7hqM����UU��@�[mW��@UU@��@@�� %5#264&"#'57*
lpp�pp뀀\ p�pp�p@@�� 5#264&"#!"&5463@�{4&&4&�U��@UU�&4&&4/U�*@@��  $(,16:>BFK35535353753'5353'5353#553"&532#'#55353'53'463����++++*++++++�*U+U++*+�*�+*+�++@�����++��++U++�++�+�**�++�++��++UU+++�++�++�**�++@��75%%5+@���@�++��@��� 75!%!!53@������**�+�++kk��
3#73#'!!(P],e e,�*���k&/��/Z*+��k2&&#"#56 It2Y8>0N�L?UVD4A(M�M7++��%3#3732#!"&54637T-m(m-xo��,,u��@ ��V�vv@@�� '3535!32652#!"&5463UUU*Vj��V&4&U��+VV@@k��&&��*@@��
!'!33537#!"&547763!2m&��uJVJA
��


�vu++� ��
 # ++�� #77'355232#!"&5546335463�UU@@VV��VuVU@@
**+*��*k��'2!54&'54632#!"&55462!54��/"��"*�. ,, .jkk@@+U��!537353##"&%3#53#3#+�@U�������UU�**�����+�*�++U��64633#"3355#"73#53#53#+Q9KK(88( @@ 9��������rQ*8P8*@@+++�+�*k@��%5#'#353#'##3�kk���k*�Հ+�+��*�k+@��-7'#5'#53'33#"&5467#'72'6654&##5+eV%0:,"'VV,>$�*D,>:'V���U%1*,%')?,!6 N**V?,A$')��6264&"'#'57'7'73'5��M#�p#N�R�p��pN#p�#MpRp��?@@��%7'7533#!"&553!8kk8*�+��+*�7kk7�����++��6264&"62"&47'5''7'7�|WW|WE�pp�p�UeCbbHbUX|WW|�q�qq�p2<�cR RR!S ++��6264&"62"&47'5''7'7�|WW|WE�pp�p�UdBcbHcUX|WW|�p�pp�q3>�bQ QQ T ++�� '5264&"2"&4 `p1�ee�eS�}}�}kp9D���e�ee�}�}}�++�� #3##5#535264&"62"&4%'7'7@@*@@)|WW|WE�pp�p�b�bb@@+@@+@�X|WW|�q�qq�L!S R R++��7''575577''5462@P{+KJ*�k�D����zO  u5*Pk*�N  ++��''575575462���+KJ*���@�5u  u5*ku  uk�+k�%5#5#2##"&5463353***c  �  #V�kkU+++ ��  G **�+k�77#5372##"&5463353�U+U+c  �  #VU�v�� ��  G **�+k�2##"&5463353N  �  #V� ��  G **�+k�2##"&5463353N  �  #V� ��  G **�+k�,%654&"34623475#2##"&54633531&4&  "(b  �  #V�&&  a))* ��  G **k+z�%'73#5'7'753=((=\\zbwwb�)QQ)\\y�bwwb�@+�� ''73#5'7'753'7�++*.((=\\zbwwbk*++++++\)QQ)\\y�bwwb��+++U+�� %7'''#5'7''53'7((�81\bw��*zA"|()���1[�bw� E+kyA#@+��!%'73#5'7'753'64'7((<\\zbwwb�!V1
�)QQ)\\y�bwwb�d2z4*X*V1��%3'#3737#'#5'7537371)E*E)D�FFdGGdFFdGGd����*rGGdFFdGGdFF�NN��2"&4264&"%#'#5'75373�F22F2 jKKjK+FFdGGdFFdGGdU2F22F�KjKKj|GGdFFdGGdFF��6264&"#'#5'75373�jKKjK+dGGdFFdGGdF�KjKKjdFFdGGdFFdG��%264&##'#5'753735KK5�dGGdFFdGGdF�KjK�dFFdGGdFFdG++��%27#"&5467'654&'H,8@lX}oQ6JWSQo8
J6k8!W}XSy@T8>WiyS0'!8TU�� '%53##"&5537'7'7'7%#54632#5k*�*@bbC�CCb��*�*k*UU*QbbDbDDb�*UU*U� %5#72##"&55463%3!535463!�Uk � �����+����� � � +�@@�+@�� '#57#5#57#5!2###5#"&5463�****������k�k++U**U++U**��+�++��'6264&"%3##5&&'#53667532"&4�|WW|WT,,`C*C`,,`C*C`�F22F2kW|WW|S*C`,,`C*C`,,`2F22F��6264&"%3##5&&'#5366753�|WW|WT,,`C*C`,,`C*C`kW|WW|S*C`,,`C*C`,,`��/%'327'#5&&'#53673#'654&#"'6753[�W>2�e,-7*C`,,%S,, W> %*C`��)2>W:��,%,,`C*7-d*' >W ,,`��/%'327'#5&&'#53673#'654&#"'6753[�W>2�e,-7*C`,,%S,, W> %*C`��)2>W:��,%,,`C*7-d*' >W ,,`��6264&"%3##5&&'#5366753�|WW|WT,,`C*C`,,`C*C`kW|WW|S*C`,,`C*C`,,`@+�� 3#3%533'3�++U+��+�*�++VU�UVV���VU�++��%!��V�+�6�� '07'62���Dy�y��TUU++��,!3#35#"&5475463!2#!"&5463��U*�@"���V����+��0  0��V�����V++��"'073#"&5553##52#5#5"&4627!#54633U���*��*�V�@+@�+*���*����*���*}�O9U+��*@@�� 3#53'#5353cyy]�Nx�����yx��xN�]�ݫ�k��!1354&""&5546354622#5!2#!"&55463�4 $ j��U��+
� @  @ ����k��1%#2##"&5463354&""&5546354622#k���Q4 $ k*�������
� @  @ �'?354&""&5546354622#7"&'3%"'&47762'7'7fI , ��Qd� Ep
� 
� 
4-y�x/� � V  V �Q�c;a� 
 
4,x�y/� '77"&'377"'&47762'72#&&�Qd� Dш���
� 
��
� �Qd� D6Q�c<`����� 
 
Q�c<`U+�� 5##5##5#72#!"&57�+++��UVVVVVV����@��&%!2#!"&5463"&5467363232#�������&!.*j,��V��*��&$+%,++��7+�+��V++�� 7#353'53+�U+***+����**U��3�� '##"&55'%'732Nu( �8b�2����)�8��2++��!!��V�����VC���� '!7'%'fo*����u����+��f���6��%62�y�y65UU +�#9%7>2&#"54&"32##"&554635462KK�  $'-.-'$  ,-=�V k .�8^6  

  8=M  U U 6��
'67''632F HGS�!-+�t�-,� ��JGg5,[��
+U�� 355!%5#'!!355!U+U���+*��V*+U�**@VV�**@V�**@VVf&��,3###"&5475#"&55&546235#7#35#@U@(@&@+@@+@kV*AA, ,�VV�*+�)%54&"32##"&554635462'"6 &�V k , 6,>K�p p9�  U U j>,=cUUUL+2��-52'6654&"&&54'654&"&&54622"&4��}91'/d�d.'19U#*2F2*#KjK�""�|Y:c%O.FddF/N%c:YY#;%1#22#1%;#5KK ""@�� 75'7#532##"&5533##5463�wwL���+��+�Mxx*�*��@*@���'3"&5462"&55326554&"265` DbE3F2,  , 3F2��1EE1
#33#��� � ��#33#�@`�(#5&&'332654'&546753#&#"� )"@!+/;@d* @!#/4  '..*!-$A)./,-@@�� 5#5#'5#5#!!����*���+��������������U��@@�� #'+/37;?C7#55!%#5%53'3##553'53'#5##5#5'#5'#5#5'#5#5'#5k+���+U++++��+U+++U++*�++*�+�*++�*++�++�++�**+++�+*++�++V**�++++�**V++U++�**�++�++U**@@�� #'+/37;?CGKOS5353535373#5335353'5353'53'5353535353353'5353'53'53@+++++�*�++�*�+++++++�*�+++++++++�***�+++++�++�**�++U++++U++++�++�**V++V**�++U++U**V++U++++U++U++�**�++ 5!!'762#57��*P*2E�P�UU�*P*2E�P�@@�� #'+/37;?C%53#53'53753'3#5!53753#5#57#5##5##553'535#553�+�+�*�++++����*�+�***�+�+*+U+�+++@++++U++�++�+�**�++U+++++U++U++++++��++U++�++��++ @@��#'+/37;%53533##5#535533#53'#5##53#5535#553#53�+++���*��U+*+++U+�+�+U++U+�+�++U++��*��*���++�+U++�++++++��++�++��++++@@�� #'+/37;?C535353'53'3#5353533753'5353753'53'535353@+++*+++++++�+*+��+*++++++*********�++�**�++�**�+�++U++++�����**�++��++�**U++U++�++U++@@�� #5#5!!!%#5##57#5�+�*���+���+++*****U++U*��U���****V++@@�� #'+/37;?C53'5353753533#'5353'5353'5353#53753'53#5353�*****++++*++U+�*�+++++�*�+*+++�+*+@++U++�**�++��++����**V++�++�++V**�++++�**�++++��++@@�� !53%!!#%535353#53353#53�+�����+U+++�*�+�+�+@++�+���**V++U++++++++@@�� #'+/37;?C%53535353753!!53'5353'535353'5353'53#5353@+*+�*++*+�����U+++�*�+++++++�***�+++�**�++++�++U++++�**U++�++�++U**�++U++U++�****�++@@�� #'+/37;?C%53535353'3#5353#3753535353'53353535353@+++++*+++++++�*�+��+�+++++*+++�+++�**�++U++U++�+�**�++���U++++�++U++�****�++U++U++@@�� !!3#5!5!%3#@���U��U���������+*+U**�++�+@@�� !!5!5!5!5!@��������������+U++U**V++U++@@�� !!5!%5!'!5!5@�����������+��++�**�++�++@@�� !!5!5!5!5!@������������+U++U**V++U++��{�%264&##53264&###32 K@  8.-"��$1�@�@[4"/+2H+@��!#'7#'''#7'�+|"-3<:4y!@4��@P,$<��yN{�!5!!"&5467%3'#"''&477'7��+"
���g�
u
v
n3UU / & -fP
 u
u 
n3U=�� '#"&547''7p89%/5KG+�:+G���8 K5"6G� �K6{�
3''3#'##!!�f3*u0�0u��9��@@@U@@�� 753'53%!!5!%753������������UV��**U++�+��++�U�++@@�� 753'53%!!53%5!�������������UU��**U++�+�++�UUk++���� 3#3#537#ի<H/�<H/�@�@@� K�� 75!5!!!#3'35#7����U5JK55KJ�**�****�JJ�JJ5`�� #!!5!5!$2"&42"&42"&4�+��+��+���*�**�**5n+U�� '75!5!!!533#57'5#5353#535#535�+��+��+��j@''@&**@@*�**�****V,,@@V�V

U+��3###"&5535##!"&55463!2�@� + � �  ��� �U U k��k %7#53#7#53+*@�*�+@�+�V��VV��V@k��53##57!###@�@@@j@k@@���@�@k�� 75!%!##5#53@���*jVjjV�++�@@@�@@k+��%5!5!5'"&4633##5##�U��#22#�++*+�U@*@V2F2*���U+��7!!'77"&4633##5##��VV*#22#�+*++�*@UUV2F2*���k@��7!!6"&55326553k*���jK5,>,5k+UK5��++��5�U�� #3!57'5��jj�����@kk@+��+@@�� %5##5##5#2#!"&5463k++*++���VV�֖�+��*++�� 5!5!5!2'!"&5463����+U��U++@++@++��UU+��3''3#!"&546vv����@u ��V++�� %$"&'3&"&462"&462264&"2"&4%J; � ����ee�eS�}}�}�)!!a�e�ee�}�}}�@@��%5!332#!"&54633533#5����+��+�kk���+��*++�kk+��k#2##53264&##553$33#"&4633#"k,>>,VV''Vj���'VV,>>,VVk?X?)'6')�**06')?X?)@@��7!'#!"&5463!2�J*`J���*�`�`5*wM�� 7#'75'7�``K�t�IIU``��sw��HH++�� '!"&5463!2�U��V���U@@�� '7627#�'P'2���P�Pj'P'2��P�kU��
77##5'!!k��U�U*��Ֆ����+U��@3!53!�+��+@��U@���873254&'"&&##5!##"'&'&574#"#4&5&547632�>1 ��SC$'�3$ b "15�6$++=2x-
 %)U@��
7!!%'353UV��UU@*k+�VV��U��
!!%'3537##5UV��UU@*jUU@**�UUVV��UUVVU@��
!!7##5UV��VUU@*�+�VV��U@��2##'73264&#!5%!553k#22#+@@0��V���2F2+@@+"*�**��**W@��"'#5&&'3327'&5'"'6753#&r7/!@!,/<%KSI�@ #/���0..*!-J;I!./,-U��@75!5!5UV���++�++��
"&:73'##73#735#5#'535#5##35#35#3#5##535#53353�8%K#IH"`++++***�***++�++�ր++�ր�Rm*���+��+++*�**�*+++�++Uր++�ր++K+�� 7%773#5!#5j--��-s**k@�t-..-�@�kk@jj+��52#"'#"'##"&463236236�$ > H > $$ > H > 5, , U��@73#5!!U��V���+�+5k��##5#5'!###�@@@�k@k@@��@k@�++��"*%654'&546323&'5##"'#32"&4CZ8-*;9%Y95*C9v�}}�}~ 6=(9**#8 ! (9*�}�}}�kk��!###k*u@u�@�@@��753#"&2!546353#'3#@k@k�kj�kkk��f@@������++�� 5#5##3357'!"&5463!2kV*VV*�U��V+UU+UU���U+U�� '!!!!!!533#57'5#5353#535#535+*��*��*��U@&&@&++@@+*V***V,,@@V�V

UI��$462"462"462""&4&&4�&4&&4|&4&&4o4&&4&4&&4&�4&&4&@@��.%5'7'35#535#37353'7#572#!"&5463��UUUU�V66V65 +$++$+u���5�UU5UU�P P 0�@@@@@@+��*+��k%646332##"&4633#"33264&##"33#"+D1�#22#� �� ��,,��1�bE3F2, +",>++U�#!"&54676632�):?,��5KB0L-:X*=*,?K51I'0I++��%264&##4&#"'"32"&4` 2#-&&�}}�}�,#3%&4&*}�}}�U�77''%#!"&54676632Սo,):?,��5KB0L-:X��n,J=*,?K51I'0IU�%#5##7#!"&54676632k@V@k�):?,��5KB0L-:X�UUk�=*,?K51I'0I+�+#"337'#"&5467'654&##54&#"'632�%#22#���e+�5KH3"):-!& D1 '/:X+3F2��*K54J+=*7 && 1D IU�&%264&##54&#"#"3%#!"&54676632�&& D1(> #22#):?,��5KB0L-:X�&4& 1D0%3F2�=*,?K51I'0IU�%3'337#!"&54676632+@kk@Vr):?,��5KB0L-:X�jjV�=*,?K51I'0IkU��
7!!%'353k*��*��U��+땕��kU��
7!!75#7#k*��UU��U�+V����+U��32#!"&5463�+����+�+U��%5!2#!"&54633���V���+����++U��!%54&"6"26472#!"&54633�;4;f""@���+��""Z�++U�� %5#5##33572#!"&54633�@*@@*V���+�+@@+@@��+@��'2#4&#2#4&#2#2##53!#5463a�+qO>X+?,&@�����++�aPp+W>,?+&���+*@@@��!).2##53!#54632#4&#%#&&'52#4&#2#�����++a�+qO�x_?V>X+?,&@���+*@@��aPpk�?`#�W>,?+&U�!53!53"&55463!2UVU�UV����++��+��%5!2###57#"&5463�����*�*�����@@+��%!2##3#535#"&5463�����*�*���*�+**++@�� /3#'3#73#3#!%#3#3##!"&5463!23UU�kk�UU�kk���*****��+*��kk@@V**���+*++***���%5#2##"&546353U�������*��+�*++++�� 3#'7##5%'53`uu@`@@� @@u@@�@�@`@@u@@� @@u@U��2##5354&"3#"&554��p&@UW|WU@&�qO�&�+>WW>+�&�O@��2##535#5354&"3#"&554��p&��UUW|WU@&�qO�&+�+>WW>+�&�O +k�� #'+;5#5#'5#5#5#'5#5#735'3535'3572#!"&55463�*******�***@******���+**@**@**@**V++�**@*****@**@**@**@�����Y7'�bb��Ybb����I�%'7I��b���b��U�77'7�bb���bb�����U7'7'���b���b@���!'7���L��L*M��M���� 75!''7��b���++�b�� +��
"&*.>%'375#5#'5#5#5#'5#5#735'3535'3572#!"&55463U�@*******�***@******���V�++@++@++@++U++�++@+++++@++@++@++@��+���
3!'7!�+��M��Mk�M��M��� 3#'7'7!5!�**���M��/�����M*k+��3#5&&5326"&55462q$K5*5K$C\CW4&&4&6QFFQ6/>>&�&&�U�!53!53"&55463!2UVU�UV����++��U�%5!5#!3!53!����V+�+����@++@U� #6264&"!53#!"&53"&55463!2�  �VU�VUVk  ������U�!53!535"&55463!2#UVU�UV�����++��@@��37;%5#%#3####5##5#"&55#535#5354633533533235#7#5k�++++++*++++++++*+++�*U���ր*++++++++*+++++++U**U��U�� #465!"&#��WWVe�e�?W���A`��UUFeeo`Ak��%#5#2##"&5463p��V�&&�&&�+��@�&��&&V&k�� %#264&"2##"&5463U�Sv��+��U� �� j U� %5#72##"&55463%3!535463!�Uk � �����+����� � � +�@@�+#�"&2##'35#'5463%3'!53547'!'!� @.U+ �����Q+"2��+
'���+DU � @�o+Y %�HQ��"2@� 'B+@@�� )3%5##5##5#%2#!"&554633537&#"'632&#"'632@+ * +���+1! ()1)10)-=>-�++++++kUUUU� $$--@U��%5##5#%#!"&55463!%7��+*; �� ���++++� uUm(@�� &&55667#5�nRRn�;R���V�Y��Y���iC�BzU+�� %%5#'5#5#'5#5##5##!"&5732k++***++�+�+����UU+**�UUUUUU****@���k��%#2##"&5463k���k*�����k+��)2"&4264&""3264&72##"&5463�4&&4&X??X?kZ�&4&&4�?X??X""*��VU��!13#"&5462"264&"6"326472##"&5463���� ,, F22F3g"/����+U�, , 2F33F�$$D��3U��%!2#!"&5463���U����+�@�%!5#2#!"&5463����V�&&�&&kU��@�&��&&�&+� %!264&"2#!"&5463�������kU��V��j��� "&53"&4632#5462E`F�0EE00EE0E`F0EE0E`F�E`F�0EE0@��%!2###5#"&5463����k�k��+�++U�264&"#'&4773�KjKKj�A�AA�5jKKjK.�4zz2�2zz@@��%3#5'#5375&&5462kUkUUkUV&4&�kAZZAkUD && D+��@ %53!53!53'!!Uk�k�jj��k�++++++�+U��)7%5#72##"&55463264&"7#5&5475'3#"&5463!�Uj� wJU�UU����� �� �b&&&&��++���+264&"264&"'5#5##335%2#!"&55463�B@@+@@+��R*@@*@@���k��+73#&2#4>54&"#4#2##"&5463�&& @+8&&�����&�+2  �*��������$'##5'3#"&5547'"'632'354&0�. @�U@&G�,%1?Ppi>W��U.U�&*�&�7-G$qO�i*>X++�� $5#5##33572#!"&5463!!"&5�U+UU+k�V+��+UU+UU��U��*+++��"&462264&"2"&4@&4&&4`�ee�eS�}}�}4&&4&�e�ee�}�}}�@��%7''2##'#"&5463(XX((XX(�U@@U�((XX((X@��@@+k@�� 3#'##33x�x*���*�k�@��3###"&4632�U6%(88(�@�$18P8++��'/7?GOW_go$2"&42#"54264&"2"&42#"542#"54'"54322"&4'"54322#"542#"54'2#"542"&462"&4"  
f�ee�eS�}}�}@
5
  @
K
J
6
A    �  >
Ke�ee�}�}}�#
U
 ,
@
J  b  @@��%)19AIMU]e$"&462&"&462&"&462"432'"5432%!!"5432"&462&"&462&"&4625!"&462"&462"&462      @
�����+
�  ]K��    ]�  I  I  WV
u+�
 >C��++  a  l55�� !'/TZbjrz�����62"52"&42#"4&2"52"&4$2"52"&47'"&4632'#"&5467'"&4632#"4"&462"&462"&462&"&462"542'"4323"432&&'5462#6"&4625B  j
�B  J�  �[P  <  <  �
i      �  ��
K

   �
@  >�
@  
@  ��Q  <  <  �  b  b  �  W
��
 `  55��%-3;CKS[ciou{�������2"&42"&42"&462"&42#"462"&462"5&2"&42"&42"&462"&4&2"&46"&462'"4322#"4&2"57"432"&462"542$2"&42"562"&42"&462"&4?  v
  �>        �)  
��
  ���  6B      KCM  ��J  W
�  I  �  b  �  >���
�J  W
j  T
  �  b  ++��6462"+}�}}���}}�}k+�� 2#"'664&'6�Y}}Y:019910�}�}ctc�+�� 2#"'664&'6�X}}X"BSSB�}�} q�q �� %264&#"7#'#5'753735KK5!))!�FFdGGdFFdGGd�KjK ?L? �GGdFFdGGdFF��6264&"#'#5'75373�jKKjK+dGGdFFdGGdF�KjKKjdFFdGGdFFdG��%264&##'#5'753735KK5�dGGdFFdGGdF�KjK�dFFdGGdFFdG��2"&4264&"%#'#5'75373�F22F2 jKKjK+FFdGGdFFdGGdU2F22F�KjKKj|GGdFFdGGdFF@@�� #!"&5577'''5463!2�@��@UV�@UVU@* @a�@VVތ@VVVAa+@�� '7622#"'2654��;���4&2#4!��;��&#2+++�� %7667#"'3&&7#&54''7#7'632�NN;L��O.C l��8f��O.C�N;L0�#�0��G��S(S=� �GO�0+U��#6264&"332#!"&54633462"�X??X?+�'D��D#(8((8�?X??X*��8((8(k�'+462552##5#535#"&5463"&4623#�IDI�@@jj@|""jj���+��@@+*+*�""��*k� $264&"72##5#535#"&54633#"}�@@jj@�jj�""���@@+*+*�U*++�� 35#5#'5#5#'5#5#3###"&5463354633232�++++***++++V��� U @++�++�++�++�++�++��@ @@��#+%53##52#5#5#546333#"&5562"&4�+UU+U�+UUUU�F22F2kUU+UUU++UU+�U+U�2F22F@@��!*36264&"62"&453##52#5#5#546333#"&55�""F22F2�+UU+U�+UUUU�""f2F22F�UU+UUU++UU+�U+U++�� 3!!"&57!'#!"&5463!2+*+���@V?�����*�UjO@@��4264&"&264&"264&"264&"72##"#"&46h-W-�Oq?,%PppCh�dG,>  p�p@@��77'%'#57'7762��)�OC)�e�)Ck�)��C)�e�)C@�� 2##5#5553#5#"&5463�jjjVjj++j�����+����@+�*+*++��6264&"2"&473##5#535��ee�eS�}}�}�VV*VVUe�ee�}�}}�V*VV*V@�'$264&"62"&4&&4673##5#535|WW|WE�pp�pU.'8HH8'�@@*@@kW|WW|�p�pp�$XI.dzd. @*@@*@@���%5!%2#!"&55463���*��������@U��%!2#!"&5463���*����+���7!##5#"&55#53535#532�VV*�VV*֫��*VV�*V�ի*�@k��%5!2#!"&55463���*�������@��k%5!%2#!"&55463���*��������@@��%!2#!"&5463���*��k*��U��*@@��#2#5#553##5'3#"&=4633##�+UU+U�UUUU+�UU+��UU+UU+U�+U@k��%5!2#!"&55463���*�������@@��%#7!2#!"&5463*K�:*���*���eL3C*��U��*k@��%#2##"&5463k���k*��U��*UU��%!2#!"&5463�����+�+��� !!!!!!+��V��V��V�+@+@*@U��7%!�xx�������+��@@�� '7627#�'P'2���P�Pj'P'2��P�++��"%3572#!"&5463#53533##��������+++**+UV��@**@��V��++++*U���
%#55733#�*@d������$$�*+��� 3#%23#5767654'&#"#476+��4V=�Y 
..*�K B$ a  1$U���%#55733##5#535�+@d�VV*VV��$$*V*VV*V+��� 03##5#5353#5767654'&#"#4767632�UU+UU��Y 
 .  kV*VV*V�$ a   $# ��Y�)4'&'&"327655432#"'&'&5+ 

   �XA((((98(9t>,;?��"%!2#!"&54635#53%!!"&5���+���+U��U���+��V��+�ի*����+U��(1%#546335#532##!2#!"&5463!!"&5k�+UU+���+��UU���+U+*+*V+��V��+V��+U��!%5%##535#535#532#2%!!"&5!2#!"&5463kUU++UU ��U�����+���+*++*  ���+U�+��V��+��!%!2#!"&5463!!"&5#7���+��UU��?L�;*�+��V��+V��+UqdK2��&%!2#!"&54635#53353%!!"&5���+���U*++��U���+��V��+��U�UU����+U��.%##535#53#32%!!"&5!2#!"&5463kUUU�V+��U�����+���+*�*+���+U�+��V��+��+435"&554633#32#!2#!"&5463!!"&5++VV+���+��UU��**U�*+*++��V��+V��+U��
#%#7#53!2#!"&5463!!"&5*UU�U��+��UU����**�+��V��+V��+U��%)9B35'35"&55463"&5546332#2#!2#!"&5463!!"&5++++ + ���+��UU��**V++�    ++��V��+V��+U��+45#72##535#"&55463!2#!"&5463!!"&5@++UU+���+��UU��@++U�+*+�+��V��+V��+U��#7@5!!5##5#535372#!"&546335###535#"&5546332'!!"&5���++*++*+��V@@@�U��@��Հ**+++���+�U+@��+U@@��%#72#!"&54633��������k*����*��@@��"+2"&453##52#5#5#546333#"&55�4&&4&�+UU+U�+UUUU@&4&&4�UU+UUU++UU+�U+UU�*%264&##54&#"#4&"3%#!"&54676632�&& D1:$)5+2F22#):?,��5KB0L-:X�&4& 1D/ E,#33F2�=*,?K51I'0I++�
!!#'#2#!"&546337��+`JKaV��VUUU�++KK��V��+UU���!77'+��*�`"<����Q��%!2#!"&5463!!"&5���+��UU���+��V��+V��+U ,,�� %+1777&7677673&"&462&'7#67&'7'&'5'67y%/?i/$3?r+)e&4&&4�)M+)N)M%/?i/%3?[+%)k&->3�4&&4&U/$3?~%/?3r/%3?�+%)1��@6264&"467'&&56&5467676'&'&&547�F22F2z-%"@@ ## @@""@@ ## @�2F22FT&E ;!%%#;;#%%!;;!%%#;;#% �� #'753'777&2"&43#7'7'#5'7#5�*�..�.�4&&4&���..U*'.����....�&4&&4*..c���.s**@��
3'7#'##7!335#g2E)D)E���UU�@]N*�++����++��'53''5#5'k!��V�OXM@j+9�.����Y��Ok�+k�335#��VV�@ժ�� @�� '+/%53'53'535332#!4633#3#"&5%5353�++�+*+�*�+��UUUUU+�+@+�**�++�++���*�+��+�++�++
@@��+/3?CG5!3335335355##5##5#2#!"&54633#73#'33#5##5335!#3���*++*++++*++��*++�++U*++*++�*�**��*++++*�++++++@��*�+++++*****+++UU��'/7?2"&42"&42"&42"&46"&4622"&462"&42"&4�""o""o"";""�""��""""o""�""<""<"";""�""�""�""<"" ��  $=%3'5'#'5'#5#33'!"&5'35!#'!2'5#'35#'5#'35#'U* J* JVVa��+��+UV�+J*+JV*+JV*UJ V�J V�VVa�6+J+VV*��+*VJ+*VJ+
++�� #35#5#5#5#5#5#5#5#5#2#!"&5463�VVVVV*VVVVV*VVVVVV��UVV�VV�VVVV�VV�VVVV�VV�VV���V��!0'#5'#5##53353'#'32'735#'532#'#5b6�H + +u� (  `++K  �c���I i55�++u�  ) `i -+@��@ +%5#72##553#5##535#3#'##532**  J@ + @+K  K �@@` @ �++�55�+

-++� ���6264&"62"&4$2"&4Z""F22F3!jKKjK�""f2F22F]KjKKj���$264&"62"&4&2"&4HF22F3!jKKjK�F22F3�2F22F�KjKKj 2F22F**�� 'L%7'6"264264&"&264&"'7'"264#"''"''&477'&47762762cNNM  I    $MMN�  eU\
TU]UU]UT\NNMNz  I    NMN#  4U]UU]UT\UU\@@��7!'#!"&5463!2�J*`J���*�`�`5*+U��#%!2#!"&5463#5##5#57#5���V���+*+�***��+��++++V**V++@@��"%#53733535#5#72#!"&5463kkk*��
+ ++ ���� J*��� ++ ++`��*���!77'+��*�`"<����Q@@�� $)%463"3463#463"#52653#5265##5+W>,?+&��aPp+W>,?��aPp�&@>W*?,&@a�+pP�>W*?,a�+pP&@@@�� -363"'63"'657'#47'#47'#527'#5277'65H9?/*B" �"�e=*++85BVE5)2"X " "+B" *?9*/��="2)5DVB58++*X" ++��2"&4��}}�}�}�}}�@@��(54&##3#3#326554&#2672#!"&5463@VV++VVV�� ++*++ ���*��� 2#4&"#462#4&"#4�Š+p�p+�zX*?X?*��aOqqOa5X>,??,>@@�� %5##5#32#!"&5463@+*+U�����VV�V+��*@@��!5#3#326554&##572#!"&5463@�UUU*���@+�++++���*@@��#'5#"3326554&##572#!"&546353@U**����*@+�++���*�++@@��%5#32#!"&5463+V+�����+�+��*@@��$54&##3#"35#532672#!"&5463@UU*�U*U��+++V++���*++��6264&"2##"&473##5#535��ee�eS�}�X}�VV*VVUe�ee�}X�}�V*VV*V+@��/%#2#5"&463264&#5"32#!"&5463373��->>-((((->>-���E&�&k=Z>&(:'�(:'&=Z>*�+++U��3#!"&546333'33'33�U��*@**+@+++@���VVVVV�@�� 3#"&4632�U3F22#�U�#22F3 k+��%3!535&&5462��ր6GX|WL�S**T S7>XX>9T++��%"&462%3!5#546332#35&&5462nYL8@�� @ �6GX|W9TS*jV V@T S7>XX��I�'7Ibb��bbb����U�'7'Հ�bb���bb@@��4264&"&264&"264&"264&"72##"#"&46h-W-�Oq?,%PppCh�dG,>  p�pU��7!'#!"&5463!2�J*`J����`�`5++��6264&"2"&4��ee�eS�}}�}Ue�ee�}�}}�+U��!2#"'&"#"5432276#"'632� `�` `�`N]XSRYXS���##:##7�U+�� 73&47##!"54764'&543!2�����##:#US�SRYXk `�` `�+U��2"/&4?"2764'��]]�]��VV�V�B�BB�B9r99r9@@��7!'#!"&5463!2�J*`J���*�`�`5*U+�� 7!'''7572#!"&5463�R@.@56��kmR7�� �*��V+U��#6264&"332#!"&54633462"�X??X?+�'D��D#(8((8�?X??X*��8((8(++�� 3!!"&57!'#!"&5463!2+*+���@V?�����*�UjO++�� $0@53'!!"&55375#3535#554&##326'54&##3532672#!"&5463+�+����@ 555k 5  �� @@u��*+K �* @@ �7 �*��@@��#%!2#!"&5463#5462&"&462���*����B<BL((k*��U��*��@&&`��2"&4264&"62"&'6�4&&4&X??X?�����@&4&&4�?X??X�XHHXXHH+��#"'732764'&#'727'5'�887Q1+ !>,++,>ZZQ��NNN���r8�88 ,+|,,EZ[E�NNN<���WW�� 5664&''77&'&'7#67?WW?.==.aa~09A+�`�`+G^GS_a��+�%._-&UW��  %673677#&'7'5&&4675h+r$0�+Wa.==.?WW?�.%�%G_SG^G+`�`B@@��%!2#!"&5463���*��jkkk*��U��*kUU���#%5##5##5##5##5#%2#!"&55463�+*++*++*+�����UUUUUUUU����0�� &75#"&6264&"#"'&5477632&&77}J"  C�  j�  ��4[���  �!A  A�� }�+U�� %7'#55372#!"&5463373@KK�KK�k��D'�'�KK66KK6��**+k�� %7'#55377'#!"&5463!2KK�JJ�kUU �� + �KK66KK6JV��VK  ++�� %$"&'3&"&462"&462264&"2"&4%J; � ����ee�eS�}}�}�)!!a�e�ee�}�}}�@@�� 777##73546335%&'����*U��*U�=�`��@�=�+U+U*�=���++��6264&"2"&4$"'75��ee�eS�}}�} LJj&ZUe�ee�}�}}�(LhL&Z�~�U\%54'&#"2766'432#"5%"3#"'&533254.'&'&547632#4'&%73#5

,{S)RS
, 9)&!# * !** �Ie+@�6$45   Gm9)nn5 
%'
   &:%��Y~��8^"23#"'&533254&&'&'&'&547632#4'&"&53324##5327654#"#47632v , 8(!* !** �*J/+ *. &
*0&*! 
%'
  &*%&"
R! & -$H@+��6264&"%"&4632753#5�|WW|W+*p�ppPA7�*+�UX|WW|�5BOqq�q+ ���++%��/%27''#"&547'537#5'654&#"'632'$�W�{628Pp ;�*+��* W>(" 0:C5U�")>XV��6 qO:0;YI�++L5B:0")>W *++�� !)%67#67#67#53&''3&''3&2"&4��p  >�� p>J?WW�}}�}�@>�@>��R`�`v}�}}�+��532#5#3'35#"&55#535#7#!Հ+�U+@@*�UU+@@**U+���+@@+�++@@�@@�� #533##53%3#5#53#533#3#3#@+UUU����++UU�**����Հ�@�+*+U*+�+*Հ+***�* @k�� #'+/3#53#53#53#53753'3##5353#53#53'53�UUU�V�U�U�U�VVjUV�U�UUU�U�UUUUUUUUjVV�UUUkVVVVVVkUU@k�� !!5!!53@��k��k��������U��!73'#373%3#'#'#"&4632373%7�(D+D)D',% &R1GddGR3 " �����*���� +4e�e@���NNU�#!"&54676632�):?,��5KB0L-:X*=*,?K51I'0I!��!%773#'"&546753#553'7p&@@k#KjK#��@�*�&&}&�+�:#5KK5#:g�++�??S'' !��#'77532"&43#7'7'#5#57'7L&&�*JjKKjK+@@;&&&�*�@{&t''5??jKjKKj +x&K&&5??�++y&++��5#772#!"&5463!!"&5�k56�V+���� ��U��*+@��7!''%2#!"&5463k*`J6 ����`@���*@��  $)-16:>73'''!!"&53#73#'#463#3#3#%2#3#'3##553#3#@�D5'`+�V**U++�+;****��++�+++�++�++++k[E.f�U+++++��+�+*+�*+�+��+�*++@��  ',049=A#53#5#57#46#5#5#5#5"&5532##5'#5#57#5#5�*�+�+++e***++�++��+++�+�++++�++++�**�+��++U++��++++��U��*++U++��+�**U++@��6264&"%2#!"&5463��dd�dk���KjKKj���*L!�� 7'77'7#53''3#5!j&D&B&y**�&�**�*V&$&��'z?_&[?ꀀ%17!##5#"&55#53535#5322#&&''267"#"&'3�++�+++���d� D5Q_Qd� D�+++�++ր+�+�c<`Q�6Q�c<`++��$,4234&#264&"73#!"&54633732'52#4&462"U*�X??X?�j��D'�5K;�(8((8�*��>X??X��+@gK5);��:((:'+�� $064632"264&"'535332#!"&=33##5#5�(((:X??X>+@�'D��+@@+@�:(((&>X??X�@@+�ր@@+@@++U��(7''7''3#!"&546333'33'33i,,,,e;;;;�U��*@**+@+++@,,,;;;+��@@@@@@@��"''77''773#!"&54633#!::::k,,,,*����+:::*,,,,�*+��k��73''72#!"&5463#3#3#��D6&� � j**V++�ZD.� �  ��*�� @+�� '6:'632'3'#&547#"7#7&'264&"%"&46327'#5:1$+
S<]�Feb=-!+�s+5m+5;|WW|W+*p�ppPA7t�gdL�m3�k/�iS�L�K4kX|WW|�5BOqq�q+ j++@@��!7!''73#!"&5463337#5#53533kV@*�@��@@*@@*@kjU@U�@@@*@@*@��77''%2'&5463���L*�����L���tt++�� %7'#"3537"''&47762+JJk *V�����JK5 U@���+�%-5=$264&"62"&4'#5'&54776323"''264&"62"&4$"&462v>,,>+Z>>Z=E/*E <) ,?-�>++>,Z==Z>\""K+>,,>�>Z==Z^1�j< < ) +-��+>,,>�>Z==Z�""U@�� 15!264&"264&"'5462##"&55###"&55&����+X�X  �  kk��3""3�&  &@@�� -!'#264&"264&"%##"&55!##"&5576332k* ���),  �  ,�`�€�  ��%����"575'&77546335332#"'"'#3#"''##532727�����(@�@(1%%`%%1V**-)UU)-**.('\'(�U**U��� c@@c �****++,,+U@�� )5#264&"'5#264&"2#!57"&554�k=Uk-�X, � ,kk�mkk�-"3�+ +�3U@�� 5!264&"'5462#!57"&��o""�X�X, � ,+jj�""�3##3�+ +U@�� )5#264&"'5#264&"2#!57"&554�k=Uk-�X, � ,kk�mkk�-"3�+ +�3���!3735'735"''&#"#3576"&462�<-',+- .G> o+&`""B�ӫ+��+@5*4"/dHI""++��''575575462���+KJ*���@�5u  u5*ku  ukU��2#5!#335"&462�#3+��++�<4&&4&k3#�@@@���&4&&4@?�� %&&'77'7 �&��&�
�#��#�q��p?{��+?��''77'&&'7''7'7F�Pj�#�K- �&EZ�;�>���pQR�{;"q6Z�.�0��++��%''575575462��+KJ*����5u  u5*ku  uk+U��3%!2#!"&54635#535#"&554633533#32##���V���+U@ *+U@ ��+���* @ * @ +U�� &%'7''763#!"&552654&#5463!2"LFZ!![GL���V�W:TT:W1F"UUUU@@��37!!3!535'5!��&��G�k�k��k*�j++j�++@��75!5#72####"&55+�+++2#�#3@++@@k@@#33#�@�� -8CN7!'#264&"264&"%##"&55!##"&5576332&"&54677"&54677"&54677k* ���),  �  ,�� Y X �`�À�  ��* 
%  
%  
% +U�� !5##5#3'5#3#35#573#5##35!U+U@**@+�@�V�@*k++@++@@@��VV@@+��7!2654&''!##"&'� �� m4& @��+�UVV�&:H+D�{@+��17="26447&546325462632#"'"&55#"&"&52463,,� ,   ,  �PpPppPp� ,,F!!
 
!!  �qOqOOqOqU@�� 5264&"5#%"&55##46332322655#"&547'7w  k�&, ��  "-+   jj;�k�U�` �$-+��#+$2"&43!2##33!"&5477'#2"&4Z""��F< L ���M+o""�""o* �#+
5���""@@�� %5#5##33572#!"&5463�UVUUVj���VUUVUU���*U��2#5!#335"&462�#3+��++�<4&&4&k3#�@@@���&4&&4U+��'-6264&""2646"26472#!"&54637"�jKKjK  3  ��Dx2FUKjKKj    7��V��yG2@��"&46263"&#524&&4&@PpoQQopU&4&&4qK�LL�@+�� '6265#"&5#6"342#!"&54633462�X?+&4&+�4&�U��*?X?�>,&&,�&�,??,U@�� +5#5#5#'5#5#5#3#5##5##33533�+++++�++++++++�++++�+@++U**V++�++U**V+++��++++�+++++��264&""''&5546332ht � $ � � ku $ � � � �@��264&##72###E@5KK5@U"V�KjK��@@�� %5#5##3357!57'5!7U@*@@*�++��++2�+@@+@@�*��++��*VC@@��7632#"&546332�0]/
$( �� K  ]0/
 K Ֆ ($ @+��6264&"&264&"&2�""@"""�M���""�""@U��U+U�� &%'7''763#!"&552654&#5463!2"LFZ!![GL���V�W:TT:W1F"UUUU+U��5'72#!"&5463�������U+kk+j��+@�� !5264&"5#72#!5#5463��   +��&U�U&�UU�  �jj�&�UU�&::��''7&6766'&47=���� L. @�Z�
����@ .MZF�+U��#6264&"332#!"&54633462"�X??X?+�'D��D#(8((8�?X??X*��8((8(U�� )$264&"7#3264&"%#"&5#"&5#5463!r@5_��K@+&4&�&4&++u�5��Uk&&&&�V@@�� 1!'#264&"264&"%##"&55!##"&5576335332k* ���),  �  ,5�5`�€�  ��++@+��627&&"6"264&2'&&54��.XNX�4&&4&��pQ>11>QzD&%�&4&&4PqOBf11fBO@@��%5'2'"54777@�� x�r x�rk�-�( ��)-, B)-,��'6264&"%3##5&&'#53667532"&4�|WW|WT,,`C*C`,,`C*C`�F22F2kW|WW|S*C`,,`C*C`,,`2F22F`@��''�����z@@k+�� 7!!3264&".5462k*��j"�@ +GKjKU*;""++u%%4|+5KKk+��264&"&2.54�,, |W,+4'  ,,�W>PF=EAR>++�� %5##376''&%2#!463�u+`5�&�+��U�++�&���U�::��''7&6766'&47=���� L. @�Z�
����@ .MZF�@@�� !7!'''265##526572#!"&5463k*`J6J>W+>,&�����`@ X>,?kA'*��*@U��%5#%##5##5#57!'!5�@+U�V���UUU����+kk�++���!77'+��*�`"<����QU@�� I2654&"264&#"264&#"73##"&55&&535&&535&&535463323�$$$$�$@$ � $@$@$@ � @$@�""�""�-, ,-, ,>��"7'77#5726323"'#5'6"&462ӕi"'*o ?G. -+-I""c+�Id/"3+5@*��*�""k+�� 5#5##335&2.54U@*@@*S|W,+4' +*@@*@@�W>PF=EAR>k+�� 6''&7'62.54>PGG|W,+4' _PGG�W>PF=EAR>@@��#''5��8�����8k+��"6274&"6"2654&2.54�n;4;f""i|W,+4' �.�DW>PF=EAR>@@�� %#7'7#57'53'73''7��1>=π1=>O�1>=π1=>��1=>O�1>=π1=>O�1>=@+��463#5#'53#5&&553353UA*56j*."5".+*+�7�V�k��"1��1"����U@�� 777#536264&"7"&55##46332322655#"&547'7�U+U+�  ;, ��  "-��k�K  /�k�U�` �$-@@�� &54633462"632##54�)� � ?X??XH4@!��9)� *NX??X?G' u++��"&.6%54&#"337335'26!467623#462"6462"�B>;E!$ < !+.�V.++����
 �  ��&&�! !.D-��-D�k3    U@�� 0$264&"'35#5#264&"2##'##57"&554>R+kk*k�SX, +*Q*0 ,55��UUUU�-"3�+ ++ +�$k+�� *%5#264&"7#3#'##57&&554677#53#k�]� +*Q*0" D;f�F?A�kk`&
**
"$�) *+��!(/3735'735"&''&#"3576"&46255#573#'7{;-%.+, -G1  p*&a""�55u5uu55B�ӫ+��,@7*".dGI""��%56& Z %56+��@#+2#5##5##54635#72#5##546;##5#�   �*5 * k�0 0@ k`KK`k @ @ k k ``@+�� 73#6462"#@���8P88PMu���.P88P8��k+��(%4654&"34625#2.548,>,&&&+|W,+4' �2++  =%%%W>PF=EAR>�� "I'5264&"264&"'3&5#264&"2##"&55###"&55&55463236`=MX??X>'��-�>XJ6  �  XS-�[$.k�>X??X�m+?�mX>8SB&  &�3#A+U�k256654&&"55&&54��}G9'/(RbR(</UUBSk?,!5 ,
  #:UVE 7$,+��k77''%2##"&463�ZL'&77&�&77&�ZK(i?X??X?����%#5373U�@�+�g��e�+���
$7!!%!4665!#!"&54'&''3533#@��@��B^_B��A �� l4<j*k$ �*U1BB� �?22WW�� ++��6264&"462"�jKKjKU}�}}��KjKKj#�}}�} UU�� #%53'53'5373#53#535335353UVVV�V*VV�V�VVV*V�VUVV�VV�VVVV�VVVV�VVVVVVUU��!'7���w��w*x��x��k+3��k+k++��
%7#&2"&4U��}}�}�V�}�}}���k@77�kk�kkUU��'7!5!'��w��w���x*x++�� %'7''72"&4kMMMMMMMM��}}�}�MMMMMMMM@}�}}�Ik��77'7���w���w��I�'7Ibb��bbb����U�'7'Հ�bb���bbkk�� ''7'77�wwwwwwwwwwwwwwwww���U''�bbU�bb���I'7b��bI��bkk�� 3#5#53#5'53#3#5+j*@@*j�j@@j�j@�@j*�j*@V@*jkk�� 3#5353#'53#553#5U@j**j@�*jj*U*j��j*@�@j*�*j@@��� !!5!5!@��������+j**k++U��+2"&462"&4&2"&4�""�""�""+""""""�U+�62"&462"&46"&462�""""<""�""�""D""VU��7#7&#"32673#"&4632y2�E&45KK5*B ,\;FddFGy2�E&KjK/&8Hd�d�Ub� '777'bbbDD�bbDD�bbDD��bbDD�@b� %7'77'7DbbDDbb|Dbb�DbbUU��7'#U��w*x��w��wk@��
353#'�M�+�M�@M��M�U@��
%'7#33'7��M�+�M��M�MUU��'737���w*x��w��w���� 3#%'7�++ ��b����bw��� 3#'7'7U++���b�����b��+k'+kk�k��@k75�k��k�+��'7���.�����-��}+��7'7}.��.��-��-�k��'264&"264&"7!547'76275!"&7  t  �=��=-1 D 1��*W|W@    W-KK--11��UU>XX@+��!%'73#5'7'753'64'7((<\\zbwwb�!V1
�)QQ)\\y�bwwb�d2z4*X*V1+U��6264&"72#"&463#53�""*GddGFdd***�""�e�ed�d@kU**++��%2654''7&#"62"&4Fe%�0r%�09FeS�}}�}UeF90�%�90�%e�}�}}�++��%654&#"27'2"&4�$eF<-i<-�$e�}}�}�-<Fe$��$�-<Fe�}�}}�@U�� -!'#264&"264&"%##"&55!##"&5576332k* ���),  �  ,�+`�À�  ��@@��!%5!2#!"&5463353353'77���*��+�+D-hk��U��*++++�D-h@@��'%5!2#!"&5463353353'7'77'���*��+�+�4444444k��U��*++++��4444444@@��#%#55!2#!"&5463353353#5+���*��+�+��**j��U��*++++�+++U�� %'7''772#!"&546337HH7?k���+�G0CC0G%��+++��7!''72#!463k*`J6���UՀ`@��U�@�&$264&"264&"264&"%2#!"''763�WY5��ss������+��*%54&"32##"&554635462'"!"&�U j ,5(8����  U U `8(@��@@��"0%2#"&54633276'7'7'7'753#5� �� K  //^/ $Z;;1
=..=
� K Ֆ ($ /\1/  �(p(y<<1Q=..=Q@@��#%2#"&54633276'5#535� �� K  //^/ $UUk� K Ֆ ($ /\1/  `@V@k@@��,4&#5234&#522#"&54633276@&,?*W>Pp �� K  //^/ $&+?,>W+pPK K Ֆ ($ /\1/  @@��:54&"32##"&5546354622#"&54633276�Z k , �� K  //^/ $�

U U
 � K Ֆ ($ /\1/  C�(%"'&'&55&""''&476 %#53#7�5 .h. 5i"�� �K`���5BB5d�K� `��@@�� $3#2#"&54633276#5�++ �� K  //^/ $+��v K Ֆ ($ /\1/   ��U+�� 5##5##5#72#!"&57�+++��UVVVVVV����U+��%5#5#2#!"&57***���jjV++@���++�� 5##5##5#%2#!463k++*++��U++++++��U�++��5#5#2#!463***���U+UUV++�U�U��%55"&5472'654&#'7UUFeK5FeK5UU�@UV@eF2)!5K+eF2)!5K@UV==�� #)'654'57'567'7#7&5477'67�33 &/�O2 �&/�33f
�33E0*4&/���2,�4&/�33E0* @U��%753756654'553'4677#7&�*�22H8&/%0U*�H8&/%0�22뀀�32F;\, B*5%/���++k;\, B*5%/�32k��
%'353#2##"&5463UUU@*V����VVjj�*�����+��!)2##&'3#&'54632#4&#2#52#4&#k-A�ja�*qO&@>W+>,���+*� ���bOq�&�X>,?@U�� -!'#264&"264&"%##"&55!##"&5576332k* ���),  �  ,�+`�À�  ��@�#%#2##"&54635373#53'53U����+++�k+k+k*��U��@���֫�+��+��++��%55#3572#!463�U�����UիDD�E��U���
/7M75"&55'73#"&54632####3232654754&"32##"&554635462�gV�+}XY}}Y!+ +� 
,/Y j ,A*fAa�Y}}YX}
6* * @/D�

U U
 *��k&&66!##5#%!532�&4&&4&��������#2&&4&&p*++j*�3 k��&&667'#5%%7�0303��a�0��-�"1030g(�(""`(_yB @��k
2!5335"&462�#3�*+�<4&&4&k3#�֖��&4&&4+@��%'#"&5533276%33#"&553�
OI�&�K H �t&��,>*� $�&��� e&+?,�@@��%2##5#"&55332%33#"&553�  `�&�k��&��,?+��&����&+?,�@@�� !33#"&553##57#"&5533232k&UU,?+?`�&�k* &+?,���@U&���+@��!*%'#"&''&67367'#"&''33&&66Z{ Q�##040>c�(<***$?#�` @~  %
."WU+3'��#
#U5��"*%'#"&55463323"'333#"&5536&462�Kl&9>8J�&��,?+/"TK&{!//O&+?,�""+U�� (5#5#5#7"3#!"&552654&#5463!2*****���VK**`**`**�"UUU+��!2#!"&54633'77���������FUUF+VU+�+�FUUF@��5!2###5#"&5463U����k�kU���+�++@��%!2###5#"&5463����k�k��+�++�@��2#5'5463353353VKjK*V*kuK@@KuUUUU+��)"&462"&462#5#76332#5#546332#r$$�$$�@@6  6@�� @ �$$$$�������uu�U�� 762&"62'6 &"k>�=*,~,+L@�ba+P�P�==+,,+@�aa+OOU+�� +%5#5##335'354&"2#!"&5546335462U@*@@*W�'6'��?X?�*@@*@@�++''F��+,??,+U�� (763&'77&'7!66&%2#"&54776k@\1%�  +'1 E3�*;�O=w- 4o�@=%
>*'<3;/9)-�
��
�@��#'663232'354&"'#!"&5547'7�';),?�t'6'�,�'(6?,+��+''��� +U+��
+5#535#264&"73#"&5#"&5535#'732k@@��UI  �*�&4&+�V@@��@@++�@@�  3*&&@@*@@+��73'#''#"&547'#'632'3�J+e�;6CX}&<VJ�6CX}&c�*��`<&}XC6;��&}XC6d++�� %5#62"&4k��}}�}�**�}�}}��@+� 3#462"�VV$$��g$$++�� %3#'&&46�lLLl�+Qoo�Ll�lL��Vz�z++��
%667#&73.2"&4:S��V@?i�S��}}�}WS:V�`R�:S3}�}}�UU��462"462"&4632#"�;V<<V$$�(((V<<V;p$$\8(':'+v��#&'''77&#"'6327�A%+VU� �U=;UI;HZfG=lI;H3.aV� �VFE4@OD+v��7'77'K �U��Uv �V��V@+�3?2"''"''"&55463353327#!"&553277277'"&5477�&" .. # -. "&k*M �� >K$$@&! .. .. !&++� b b � ??  +@��#'+/39%#57#55#3#3#5#5#5#5#5#5#5#5#3!3�+++V�+++++*******++++++++���V��++U**��+*++***V++U++U****V++U++U**���k��
$%2#54'6"2!5466"&462"&462UB8�*�8B7��8x4&&4%�4&&4&�$55,$55$:&4&&4&&4&&4��#/62!54%#54&"&462"'64'632'##5#5353�PX�%8@�4&&4&+

&&�@+@@+�#++++"H&4&&4&D&4&+@@+@@
@@�� #,%5#5#5#5#5#5#'5#5#5#73!357�***V*******V*****Հ���@@�++U****V++U++U**�++U++U**��+*@@++�� %$"&'3&"&462"&462264&"2"&4%J; � ����ee�eS�}}�}�)!!a�e�ee�}�}}�++�� %62#66"&462"&462264&"2"&4�J; � "���ee�eS�}}�}�)!!i�e�ee�}�}}�U+��%!5754675462"&53�+��+3--3�V�++j2J    J2�U+��!%54&"7!5754675462"&53U.N.�+��+3--3o"V��)77)�++j2J    J2�U+��'%'667372635462"&53'!57547'7��
-3n$V��6+��+<��   J2�:�9++k) ;++��%$"&537!5754675462&'7%#67$UV+��+3--3*FS��G+S+�j++j2J    J'V3@g�2Wg@U+�� $5#335#!5754675462"&535j;;j;�+��+3--3�V/&&I&&;++j2J    J2�@@��#2#75'3##5'7#"&=4633'#�kVVk�jV��Vk��Vk��V�k@Vk��kV+U�� /%2654'###7"3&54633&72#!"&5463373,?-&U!4,?-&U!w��D'�'�?,&+�?,&+@�**k��
$%2#54'6"2!5466"&462"&462UB8�*�8B7��8x4&&4%�4&&4&�$55,$55$:&4&&4&&4&&4k��)1>"264"&462&"264"&46254&#"#54&"%2!546326q"" >,,>,�"" >,,>,�G$& GHG++`�*`+/11u""\,>++>I""\,>++>�
 

`'::'UU��62!546"&462�lu���F22F2�/&++&Z2F33FU��$2!54'3##5#5353"&462
lu��@@+@@+�F22F2�/&++&�+@@+@k2F33FUU�� !62!54662"&4"!54&"264�@L?��?IF22F2�XVo&&�*@@*�3F22F�!  �&&U���7#53##5#5355`*6`VV*VV~��� U+UU+U@@�� %5##5##5#2#!"&5463k++*++���VV�֖�+��*++��"*%654&'####32325"&55'2"&4~-;0* *� �fW�}}�}�0C5V + + @T)fA`v}�}}�@�� #5'7'�+��V��������i�YRRVQQ@,��&%2"&547'#"&46327&5462#"'6�$%2%�&&�&4&&���%%%
X&4&W
&&4&X
XU+�� 72654'"&54732654&'�+; D<(C@Kd�dE,! )k;+,*) 5'�4�TFddFlR!.-"4++�� !)62#&"#6264&"2"&4462"6462"�J; #b# �ee�eS�}}�}j��)!**!We�ee�}�}}�0++��#6264&"2"&4462"6462"3#��ee�eS�}}�}j�~��Ue�ee�}�}}�0@ ++�� !)6273"&'3264&"2"&4462"6462"�b# ;J; #�ee�eS�}}�}j��*!))!�e�ee�}�}}�0++��%-62#67'7'77'7''7'7264&"2"&4�J; � ���ee�eS�}}�}�)!!TC�e�ee�}�}}�++�� !$"&'3''777'264&"2"&4%J; � �-.A.-r�ee�eS�}}�}�)!!x----�e�ee�}�}}�@@��77''%2#!"&5463���L*�����L���*@@��2#!"&5463!!���*��*���*+��++��6264&"2"&4��ee�eS�}}�}Ue�ee�}�}}�++��6264&"2"&462"&4��ee�eS�}}�}�X??X?Ue�ee�}�}}�?X??X+@�� %7'77�#t�<<�t#�P�e �� e�+@��%'7'''7'77PG^$�t#��#t�<<�0[>VCe�PP�e ��+@�� %'7''%'7'77PG^$$^G%t#��#t�<<�0[>VV>[�e�PP�e ��� DN2#&&''4##32765'2##5#"&53324##5324#"#476327"&'3d� E5Qo/$
/5#11 #HQd� D�c;`Q�9{"Y/ &�S 
  62  �Q�c<`@+�� ##5###5!&2"&4��+*+���""@�뀀+j""++�� !53#5!3#'3#���k*@@����@@�@@�k++U�j@@���@@�� %$264&"53#!"&5463!2#"3H5���*��G��+*�@@��7!54&"64&"2'463!2#!"&5�XPX�&4&&4�*���%%t4&&4&���++��627&&"6"264&2"&4��/XNX�4&&4&��}}�}fE&%�&4&&4f}�}}�+��%-9733!"&5477'#53367##2"&4&2"&475#53533#���M+F$
�K%R ��""�""�@@*@@�+
5�**+ M��#H""""�@+@@+@++��6264&"62"&47'5''7'7�|WW|WE�pp�p�UeCbbHbUX|WW|�q�qq�p2<�cR RR!S ++�� #3##5#535264&"62"&4%'7'7@@*@@)|WW|WE�pp�p�b�bb@@+@@+@�X|WW|�q�qq�L!S R R#+�� !1'7'32'#"&547''7''7"'632'654&���"W>4�L%/7GPp/�bs!**Pp! W����*5>XzL��%//qOF7.!S X qO,( >W++�� 77'7264&"62"&47'7'7�i�D|WW|WE�pp�phbbHb�j�D�X|WW|�q�qq�~R RR!S +�&2L5##5#7!47'&6632762"&554$2"&5545!##"&55#"&55#"&@V�5�4  A��U * �=&AB%  � ��  �� ��� KKKK ++��%5#75#72#!463***���U�++U����U�@��%!2#!"&5463#53#535������U*j�j@j,��V��*�@k+@k+@@@�� %5##5##5#2#!"&5463k++*++���VV�֖�+��*@@�� )5#5#5#"26472#!"&54633662k��֖�t  ���Y * @++U**V+++   ��*@@��-%54&""264&"26472#!"&54633662�XPX�4&&4&7  ���Y * k%%&4&&4{   ��*@@�� %264&"5#5#2#!"&54633662�  ****���Y * �  ̀�U++@��*@@��$%5#55"26472#!"&54633662UUkk   ���Y * �U@jk@   ��*@@��$%7#5##6"26472#!"&54633662k@V@t  ���Y * �kUU�   ��*@@�� #77''6"26472#!"&54633662ի�7�  ���Y * ���7�   ��*U��#'72654''"&54635�eFUU5Kq5KeFUU[)2Fe@VU@K5DK5!)2Fe@VUU�%3'337#!"&54676632+@kk@Vr):?,��5KB0L-:X�jjV�=*,?K51I'0IU+��7572#!"&5463�56���� �*��Vk@��
2'463k�����@@Uk@��%#72'463k�kk�����/��@@UU@��75#5#7#3#3#"&'#53&55#53547#5367'7627+VVV�-++-<;F;<-++-<#//#++U**�*++##++*#..# ��%''&'&&77'6�1�$Q ^@\&X k1� X&\@\ Q$U��3'34632&#"%##"'73265#�@UV@eF2)!5KV@eF2)!5K@UUFeK UFeK5+U��!!��VՈ����++�� 77''62"&4���L=�}}�}���L�}�}}�@��%#2#!"&54633#53#3#�����Ֆ�����k��@��� �  U+��7572#!"&5463�56���� �*��V+��� %7'7''77cc�����c�bb����b+U��5!5!2#!"&5463���V��V��U++Հ�+�@@�� 3#53!53'53������������Հ����k@��!5373!##"&���Jj���++���U+��
3'5#5##!"&5463vv@������@u�++U++U��V@@��/264&"%2#!"&55463264&"%2#!"&55463�""@ �� /""@ �� @""f � � ��""g � � Ik��77'7���w���w k�� 77'77'7 wZ�xY����w�wYĈ�@@��%5!332#!"&54633533#5����+��+�kk���+��*++�kk@@�� 2#!"&553!!#54637#53'7���+*��+l7��7kk���UU*UU��8*8kk++�� %72"&42"&4/Q�Q(�}}�}�  ѯQ�U}�}}�A  ++��/2####54&"#"&553264&##54633546232�  Q"0"Q !! V,V,V !! Q"0"Q   V++��&62654'#"'2"&42"&4&2"&4��en@!OS�}}�}
pUeFZP# F}�}}�S+9��%'.5463263250;C2:&&:2C4=E90.D71D--D1'T>>+9��-%>54&#"#&&#"2'.5463260.6+ +(+ +6.0`2C;05E=4C2:&&t+,<. ** .<,+ND17D.0>>T'1D--++��5#5#2#!463***���U+UUV++�U�U+��!6462"'654&"327#!"&54633�&4&&4�R?X??,^ ����4&&4&MR,>>X?_V�U6��!%'#"'5332673'"#66327#7&cgh(0>,,�6-'9+�':+T8=,,�6�hg,,�60%$�0%6J,,�6 @@��"&+/48<%5353!!"&553'5353"&53#532##5#46#57#5@+++��U++++�+U*�+�*+++++�++++*�+�+�++U**V++�+++�**V++ @@�� #(,075335375#2##"&554635353"&53'53'53�++*�����+��++++++@++++�������++++�*++V**kU��
7!!%'353k*��*��U��+땕��+@�� %7'77�#t�<<�t#�P�e �� e�++��$264&"&264&"264&"2"&4?, ,U,,U,, 3�}}�}�,,�,, �,,+}�}}�++��!654&"34623475#2"&4A2F2*" **C�}}�}#22#" ! !�**j}�}}�++��6264&"2"&4''7'7��ee�eS�}}�} 7777777Ue�ee�}�}}�7777777@��3'&2"'73264&"3''34 K[:�qq�8,=>XX|W@VS@UZ-7�p�p8,W|WW>VSP+U��
7#5#7##5#�j@��@jVU������+�� 75#'3!!57'U��UU��UU�UU UKK�UUK��UU��UU�+�� !!57'�UU�UUՀUU��UUU+��'54&"264&"72#!"&5546335462B'6'1""��?X?U+''+�""���+,??,+++��5#5#2"&4***C�}}�}@++���@}�}}�++�� 53264&"2"&453�*[�ee�eS�}}�}�*@++�e�ee�}�}}�À�@��75#53572#!"&553!!#5463���U���+���+�@*@U���VV,VUU4��%7"&477Z&L�2d�d2y^5Z&54L�2�dd�2y@k��##"&5546332x]] ������@k��%7'#%##"&5546332ULL� ]] ���kk��
++�� #+05=%364'#67#'64'#67#'67&''3&47#73&&'&2"&4]HH)= ?
d2 R 9
= =
PHH� R x =
��}}�}�,�8(R,,),,�($8�8$(*,�),,,8$(�}�}}�@@��3#5'7#53#!"&54633#+�+��Lj+������L���֕�*+��@��k !!5!%5!%5353'53�+��+��+��+++++k+�++V**U++�++V**U+��'54&"264&"72#!"&5546335462B'6'1""��?X?U+''+�""���+,??,+U+��!)%5!2#!"&55463354&"#462"&462����'6')?X?Z""U����+'',??,+�""U+�� #+%5!354&"2#!"&5546335462"&462��>�'6'��?X?Z""U��+++''F��+,??,+�""++��*%64&#"'&#"264&""''&5546332p[�t � $ � � �,[ u $ � � � ++�2#!"&5463353#35���+��*���U��U+��3'5#5##335#!"&5463vv@@*@@*��@u��*@@*@@*��V@U��##5#72##535!3#"&5463U@*@�UU��UU+V����+��+@@��3#5'7#53#!"&54633#+�+��Lj+������L���֕�*+���� %3'35%5#535#'775#7#+@kk@k@@�@kkU@kk@�@kk@@k@V@@V@kk@@kk@+U�� %%7'654&"32772#!"&54632"&4f>8P88(����, ,|>(88P8��k, ,+U��5!5!2#!"&5463���V��V��U++Հ�+�+@�� /%54&"2672##5665#"&5##"&5463373+""��->+2F2+>-�D'�'�UU��-G/#33#/G-++@@��'%54&""26472#!"&5463353353�XPX�4&&4&U��+�+�%%&4&&4f��*++++�CM$264&"7''##"5'&'''&774&465'&776677433276'"#&�o*
 *OB^��K%  %%  %�^B��k��%#2##"&5463#57#5k����***k*�����ր�V++UU�� !62!54662"&4"!54&"264�@L?��?IF22F2�XVo&&�*@@*�3F22F�!  �&&+�7!''72#!"&54633!!"&5�+K5K����+�����`@`k�*+��*+@@��!3#2#"&54633276��@� �� K  /0]/ $��@6 K Ֆ ($ /]0/  +� 35#5#26�****�x��vU+Հ�[��;Z@��%!2#!"&5463#5������U�j,��V��*U�� U�� #7'#'73�``U`8�U``U`8�����c�򫫫c@@��"&5472654''#5|Dp�pD7W|W7I*�:XPppPX:-G>WW>G,M��+@�� !5264&"5#72#!5#5463��   +��&U�U&�UU�  �jj�&�UU�&++�� '5264&"2"&4 `p1�ee�eS�}}�}kp9D���e�ee�}�}}�++�� ##463!22'#"&55!5k �U  U U�  V+ @ ��U +�@+��!%7777777''''''%5!5!5!@  ���+� �V �++U**V+++@��  A%5#&''7#5!"2646"2642#!"&554633&546327632�m-#@@#-mV��t  t  V��/&! !&Հ<W W<�j**@    ��&&@��
%5#5#***����VVU++@��k@��3'&2"'73264&"3''34 K[:�qq�8,=>XX|W@VS@UZ-7�p�p8,W|WW>VSPk+��264&"&2.54�,, |W,+4'  ,,�W>PF=EAR>++�� '5264&"2"&4 `p1�ee�eS�}}�}kp9D���e�ee�}�}}�@K��6264&"'5'#"&462�P88P8�j j&4:QQtP!�8P88P8j j!PtQQ:4&-+��?6264&"7''##"''&'''&77&47'&776677633276�>,,>,�-+ 5V5 +--+ 5V5 +-�,>,,>
# J8 8 J ## J8 8 J #@@��7GO$4'76''&&''&##"'&773327767776''72#!"&54632"&4p % < %  % < % &���""�4
'(34
'(3���*�""@��2#"'73264&"3'34"&462��ppPB3(/>WW|W@VU@�""�p�p(W|WW>UUP?""kz%'73#5'7'75353#53353=((=\\zbwwb@+�++*�(PP([\z�bxwb��++++++��%#2##"&546353#53#53U����+�*�+��U��U�++++++@��)264&5'75373#'!2#!"&5463&&o 5 5 5 ������@�&4&�5 5 5 5 A,��V��*u�� '7'537#553''7{tt!]]o*V+�+]]!tt���pp�********�pp��"�� (2#4&"#4''75&5462&2#4&"#4�Š+p�p+I@@I ,s|W*?X?*��aPppPa�FI@@IF $$�W>,??,>��
"-9E%53#5&3#5354623#53546253#5&&753#5&&3#535462k�+*V+�+  �+�*  �U�*+��*U*�+  �** ZZWU��U ^��U ��**-ZZ ** ZZ ?U��U ��
"-9E%53#5&3#5354623#53546253#5&&753#5&&3#535462k�+*V+�+  �+�*  �U�*+��*U*�+  �** ZZWU��U ^��U ��**-ZZ ** ZZ ?U��U k+�� 353353353#5'53546332�***+@�@��@****@@��@@��@��'3;$2"&462"&4264&"2"&42"&46##"&46332"&462>=��pp�p_Š�Š��@@��}�p�pp�;�Š�¡�}@��%!2#!"&5463'''%'#�������++U5555�+Vj,��V��*��66�V++++�6@@�� $(3#2#"&54633276'#5##5�++ �� K  /0]/ $++*@+` K Ֆ ($ /]0/  �++++U��#!53"&5472654''#553#53@+
Jd�dJ=KjK>-**�+++�4XFddFX4&H5KK5H%S���+++++Z�(2&"'662&"264&"72##"&5463cC8�8E ,|,Z;""k � E88E�,,�""f �  k��#'#5&&5326553#536"&5546253�K5*5K$C\C1+�*4&&4&�++6RFFR6/>>/��++++�&�&&���+++@��77'7353#!"&53546332���V*����V�kUk+++��++��%%7'5353#!"&553546332!#!"&55uuU+k��jU��U���U@k+++��+���@��
"6264&"'3'32#!"''&54633762�""�@of
( �� 6 f]�""�^^ (�� � +��#+$2"&43!2##33!"&5477'#2"&4Z""��F< L ���M+o""�""o* �#+
5���""++�� %5#5#5#'5#5#5#2#!463����kk*++++++��UU++@++@++�++@++@++�U�4 ��'7'3''##3��lN�X,Ux-m(m �mO�v�@@��++�� %'7''72"&4ZPi))iPZX�}}�}�gE `aEg6}�}}�@U��%5#%##5##5#57!'!5�@+U�V���UUU����+kk�++Uk�� !!5!5!5#5UV��V�����*�++�++�**+k��
"72#54662#54&"&462"&462�3�7B�JP�4&&4&v,,�.05$ 00`&4&&4;, ,@k�� 5#5353#'�U��֖�U@U@*@�@*@Uk@�� ##5#3'353�U@*@�@UU@*�U���UU�++�� %#5##'3353'&2"&4u5+5K�5+5K-�}}�}�UUK�UUKJ}�}}�5��2#!"&54633#!#5'3533�������@U@*@���+*��+*��U��@��%5#5#2#!"&5463������k�U��U��*@��  ',049=A%53#5375353535353532#5"&53'535346353'53k*�+�+++��***++�++��+++�+�++++@++++�**�+U++��++U++�+++U���*++U++U+�**U++U@�� +5#5#5#'5#5#5#3#5##5##33533�+++++�++++++++�++++�+@++U**V++�++U**V+++��++++�+++��3#2'&557#"&57#547763�VVU � �A
��� � b)�@��3##"&55477323�A
� � ��*V+)�� � b��/2'&5667#"&5547763'##"&5547732� j o 1 P1 � j o + � i
4 qUq � i
4 @��k %53'3#53!5!%5!%5!�+++++��+��+��+�**�+�++++V**U++@@��3#5!2#!"&5463353353�kk��*��+�++kU��U��*++++U�� &&467264&"62"&4@/&8HH8&�jKKjK:�ee�e*TB ,\v\, �KjKKj�e�ee�++��5"&4633"&54752654'7"&546752654'�>}�}}X"$2F2&KjK=.?We�e2�>YX}}�}�  -,#22#!&45KK5/G+`AFeeFG2+��
#%3'7#'##''7&'367#53533#SE#`+e+`MBkm(+.��*�?5�]9�@@l,Bjk,5(3?+**+P;+���
%7''777U1hU��U�1�1hU��U�1�@��U5!5!5�U��@U@*@+���
3'''77U�1�U��Uh��1�U��Uhk@��
2'463k�����@@Uk@��%#72'463k�kk�����/��@@U@��77''&&55ի�7��nRRn���7V�Y��Y�+@��2#!"&554632#!"&55463� �� k �� � � � � � � U��� 733#!3��@@��@�������+k�� 3#!533�UU��U�����*@��U��� 3#!333Ukk�kk�������+@��!!2#!"&554635!+��k� �� ��@+ � � ��@@Uk�� !!5!5!%5!UV��V��V��V�*V++�**U++Uk�� !!5!%5!%5353'53�����VVVVV�U�UUjVVkUU�UUjVVU��� 3##5353#53#53'53Ukk�kk�k�kkk��������������U��� 3#53!3353����k��kk������뀀U���!!5!Uk��k�����+k��/2##"&546332##"&5463#2##"&5463 @ � @ � @ � �  �  �  `��2"&4264&"62"&'6�4&&4&X??X?�����@&4&&4�?X??X�XHHXXHH+��%532'327'#"&547'7&&'#"&'67&&"'632'654&�&� ?,!&�z5+2O�7 +�.'.O1>?@&3,? !&���4XH>, ,7.XH;*>,?+@��  A%5#&''7#5!"2646"2642#!"&554633&546327632�m-#@@#-mV��t  t  V��/&! !&Հ<W W<�j**@    ��&&++��5!5!2##'5#"&55463���V��VVUUV+��k++�j**j�+@�� -%5##5##5#5!352#!"&554633546332�@+�+@V��k�k��@�Հ****�j**@+++��+++@��5#32#!"&554633546332+V���VV�++��+++K�� %'5'#"'73264&"3'34632kjk&4&! (88P8JXR5R9:Q"�j k!8P88(UU9RQ:3'kk��!!!���*����+*+@��#%''77264&"332#!"&54633::::GX??X?+�'D��D�;;;P?X>>X+�++��#'2#4>54&"#4264&"2"&453�F2@*"*�ee�eS�}}�}�*�2#9!#�e�ee�}�}}��++@k�� !!5!5!%5!@�����������*V++�**U++@K�� %##5#53533264&"'5'#"&462++++]P88P8�j j&4:QQtP!+++++k8P88P8j j!PtQQ:4&@K�� 3#264&"'5'#"&462�kkP88P8�j j&4:QQtP!@V8P88P8j j!PtQQ:4&��@+5#72###553##5#53##553#5##53�++  + u` �` U +  5  +� `` `` +�55�++@�� %#5463323#%3#5!#5#k����@@j@@��V@���j@@@���@@5@��%&''55'!!+R|"j);q  ����j�
n2� � C+'@��&'77'776!!� |Rq"1*jX)�r �x��j?!
T � ��+�U�� 732653"&733'3�+2F2+KjKk*K``K�#22#5KK�w``k��@ ##3##53#2#353##"&5546;#�@++ `� J* @ u   +� @ + V �@@��%5#%2#!"&5463k����**���*++�� 77''5#2"&4܏q)���}}�}Տq)�++U}�}}�ZR��$64&""&4653#5!#35DDaDDnXX|VVlUUUUU�DaDDaD
X|VV|X@U��UUUU++��/6264&"2"&4"32653#"&5547632#4'&'&��ee�eS�}}�}�((&(*&!&
Ue�ee�}�}}�:: 0*)

>+��6Je|�%#&'&54622654&#"'&476632"&54&"'3262#"'&5432"'&'&5462"54&""&76762'&'&&%"'&#"&47632>.!.&6'&[@.L W4Ig'6&&(* =7)  (3
9GdG:R: � 02x21
-.l.-,;<A6 :GA@+ !.A%%<V/'#(%
 -N-6cE$$8(  �%6 #: �(4/DD/
'77'0"
.-
 '(p  �� '7'7%!!Rx<y�x<yZ<.<�w�6y<x�y<xZ<��<+k+�� )%654&"35&2##"&55&5453##"&=.?X?.Vi|W@ � @U� V � 7,??,7 11�W>N,1 1,N>�� @��%!%#!"&5463!2#5�������V�j,��+���+� $(83'7'3772#5!!#3#535#"&54635#72##"&55463�A5455A�*��++�+��kk k @&>''>&@Ukk�++**+����� � � e��,%##"''76323546232'&546254&"� � j
Iq+8P8* ,� q  j��24(88(5Pk+��-5%3#"&5467326'4633"'32#5#"&54462",:',>0%&!6*$282@*k$$�%0>,':,!&� '*)Iuj�$$+k�� %'73#55#5@UU���UU��UU@*V@UU@*@+��#'%5!2#!"&5463353353#5##5##5���*��+�+++*++U��V��+****�******++��%66737&&'5'&&4670I@hP�I0Ph�2NN2QooQlH0Pi�0HAhPVlVAz�z++�� %6737&'5'&&467 �iO( Oi�QooQ� Ml� �lM("("�z�z @U�� #'+!!53!5353#53#53#53#53753#53#53@���ի����+�+�*�+�+�k�j�k�VU++++�++++++++++V******@U�� !!5!5!%5!@�����������Vj@@�@++k�/$264&"'#53&&#"3267"&547##"&4633'#53{4&&4&�<<!&&!�)8>Z=;#9'->>-�+L^�&4&&4+&4&�<+-==-;%0=Z>+*U2��7!4''7"&5477�&ZZ&�2d�d2y�7&^]&H2FGddGF2y+*��+3;CK%&##"'&'&667667676363226462"&462"&462"462"r     'SS' 
!
  ",,,,�,,,,� *
** (  (Q, ,u,, ,, 6, ,�+U� %##5#5462&462"U@@*&4&*�$$�Vjj�&&$$@��'64''64'2!546462"�>>#,,# $�lu��V2F22F�A�>"3�0%#X $-�/&++&�F22F2 @@�� #'+/3#54&##5325335335353#535353'53533#�+&jj,?��+*++*�+�+++++++*++++Ujj&+?��++++++U++++U++�++V**V++*+U��"'%'5'#56776332'532"&4#'�@@� 8L� Q""`6+K @@@ �.!{L1 �k""��6J ���3#"'"&547'"'"&46327&5462627&5462�L"7
a"a"6L"f"L7a"a6K@@��'5#7&&27653"'&4627 J[Ց;,{,+V|,++88�88p�8:UZ-7j-<,+,xX,+=O7887�p8<++�� %7'5#&2"&4Z` C�}}�}�:o��}�}}��,##"''636325462354623546235462�3#�$�
\���#2�4�  ��˶  �v @@��'%27#"&'#53&47#536632&#"3#3#@3'&6J>cKAAKc>J6&'3'B{��{Au"&1H8++8H1&")"++")��7K%4&##3533#'326'672654'#3#"&546327&#"2##'#"&54633� �a)$FB*� � �.9d? ''),>>W���K* Q2(FBB6 �2"(s:.% ((?X>��@@@��-62"&47'!23'#'#"&547'#"&5477''7�""�� L �l+2L= �/^�""�� �++#�= 
5c^U+��%%264&#"'3'632#"'##!"&5463,??,: U".,,'% 5L���?X>1U"(+>, #U��V�� 2'35#'35#'3'5#'#'��i���~)++++e�z�U+���++)~�+k++�FzUj+k@��3!537377'7''!##"&KJ��Jj�.-------S��++�.----...��@+��"&462#5##&'72""� 2N+*+N2 N��""+�뀀+++��6264&"2"&4%'7��ee�eS�}}�}7�jLUe�ee�}�}}��kLk@�� 3!537335!##"&KJ��Jj�����++�����+� '77'�Z���ZZ��Zx�Z���ZZ��Yx@���!!@����+�@�k7!!��k+++�� 77#53&2"&4�hHjJM�}}�}UІ��}�}}�++�� 7535#57#376"&462�UUK�UUKJ}�}}��5+5K�5+5K-�}}�}U+��&.%2#5#"&77#'76332"&463"2656462"k*k
'/) o
$?X??,&&4&@$$�uk)W! &(NK,>>X?+&4&&�$$+��%!2#!"&5463353353���V��*�*@�����U++++@k�� !!!!!!@����������+*k+*Kk�� 77'32#Kgg� ]] k����k@��%3'33'!##"&5!5373+*UU*V����Jj�VVU��@++*+��
%/%267&#"'47&#""264"264'2#"&465W4A((D:&**_""vX}}XY}}U=0WX#&8 **""�}�}}�}@[�� ###5'7'�@+*+kk*�//��@��
�P(e,j,e@[�� 7'33373'7#'##7�@+*+XP(e,j,e[@
��ek*�//�7@�� %#7'77'77'7''70Z��#8/*_K/�@���8h�/L ^I@�� ''7'7''''����8h�/L ^9Z��$80)^ L. �@[�� 7'33377575'5�@+*+kk*�//�[@
���P(e,j,ek@�� %5!5!5'3'7#'##7�@��
�P(e,j,e�@+*+kk*�//�++��+#'#'#5'75#'7#53'735'753737�YEc+dE*Ed+cEYYEc+dE*Ed+cE*Ed+cEYYEc+dE*Ed+cEYYEc+dEk�� /3'#264&"'5#264&"'35#%#"&5#"&5#5463@kV(@UN UU+�6&4&u&4&+V�wVV�wV*�j&&&&��s'2"''7264&""&462'&"27677]`CC`" <**<G<!`CC`"!<**<G<sD^D"*<*>5!D^D"*<*>5@@��&&6&&7&474367t2�>0s1z11 2=??FbQ8��D2 11z1s0>�2=?�?F8��+@��+5#32##5##"&554633573353#!"&553+V��V�U+U+�V����k**@++@*++*�UU@@��'7264&"264&"&264&"&264&"264&"2#!"&5463RNN��@�NN�.��*@��%CKS73"&26723264&#"#&&""&#"3263%"&'&&'&4766767632$462"6462"�� 4@4!fO  OfO  k _r^!!6I:]!��[�##M</"/<</"/K%/??/% %&0>0% ++��(-$264&"264&"%#"&'##"&547'#53!'2#^�+*-),'-/J7�Gd�UE!+%%+,^++9�dF++��%'''7''7'7'7777�--L�L--L�L�--L�L--L�LU@��7!!5#72####"&55UV��V+++2#�#3k+@@k@@#33#�U+��"&5473462"k�.<KjK@+��B� %��}++��"&*.BJ#76'&773#76''&7735##5##5##5#73#!"&55354632&462"9!)")W"("( *++*++*����@u$$� / ". !. ". ���������!d$$U+�� 3#3#5!5!2#!"&5463�****����k@kk������V+@��Q�462""'&'7'&#52#"'&""'&#"#"'&#"#"'&#"#5276323276323276323"'&#"#"'&#""'&#"#527632327623276323+,,�  E 5)4� 2                 0     0   u,, UE 5� `+�++k��!667&5462!!'?V��V?"���VZ aAAa
�*+��)-19%'3'"&463"332#54&#7#54&#526533#73#%7'#53k??6**!, <% 1$ ' 5 �vk�Օ�?[+:* '"R:$,,$3 �@@@����@+k��,0482#54&##"&463"37#54&#52654&#523#73#%!!V+ !**]% 1$*' 5 �v@��&&#+:* 5:#00$2  *�@@@@@++��&'672663&'&&J* *CC��Dp!!pD_LL_3""_CCgB33BT��+�N#'"/##"/##"57###"''##"5'75&5!7&76'&'"'&743� /
�#" 0/  $ )> p�Qb�BDf'<8R� " %Z ` ` | R� ` � *�Copyright 2015 Google, Inc. All Rights Reserved.Material IconsRegularFontForge 2.0 : Material Icons : 6-9-2016Version 1.015MaterialIcons-Regular��2�� '(
4latn��size�
,latn��ligao�:`j
jt�"V,�.d0\2�4~<�@�D"D�O O�T�c�h�iHm6o.o\  !! }T�� X���.\���0X~���6Z~��� @`�����0Lh�����"<Vn������(>Tj�������  " 4 F X h x � � � � � � � � � �� ! #" "!� !  "� !  � !  � !  %!� !  %!� ! ! �$  $ "!  $!� !# ! !"  ! !"6 ! !!� !#�  "! !  �  $�$ $  � ! ! ! !"   !� !& $�  ! !�$  $� �!! "! �! "!!�  !! ! ! �$ $$�$   "! �  " #� $  "�  ! ! � $ $  !&�    ! !� $ "$ !! &o  !g  ! "" "!�  1   ! !!  "! %�  !V  !� $ !�
"!�
$ �
 �
 Z
!!!
!�
$ !
 !+  !�  �  !!    k ! ! "!$� .# !  � %�#`&� "!� "!�" !
-"� {!��7p���8\����"Bb�����(B\v�����,F`z����� "8Nbv���������!!&  "�"!! !�"!! v $!�"!!  �! " '! "!�! "!�"  !# #!�! �"!! "�!!& "$ �! $  !!� " "� !!& !  � !
    � ! � ! � ! � ! � ! � ! � " !�  �   !  !&� !!& "  !  "!� "   !� !!& !"
 !
 
" !4
" ! � "!!�  7�" "  �" "�" "�Z��@j��� 2Vz����:Xv���� (D`|���� :Tn�����2Jbz�����.BVj~������&8J\l|����������    & 0�! ! "!� % "! �  "!)! �   "!�! " "!�! " !�! ""  g! $ �! " $� #$ &�! "�     !&� $ � &i ! !�  � w ! !^" $/  !� !&� !! �  !�  �  !!�  #� ! !� # !� !!  !�  !\ " � # !� !! !  a " "� !! &� !! "!�  �  � ! "` " ""�  "% ! /  !!�   �  !#� ! ]
" �
 �
 !�
 �
  �
 !� &!�  %_ " �  �  �  �   �'�
�  �  � |!&� j"!�!! ��!�!��� �["�# � $�h !�!��3h���$Hj����.Nn����"@^z�����&<Rh~������ .<JT^f� !  !" � !  !" !?! ! !>! $&=! "$&� !  !" � $  >! !<! &<! !@! $9! m# l ! $$ ~!" ;! �# "$�# :! " � !  !"n! "�! "!�! #� # !�  "!� ! $(  !� "! � "! M  k  ! 8
! �
 �
# "�
! �
! " �   "� # !&  + �# �! ��'�! �'!n*�#) @p����<\z����4Lbx������ $0� ! ! !� &!�% " " �% " " �#! #�% " " �! !!"! �% " " �% "  �% "  p ! !)  "!� % " '- %! ! � % � " &� %  �
#! !u
# !!�
#! !�
#! " &/ %! 0 "'1%!�% ".%�!,#!(��!\��*\��� 6`���&Lr���(Ln���� *Hf�����.Jf�����8Rj������*@Vl�������  & 8 J \ n � � � � � � � �

.
<
J
V
b
l
v8! !%!!  ! 7! !%!!  ! W!  ! " !.! !  -! !  1!  ! "!6! !!"2!  ! "%!  " !&0!  $!  !�! ! " l " +!   !m ! '!  !x!" &  !�! !! !,!  !%!&!  !9! "*!  9! "2#! "!2#! �"  %!�!   $�! !�! !y!" #�! #!�  !� � ! " b  $� ! $/ ! !f  � !  7  ! !N !  3 ! !6  ! ) ! � ! 4 ! "!5  4   2  ! $� ! � !  !� !5 ! 'e  � ! ( ! 3  ! $c  "b
$ a
$ �
! �
  "!�
" �
 ! �   c $ u  i  $: "! h  #�!
�! �! �! 3�! �! �! �  1#!� !�! �! �$d�!A!��"��0,H`x������ 0@LXdp|��  ! %�  " � ! !�
 :
" $� " �  %� �!� 8! � !"o� 9�#4 ��"!�2Tt�����(<N^n~���������<! #?" !&@" "< ! 6  "!&�  "!�  ! q  ! �
 !O !� $= !&�! !"p !5�� � A!! B!�!!>;^,\����4Tt�����0<HT^�!!  %�  ! != ! # �#!  �!! # ? ! #!!E#!  �! !! > ! !< ! !E #!  � ! %!C  "!A  ! !;  ! !@  ! D"!�%�B�  Fn���&Fd���u& $ !t& $ !s& $ $w&  v& $ "x&  �& !z& !"|& #y & { & !r&�!Q��(Nr���$Fh����$B`~����
&B^z�����0H`x�����4J`v������,@Rdv�������� $.8BLK # !R "& #O & !�! \  ! N  !!�!  �!" "!~! b!  !&G !!!] ! ^  !"!] ! � !!G !#!&` P  !�! $$ X &J  $ W  0  S  &> & " = &  � ! !&E  !G  "!M   !M  "!^  D & � $ !&U  # P  � ! Z  ''L  < & �  #Q  !V  Y  �  $!� ! T
 I
 
! a
 !%[
 &�
 !&H  F  !�  ! �  !$L  �  �  � # _  � � H"� � �# !#� N&!&� I"}!C& �"� F�J !K7� +X����4Vx����*D^v������$8L^p����������
�  O" %~  # � ! �  "!=& &  �"!! ">& & " S!'! �"! !�# !<& & � # ! %�  "!C  !2 # !d & !n "  #�
!&B
 !&�
 '�
"�
"  !L & �  #!D  !�  9 � �%'�'� : �&�" ;#���"�c8� :h���
.Pp����8Tn������",,!! !!�!! !#�!! " }!  ! !�!! �!! �!! #! �!$ @! ! !�  &!� !! � !$  #! %! $ $ !" ? $   � !$ $� !$  $ $! e
#!� %! $P! q � !"z!2Pl����Q  $ � #� "! �  !�  R   $S  $!�!&W��Br���&Nv���8^����8Z|��� @^|����0Nl�����0Lf�����2H^t�������  " 4 D T d t � � � � � � � � � � �
*! ' ! !"+! ' ! ,! ' ! � "!! Y # !�!"  !" !W !! C"   "!F&  "!B"     $  '!`$ !! $E&  � ! "!p& !  ^!"  !"X ! !!r    #!�! $    &E&  Y # W !!   &V  �  � $� !"�  #� � "!�  "!]  $\   � � ! ! !"  �! $� !& Z  !!&� &  $�  �  j & ! & ! &�   !�  " �   �  �   ! G & ! 3 ! ! ! "� $ "!D
& $[
 �
  b
  �
!& �  !� f !!�" � !T#$U&!E" !!_&�"�� a!A" 
!�$g�� ���! <d�����" !! �" !! q"" & %!c" !  $b "& "I "" " H"".^���8^����&Db~����0F\r�������&4BP^lz����� "!! "�#  "!!!   $�#  !� "!! � !  ! r#  ""� # #� "!! i !"! "� "!! �" #  &f! � # K ! ! �  !  !! !�  # !! !h ! #$�  #"t
 !"!�
! M
! � & e & d & � # "f& � �g !d!� �$L!�!�#�"!eN&�&Jh�{�P���P���>l���$R~��.Z���,T|���<`����8Z|����  > \ z � � � �
(
D
`
|
�  $ @ Z t � � � � �   2 H ^ t � � � � � �
 2 F Z n � � � � � � � �
*:HVdr~������������
+ " !  !!  �!! #&  ! !! & ! &t!! "!  !s!! "! !�!! #& ! �"!& $ !�"!& $ !m!! "  !�"#  "  �!& &  �!& "!  r!! "! ! $     "  �$ '! �!!  ! v!! "! #l!! ! �!& "! !!  "  �!& & !!     " "k!  !&  !!  !!�$ #!   " p!! ! u!! "! �!! ! n!! "!!�"#  "! $  �!  q!! !!�!! "!w!! # � ! s$ ! #�& ! "! !p!!  &�$ #! �& ! "! !#G!!"  !!~  ! $ z!! !�  !U"" "y!! $x!! {!! #� & ! "!�  � &  �  ! �  "_ ! & �    $! 5 "!!   !Q  #" o !! o " ! � &  ! "! $! #�  X !! ! ! �
$  �
 �
!�
$ '�
! 
 !v
!!#$
!!�
�
$ !Q
! !%!�
   $� $ #!P  %!F  T "!!  ! j !!� } !$i"k!! �# !�"!&� !�"!��O"jR'�w"$&��!�! Y!&�S!�!!�&�#|� 6n���(Nt����2Nj����� 8Pf|������,>Pbr���������� (z  $!  !!�%! !! $�%! !! "�%! !! #!�%! !! $�%! !! � ! !%!� "!�" " $�%! !! "�! � " !�  ! #�  $�  !� "  !�   �   &R %!  �  �  "U  !� %! !�
! �
" $       !  �  !� " � " �!  ��" " !& %!"�%!  lm�!�&T!x��& y""���#&>R`j�  �   � #�!� %Lx���.Lh����� 8Ph������2FZn������I!  !H!  !!J!  !V !#$ !�  !� !& � $ V  &� $ " �  " $ $ !X  � $ !� $ "|  � $ "� $ Y " $Z " "!�
 !&�
$ &{
 �
 !#
$ &�
$ "![
" � !� $ $� $  !� \ " "-!!�$ &W� � &0Tt����*>Rfx����������!  '  !�! ! !!.   !� ! !#� ! !t   ! K  !%!  &  "&�! !( "&! % "!�*�!��]��"!"  "4s  "! � "!� $ &'

132
AwesomeUIWidgets/Assets/Resources/assets/messages.json


{
"author": {
"firstName": "Alex",
"id": "b4878b96-efbc-479a-8291-474ef323dec7",
"imageUrl": "https://avatars.githubusercontent.com/u/14123304?v=4"
},
"createdAt": 1598438797000,
"id": "e7a673e9-86eb-4572-936f-2882b0183cdc",
"status": "seen",
"text": "flyer chat",
"type": "text"
}&
{
"author": {
"firstName": "Alex",
"id": "b4878b96-efbc-479a-8291-474ef323dec7",
"imageUrl": "https://avatars.githubusercontent.com/u/14123304?v=4"
},
"createdAt": 1598438795000,
"id": "e7a673e9-86eb-4572-936f-2882b0183cda",
"status": "seen",
"text": "Dolore labore ipsum aspernatur. Omnis minima reprehenderit perspiciatis sunt rerum facilis consequatur omnis. Rerum totam est eos dolores quia qui aut. Rerum aperiam alias placeat odit non enim corporis unde molestiae. Aspernatur unde praesentium eum ut laudantium ea enim.",
"type": "text"
}&
{
"author": {
"firstName": "Alex",
"id": "b4878b96-efbc-479a-8291-474ef323dec7",
"imageUrl": "https://avatars.githubusercontent.com/u/14123304?v=4"
},
"createdAt": 1598438794000,
"id": "dc1a5e87-bd4e-46b0-9cb4-7d9abeda5ef8",
"status": "seen",
"text": "Ut modi corporis consequuntur dolorem omnis asperiores unde voluptatem et.",
"type": "text"
}&
{
"author": {
"firstName": "Alex",
"id": "b4878b96-efbc-479a-8291-474ef323dec7",
"imageUrl": "https://avatars.githubusercontent.com/u/14123304?v=4"
},
"createdAt": 1598438793000,
"id": "2a202811-7d48-4ae9-8323-d764a56031dc",
"status": "seen",
"text": "Voluptatem voluptatum eos aut voluptatem occaecati. Quia ducimus vero molestiae molestiae illum illo nisi autem. Labore consectetur expedita illum consequatur inventore consequatur quasi voluptatem. Perspiciatis ut reprehenderit officiis animi voluptas.",
"type": "text"
}&
{
"author": {
"firstName": "Daria",
"id": "06c33e8b-e835-4736-80f4-63f44b66666c",
"imageUrl": "https://avatars.githubusercontent.com/u/33809426?v=4"
},
"createdAt": 1598438792000,
"id": "0371b8f4-314a-448e-85ba-9c7dc5ed7a1e",
"status": "seen",
"text": "Qui ut nihil facilis quos.",
"type": "text"
}&
{
"author": {
"firstName": "Alex",
"id": "b4878b96-efbc-479a-8291-474ef323dec7",
"imageUrl": "https://avatars.githubusercontent.com/u/14123304?v=4"
},
"createdAt": 1598438791000,
"id": "db334c22-1fc4-4951-86b2-1eb7f7262743",
"status": "seen",
"text": "Voluptatem ducimus quo vel sunt. Vitae illum recusandae fuga eum adipisci cumque nam dolor. Aut quia et ducimus a et voluptatibus quo saepe. Vel qui ipsum assumenda quibusdam necessitatibus. Et omnis consectetur ad quod fugiat placeat omnis eligendi aut. Deleniti aspernatur corrupti beatae est et cumque architecto cumque et.",
"type": "text"
}&
{
"author": {
"firstName": "Daria",
"id": "06c33e8b-e835-4736-80f4-63f44b66666c",
"imageUrl": "https://avatars.githubusercontent.com/u/33809426?v=4"
},
"createdAt": 1598438790000,
"id": "f61a1924-e043-409f-9051-78ebfc68507a",
"status": "seen",
"text": "Est maxime accusantium commodi voluptatem sed. Ut nemo vero ut voluptas qui. Eaque nulla quia pariatur sed qui iure. Odit expedita voluptas quia consequuntur consequatur qui laudantium. Iusto ut voluptatem. Omnis et eos asperiores modi totam quisquam nemo.",
"type": "text"
}&
{
"author": {
"firstName": "Daria",
"id": "06c33e8b-e835-4736-80f4-63f44b66666c",
"imageUrl": "https://avatars.githubusercontent.com/u/33809426?v=4"
},
"createdAt": 1598438789000,
"id": "d46ffcb1-9340-4c60-8b8c-c9d17539b0c7",
"status": "seen",
"text": "Fugit sed tenetur eaque perferendis est impedit.",
"type": "text"
}&
{
"author": {
"firstName": "Alex",
"id": "b4878b96-efbc-479a-8291-474ef323dec7",
"imageUrl": "https://avatars.githubusercontent.com/u/14123304?v=4"
},
"createdAt": 1598438788000,
"id": "b23e5907-6d8b-4134-8cf3-c6dd34fc42d2",
"status": "seen",
"text": "Hic iure corrupti aut delectus tempore.",
"type": "text"
}&
{
"author": {
"firstName": "Daria",
"id": "06c33e8b-e835-4736-80f4-63f44b66666c",
"imageUrl": "https://avatars.githubusercontent.com/u/33809426?v=4"
},
"createdAt": 1598438787000,
"id": "83093c75-2efb-47bc-84d6-37dbc53bb5de",
"status": "seen",
"text": "Doloremque dolor aliquam totam dolor suscipit qui.",
"type": "text"
}&
{
"author": {
"firstName": "Alex",
"id": "b4878b96-efbc-479a-8291-474ef323dec7",
"imageUrl": "https://avatars.githubusercontent.com/u/14123304?v=4"
},
"createdAt": 1598438786000,
"id": "8fa70836-3309-4d09-a777-4d9603e1f123",
"status": "seen",
"text": "Architecto quaerat nulla ipsa facilis cum quasi fuga voluptate.",
"type": "text"
}

250
AwesomeUIWidgets/Assets/Resources/wallpaper.jpg

之前 之后
宽度: 640  |  高度: 1138  |  大小: 64 KiB

525
AwesomeUIWidgets/Assets/Scripts/AdditionalWidgets/LinkPreview/linkpreview.cs


using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using ChatComponents;
using JetBrains.Annotations;
using Unity.UIWidgets.animation;
using Unity.UIWidgets.async;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.rendering;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using Image = Unity.UIWidgets.widgets.Image;
using TextStyle = Unity.UIWidgets.painting.TextStyle;
namespace UIWidgetsSample
{
public delegate void OnLinkPressed(string str);
public class LinkPreview : StatefulWidget
{
/// Expand animation duration
public readonly TimeSpan? animationDuration;
/// Enables expand animation. Default value is false.
public readonly bool? enableAnimation;
/// Custom header above provided text
public readonly string header;
/// Style of the custom header
public readonly TextStyle headerStyle;
/// Style of highlighted links in the text
public readonly TextStyle linkStyle;
/// Style of preview's description
public readonly TextStyle metadataTextStyle;
/// Style of preview's title
public readonly TextStyle metadataTitleStyle;
/// Custom link press handler
public readonly OnLinkPressed onLinkPressed;
/// Callback which is called when [PreviewData] was successfully parsed.
/// Use it to save [PreviewData] to the state and pass it back
/// to the [LinkPreview.previewData] so the [LinkPreview] would not fetch
/// preview data again.
public readonly OnPreviewDataFetched onPreviewDataFetched;
/// Padding around initial text widget
public readonly EdgeInsets padding;
/// Pass saved [PreviewData] here so [LinkPreview] would not fetch preview
/// data again
public readonly PreviewData previewData;
/// Text used for parsing
public readonly string text;
/// Style of the provided text
public readonly TextStyle textStyle;
/// Width of the [LinkPreview] widget
public readonly float width;
/// Creates [LinkPreview]
public LinkPreview(
OnPreviewDataFetched onPreviewDataFetched,
PreviewData previewData,
string text,
float width,
Key key = null,
TimeSpan? animationDuration = null,
bool enableAnimation = false,
[CanBeNull] string header = null,
TextStyle headerStyle = null,
TextStyle linkStyle = null,
TextStyle metadataTextStyle = null,
TextStyle metadataTitleStyle = null,
OnLinkPressed onLinkPressed = null,
[CanBeNull] EdgeInsets padding = null,
TextStyle textStyle = null
) : base(key)
{
this.onPreviewDataFetched = onPreviewDataFetched;
this.previewData = previewData;
this.text = text;
this.width = width;
this.animationDuration = animationDuration;
this.enableAnimation = enableAnimation;
this.header = header;
this.headerStyle = headerStyle;
this.linkStyle = linkStyle;
this.metadataTextStyle = metadataTextStyle;
this.metadataTitleStyle = metadataTitleStyle;
this.onLinkPressed = onLinkPressed;
this.padding = padding;
this.textStyle = textStyle;
}
public override State createState()
{
return new _LinkPreviewState();
}
}
public class _LinkPreviewState : SingleTickerProviderStateMixin<LinkPreview>
{
public Animation<float> _animation;
public AnimationController _controller;
private bool isFetchingPreviewData;
private bool shouldAnimate;
public override void initState()
{
base.initState();
didUpdateWidget(widget);
_controller = new AnimationController(
duration: widget.animationDuration ?? TimeSpan.FromMilliseconds(300),
vsync: this);
_animation = new CurvedAnimation(
parent: _controller,
curve: Curves.easeOutQuad
);
}
public override void didUpdateWidget(StatefulWidget oldWidget)
{
oldWidget = (LinkPreview) oldWidget;
base.didUpdateWidget(oldWidget);
if (!isFetchingPreviewData && widget.previewData == null) _fetchData(widget.text);
if (widget.previewData != null && ((LinkPreview) oldWidget).previewData == null)
{
setState(() => { shouldAnimate = true; });
_controller.reset();
_controller.forward();
}
else if (widget.previewData != null)
{
setState(() => { shouldAnimate = false; });
}
}
public override void dispose()
{
_controller.dispose();
base.dispose();
}
private PreviewData _fetchData(string text)
{
setState(() => { isFetchingPreviewData = true; });
var previewData = getPreviewData(text);
_handlePreviewDataFetched(previewData);
return previewData;
}
private void _handlePreviewDataFetched(PreviewData previewData)
{
Future.delayed(
widget.animationDuration ?? TimeSpan.FromMilliseconds(300)
);
if (mounted)
{
widget.onPreviewDataFetched(previewData);
setState(() => { isFetchingPreviewData = false; });
}
}
private bool _hasData(PreviewData previewData)
{
return previewData?.title != null ||
previewData?.description != null ||
previewData?.image?.url != null;
}
private bool _hasOnlyImage()
{
return widget.previewData?.title == null &&
widget.previewData?.description == null &&
widget.previewData?.image?.url != null;
}
/*private Future _onOpen(LinkableElement link)
{
if (canLaunch(link.url))
launch(link.url);
else
throw $"Could not launch {link}";
}*/
private Widget _animated(Widget child)
{
return new SizeTransition(
axis: Axis.vertical,
axisAlignment: -1,
sizeFactor: _animation,
child: child
);
}
private Widget _bodyWidget(PreviewData data, string text, float width)
{
var _padding = widget.padding ??
EdgeInsets.only(
bottom: 16,
left: 24,
right: 24
);
var results = new List<Widget>();
if (data.title != null) results.Add(_titleWidget((string)data.title ));
if (data.description != null)
results.Add(_descriptionWidget((string)data.description));
var final_results = new List<Widget>();
final_results.Add(new Container(
padding: EdgeInsets.only(
bottom: _padding.bottom,
left: _padding.left,
right: _padding.right
),
child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: results
)
));
if (data.image?.url != null) final_results.Add(_imageWidget(data.image.url, width));
return new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: final_results
);
}
private Widget _containerWidget(
bool animate,
bool withPadding = false,
Widget child = null
)
{
var _padding = widget.padding ??
EdgeInsets.symmetric(
horizontal: 24,
vertical: 16
);
var shouldAnimate = widget.enableAnimation == true && animate;
var results = new List<Widget>();
if (widget.header != null)
results.Add(new Padding(
padding: EdgeInsets.only(bottom: 6),
child: new Text(
(string)widget.header,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: widget.headerStyle
)
));
//results.Add(_linkify());
if (withPadding && child != null)
results.Add(shouldAnimate ? _animated(child) : child);
var final_results = new List<Widget>();
final_results.Add(new Padding(
padding: withPadding
? EdgeInsets.all(0)
: EdgeInsets.only(
_padding.left,
right: _padding.right,
top: _padding.top,
bottom: _hasOnlyImage() ? 0 : 16
),
child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: results
)
));
if (!withPadding && child != null)
final_results.Add(shouldAnimate ? _animated(child) : child);
return new Container(
constraints: new BoxConstraints(maxWidth: widget.width),
padding: withPadding ? _padding : null,
child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: final_results
)
);
}
private Widget _descriptionWidget(string description)
{
return new Container(
margin: EdgeInsets.only(top: 8),
child: new Text(
description,
maxLines: 3,
overflow: TextOverflow.ellipsis,
style: widget.metadataTextStyle
)
);
}
private Widget _imageWidget(string url, float width)
{
return new Container(
constraints: new BoxConstraints(
maxHeight: width
),
width: width,
child: Image.network(
url,
fit: BoxFit.fitWidth
)
);
}
/*private Widget _linkify()
{
return SelectableLinkify(
linkifiers:[UrlLinkifier()],
widget.linkStyle,
100,
1,
widget.onLinkPressed != null
? element => widget.onLinkPressed!(element.url)
: _onOpen,
LinkifyOptions(
defaultToHttps: true,
humanize: false,
looseUrl: true,
),
widget.text,
widget.textStyle
);
}*/
private Widget _minimizedBodyWidget(PreviewData data, string text)
{
var inner_results = new List<Widget>();
if (data.title != null)
inner_results.Add(_titleWidget(data.title));
if (data.description != null)
inner_results.Add(_descriptionWidget(data.description));
if (data.image.url != null)
_minimizedImageWidget(data.image.url);
var results = new List<Widget>();
results.Add(new Expanded(
child: new Container(
margin: EdgeInsets.only(right: 4),
child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: inner_results
)
)
));
if (data.image.url != null)
results.Add(_minimizedImageWidget(data.image.url));
var outerResults = (Widget) null;
if (data.title != null || data.description != null)
outerResults = new Container(
margin: EdgeInsets.only(top: 16),
child: new Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: results
)
);
return new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: new List<Widget> {outerResults}
);
}
private Widget _minimizedImageWidget(string url)
{
return new ClipRRect(
borderRadius: BorderRadius.all(
Radius.circular(12)
),
child: new SizedBox(
height: 48,
width: 48,
child: Image.network(url)
)
);
}
private Widget _titleWidget(string title)
{
var style = widget.metadataTitleStyle ??
new TextStyle(
fontWeight: FontWeight.bold
);
return new Text(
title,
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: style
);
}
public override Widget build(BuildContext context)
{
if (widget.previewData != null && _hasData(widget.previewData))
{
var aspectRatio = widget.previewData.image == null
? 0f
: widget.previewData.image.width /
widget.previewData.image.height;
var _width = aspectRatio == 1 ? widget.width : widget.width - 32;
return _containerWidget(
shouldAnimate,
child: aspectRatio == 1
? _minimizedBodyWidget(widget.previewData, widget.text)
: _bodyWidget(widget.previewData, widget.text, _width),
withPadding: aspectRatio == 1
);
}
return _containerWidget(false);
}
private PreviewData getPreviewData(string text)
{
var previewData = new PreviewData();
string previewDataDescription = null;
PreviewDataImage previewDataImage = null;
string previewDataTitle ="";
string previewDataUrl ="";
var REGEX_LINK =
@"([\w+]+\:\/\/)?([\w\d-]+\.)*[\w-]+[\.\:]\w+([\/\?\=\&\#\.]?[\w-]+)*\/?";
var REGEX_IMAGE_CONTENT_TYPE = @"image\/*";
/* try
{
var urlRegexp = new Regex(REGEX_LINK);
var matches = urlRegexp.Match(text.ToLower());
if (matches.Length == 0) return previewData;
var url = text.Substring(matches.first.start, matches.first.end);
if (!url.ToLower().StartsWith("http")) url = "https://" + url;
previewDataUrl = url;
var uri = Uri.parse(url);
var response = http.get(uri);
var document = parser.parse(response.body);
var imageRegexp = new Regex(REGEX_IMAGE_CONTENT_TYPE);
if (imageRegexp.hasMatch(response.headers["content-type"] ?? ""))
{
var imageSize = _getImageSize(previewDataUrl);
previewDataImage = new PreviewDataImage(
imageSize.height,
previewDataUrl,
imageSize.width
);
return new PreviewData(
image: previewDataImage,
link: previewDataUrl
);
}
if (!_hasUTF8Charset(document)) return previewData;
var title = _getTitle(document);
if (title != null) previewDataTitle = title.trim();
var description = _getDescription(document);
if (description != null) previewDataDescription = description.trim();
var imageUrls = _getImageUrls(document, url);
Size imageSize;
string imageUrl;
if (imageUrls.isNotEmpty)
{
imageUrl = imageUrls.length == 1
? imageUrls[0]
: _getBiggestImageUrl(imageUrls);
imageSize = _getImageSize(imageUrl);
previewDataImage = new PreviewDataImage(
imageSize.height,
imageUrl,
imageSize.width
);
}
return new PreviewData(
previewDataDescription,
previewDataImage,
previewDataUrl,
previewDataTitle
);
}
catch (Exception e)
{
return new PreviewData(
previewDataDescription,
previewDataImage,
previewDataUrl,
previewDataTitle
);
}*/
return new PreviewData(
previewDataDescription,
previewDataImage,
previewDataUrl,
previewDataTitle
);
}
}
}

140
AwesomeUIWidgets/Assets/Scripts/AdditionalWidgets/LinkPreview/url_linkifier.cs


using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using ChatComponents;
using JetBrains.Annotations;
using Unity.UIWidgets.animation;
using Unity.UIWidgets.async;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.rendering;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using UnityEngine.UIElements;
using Image = Unity.UIWidgets.widgets.Image;
using TextStyle = Unity.UIWidgets.painting.TextStyle;
namespace UIWidgetsSample
{
public static class urlLinkifierUtils
{
public static Regex _urlRegex = new Regex(
@"^(.*?)((?:https?:\/\/|www\.)[^\s/$.?#].[^\s]*)"
);
public static Regex _looseUrlRegex =new Regex(
@"^(.*?)((https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,4}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*))"
);
public static Regex _protocolIdentifierRegex =new Regex(
@"^(https?:\/\/)"
);
}
// Utility class that implements [Linkifier.parse] method.
/// Used to find links in the text.
/*public class UrlLinkifier : Linkifier {
/// Default constructor
UrlLinkifier();
/// Parses text to find all links inside it
@override
List<LinkifyElement> parse(elements, options) {
final list = <LinkifyElement>[];
elements.forEach((element) {
if (element is TextElement) {
var loose = false;
var match = _urlRegex.firstMatch(element.text);
if (match?.group(1)?.isNotEmpty == true) {
final looseMatch = _looseUrlRegex.firstMatch(match!.group(1)!);
if (looseMatch != null) {
match = looseMatch;
loose = true;
}
}
if (match == null && options.looseUrl) {
match = _looseUrlRegex.firstMatch(element.text);
loose = true;
}
if (match == null) {
list.add(element);
} else {
final text = element.text.replaceFirst(match.group(0)!, "");
if (match.group(1)?.isNotEmpty == true) {
list.add(TextElement(match.group(1)!));
}
if (match.group(2)?.isNotEmpty == true) {
var originalUrl = match.group(2)!;
String? end;
if (options.excludeLastPeriod &&
originalUrl[originalUrl.length - 1] == ".") {
end = ".";
originalUrl = originalUrl.substring(0, originalUrl.length - 1);
}
final url = originalUrl;
if (loose || !originalUrl.startsWith(_protocolIdentifierRegex)) {
originalUrl = (options.defaultToHttps ? "https://" : "http://") +
originalUrl;
}
list.add(
UrlElement(
originalUrl,
url,
),
);
if (end != null) {
list.add(TextElement(end));
}
}
if (text.isNotEmpty) {
list.addAll(parse([TextElement(text)], options));
}
}
} else {
list.add(element);
}
});
return list;
}
}
/// Represents an element containing a link
class UrlElement : LinkableElement {
/// Creates [UrlElement]
UrlElement(String url, [String? text]) : super(text, url);
@override
String toString() {
return "LinkElement: "$url" ($text)";
}
@override
bool operator ==(other) => equals(other);
@override
bool equals(other) => other is UrlElement && super.equals(other);
@override
// ignore: unnecessary_overrides
int get hashCode => super.hashCode;
}*/
//}
}

241
AwesomeUIWidgets/Assets/Scripts/AdditionalWidgets/circleavatar.cs


using Unity.UIWidgets.foundation;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.rendering;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
namespace Unity.UIWidgets.material
{
public static class CircleAvatarUtils
{
// The default radius if nothing is specified.
public static float _defaultRadius = 20.0f;
// The default min if only the max is specified.
public static float _defaultMinRadius = 0.0f;
// The default max if only the min is specified.
public static float _defaultMaxRadius = float.PositiveInfinity;
}
public class CircleAvatar : StatelessWidget
{
/// The color with which to fill the circle. Changing the background
/// color will cause the avatar to animate to the new color.
///
/// If a [backgroundColor] is not specified, the theme's
/// [ThemeData.primaryColorLight] is used with dark foreground colors, and
/// [ThemeData.primaryColorDark] with light foreground colors.
public readonly Color backgroundColor;
/// The background image of the circle. Changing the background
/// image will cause the avatar to animate to the new image.
///
/// Typically used as a fallback image for [foregroundImage].
///
/// If the [CircleAvatar] is to have the user's initials, use [child] instead.
public readonly ImageProvider backgroundImage;
/// The widget below this widget in the tree.
///
/// Typically a [Text] widget. If the [CircleAvatar] is to have an image, use
/// [backgroundImage] instead.
public readonly Widget child;
/// The default text color for text in the circle.
///
/// Defaults to the primary text theme color if no [backgroundColor] is
/// specified.
///
/// Defaults to [ThemeData.primaryColorLight] for dark background colors, and
/// [ThemeData.primaryColorDark] for light background colors.
public readonly Color foregroundColor;
/// The foreground image of the circle.
///
/// Typically used as profile image. For fallback use [backgroundImage].
public readonly ImageProvider foregroundImage;
/// The maximum size of the avatar, expressed as the radius (half the
/// diameter).
///
/// If [maxRadius] is specified, then [radius] must not also be specified.
///
/// Defaults to [double.infinity].
///
/// Constraint changes are animated, but size changes due to the environment
/// itself changing are not. For example, changing the [maxRadius] from 10 to
/// 20 when the [CircleAvatar] is in an unconstrained environment will cause
/// the avatar to animate from a 20 pixel diameter to a 40 pixel diameter.
/// However, if the [maxRadius] is 40 and the [CircleAvatar] has a parent
/// [SizedBox] whose size changes instantaneously from 20 pixels to 40 pixels,
/// the size will snap to 40 pixels instantly.
public readonly float? maxRadius;
/// The minimum size of the avatar, expressed as the radius (half the
/// diameter).
///
/// If [minRadius] is specified, then [radius] must not also be specified.
///
/// Defaults to zero.
///
/// Constraint changes are animated, but size changes due to the environment
/// itself changing are not. For example, changing the [minRadius] from 10 to
/// 20 when the [CircleAvatar] is in an unconstrained environment will cause
/// the avatar to animate from a 20 pixel diameter to a 40 pixel diameter.
/// However, if the [minRadius] is 40 and the [CircleAvatar] has a parent
/// [SizedBox] whose size changes instantaneously from 20 pixels to 40 pixels,
/// the size will snap to 40 pixels instantly.
public readonly float? minRadius;
/// An optional error callback for errors emitted when loading
/// [backgroundImage].
public readonly ImageErrorListener onBackgroundImageError;
/// An optional error callback for errors emitted when loading
/// [foregroundImage].
public readonly ImageErrorListener onForegroundImageError;
/// The size of the avatar, expressed as the radius (half the diameter).
///
/// If [radius] is specified, then neither [minRadius] nor [maxRadius] may be
/// specified. Specifying [radius] is equivalent to specifying a [minRadius]
/// and [maxRadius], both with the value of [radius].
///
/// If neither [minRadius] nor [maxRadius] are specified, defaults to 20
/// logical pixels. This is the appropriate size for use with
/// [ListTile.leading].
///
/// Changes to the [radius] are animated (including changing from an explicit
/// [radius] to a [minRadius]/[maxRadius] pair or vice versa).
public readonly float? radius;
/// Creates a circle that represents a user.
public CircleAvatar(
Key key = null,
Widget child = null,
Color backgroundColor = null,
Color foregroundColor = null,
ImageProvider backgroundImage = null,
ImageProvider foregroundImage = null,
ImageErrorListener onBackgroundImageError = null,
ImageErrorListener onForegroundImageError = null,
float radius = 0.0f,
float minRadius = 0.0f,
float maxRadius = 0.0f
) : base(key)
{
D.assert(radius == null || minRadius == null && maxRadius == null);
D.assert(backgroundImage != null || onBackgroundImageError == null);
D.assert(foregroundImage != null || onForegroundImageError == null);
this.child = child;
this.backgroundColor = backgroundColor;
this.backgroundImage = backgroundImage;
this.foregroundImage = foregroundImage;
this.onBackgroundImageError = onBackgroundImageError;
this.onForegroundImageError = onForegroundImageError;
this.foregroundColor = foregroundColor;
this.radius = radius;
this.minRadius = minRadius;
this.maxRadius = maxRadius;
}
private float _minDiameter
{
get
{
if (radius == null && minRadius == null && maxRadius == null)
return CircleAvatarUtils._defaultRadius * 2.0f;
return 2.0f * (radius ?? minRadius ?? CircleAvatarUtils._defaultMinRadius);
}
}
private float _maxDiameter
{
get
{
if (radius == null && minRadius == null && maxRadius == null)
return CircleAvatarUtils._defaultRadius * 2.0f;
return 2.0f * (radius ?? maxRadius ?? CircleAvatarUtils._defaultMaxRadius);
}
}
public override Widget build(BuildContext context)
{
D.assert(WidgetsD.debugCheckHasMediaQuery(context));
var theme = Theme.of(context);
var textStyle = theme.primaryTextTheme.subtitle1.copyWith(color: foregroundColor);
var effectiveBackgroundColor = backgroundColor;
if (effectiveBackgroundColor == null)
switch (ThemeData.estimateBrightnessForColor(textStyle.color))
{
case Brightness.dark:
effectiveBackgroundColor = theme.primaryColorLight;
break;
case Brightness.light:
effectiveBackgroundColor = theme.primaryColorDark;
break;
}
else if (foregroundColor == null)
switch (ThemeData.estimateBrightnessForColor(backgroundColor))
{
case Brightness.dark:
textStyle = textStyle.copyWith(color: theme.primaryColorLight);
break;
case Brightness.light:
textStyle = textStyle.copyWith(color: theme.primaryColorDark);
break;
}
var minDiameter = _minDiameter;
var maxDiameter = _maxDiameter;
return new AnimatedContainer(
constraints: new BoxConstraints(
minHeight: minDiameter,
minWidth: minDiameter,
maxWidth: maxDiameter,
maxHeight: maxDiameter
),
duration: material_.kThemeChangeDuration,
decoration: new BoxDecoration(
effectiveBackgroundColor,
backgroundImage != null
? new DecorationImage(
backgroundImage,
onBackgroundImageError,
fit: BoxFit.cover
)
: null,
shape: BoxShape.circle
),
foregroundDecoration: foregroundImage != null
? new BoxDecoration(
image: new DecorationImage(
foregroundImage,
onForegroundImageError,
fit: BoxFit.cover
),
shape: BoxShape.circle
)
: null,
child: child == null
? null
: new Center(
child: new MediaQuery(
// Need to ignore the ambient textScaleFactor here so that the
// text doesn't escape the avatar when the textScaleFactor is large.
data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0f),
child: new IconTheme(
data: theme.iconTheme.copyWith(textStyle.color),
child: new DefaultTextStyle(
style: textStyle,
child: child
)
)
)
)
);
}
}
}

135
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Message.cs


using System;
using System.Collections.Generic;
using JetBrains.Annotations;
using UIWidgetsSample;
using Unity.UIWidgets.foundation;
namespace ChatComponents
{
public enum MessageType
{
custom,
file,
image,
text,
unsupported
}
/// Extension with one [toShortString] method
public class MessageTypeToShortString
{
/// Converts enum to the string equal to enum's name
public MessageType messageType;
private string toShortString()
{
return ToString().Split('.').last();
}
}
/// All possible statuses message can have.
public enum Status
{
delivered,
error,
seen,
sending,
sent
}
/// Extension with one [toShortString] method
public class StatusToShortString
{
public Status status;
/// Converts enum to the string equal to enum's name
private string toShortString()
{
return ToString().Split('.').last();
}
}
/// An abstract class that contains all variables and methods
/// every message will have.
public abstract class Message : Equatable
{
/// User who sent this message
public readonly User author;
/// Created message timestamp, in ms
public readonly int? createdAt;
/// Unique ID of the message
public readonly string id;
/// Additional custom metadata or attributes related to the message
public readonly Dictionary<string, object> metadata;
/// ID of the room where this message is sent
public readonly string roomId;
/// Message [Status]
public readonly Status? status;
/// [MessageType]
public readonly MessageType type;
public Message(
User author,
int? createdAt,
string id,
Dictionary<string, object> metadata,
[CanBeNull] string roomId,
Status? status,
MessageType type
)
{
this.author = author;
this.createdAt = createdAt;
this.id = id;
this.metadata = metadata;
this.roomId = roomId;
this.status = status;
this.type = type;
}
/// Creates a particular message from a map (decoded JSON).
/// Type is determined by the `type` field.
public static Message fromJson(Dictionary<string, object> json)
{
var type = json["type"] as string;
switch (type)
{
case "custom":
return CustomMessage.fromJson(json);
case "file":
return FileMessage.fromJson(json);
case "image":
return ImageMessage.fromJson(json);
case "text":
return TextMessage.fromJson(json);
default:
return UnsupportedMessage.fromJson(json);
}
}
/// Creates a copy of the message with an updated data
/// [metadata] with null value will nullify existing metadata, otherwise
/// both metadatas will be merged into one Map, where keys from a passed
/// metadata will overwite keys from the previous one.
/// [previewData] will be only set for the text message type.
/// [status] with null value will be overwritten by the previous status.
/// [text] will be only set for the text message type. Null value will be
/// overwritten by the previous text (can't be empty).
public abstract Message copyWith(
Dictionary<string, object> metadata = null,
[CanBeNull] PreviewData previewData = null,
Status? status = default,
string text = null
);
/// Converts a particular message to the map representation, encodable to JSON.\
public abstract Dictionary<string, object> toJson();
}
}

138
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Room.cs


using System.Collections.Generic;
using System.Linq;
using UIWidgetsSample;
namespace ChatComponents
{
public enum RoomType
{
channel,
direct,
group,
unsupported
}
/// A class that represents a room where 2 or more participants can chat
public class Room : Equatable
{
/// Created room timestamp, in ms
public readonly int? createdAt;
/// Room"s unique ID
public readonly string id;
/// Room"s image. In case of the [RoomType.direct] - avatar of the second person,
/// otherwise a custom image [RoomType.group].
public readonly string imageUrl;
/// Additional custom metadata or attributes related to the room
public readonly Dictionary<string, object> metadata;
/// Room"s name. In case of the [RoomType.direct] - name of the second person,
/// otherwise a custom name [RoomType.group].
public readonly string name;
/// [RoomType]
public readonly RoomType type;
/// List of users which are in the room
public readonly List<User> users;
/// Creates a [Room]
public Room(
RoomType type,
List<User> users,
string id,
int? createdAt = null,
string imageUrl = null,
Dictionary<string, object> metadata = null,
string name = null
)
{
this.type = type;
this.users = users;
this.id = id;
this.createdAt = createdAt;
this.imageUrl = imageUrl;
this.metadata = metadata;
this.name = name;
}
/// Equatable props
public override List<object> props => new List<object>
{createdAt, id, imageUrl, metadata, name, type, users};
/// Creates room from a map (decoded JSON).
public Room fromJson(Dictionary<string, object> json)
{
var users = (json["users"] as List<Dictionary<string, object>>);
var usersList = new List<User>();
foreach (var user in users){
if (User.fromJson(user) != null)
{
usersList.Add(User.fromJson(user));
}
}
return new Room(
createdAt: json["createdAt"] as int?,
id: json["id"] as string,
imageUrl: json["imageUrl"] as string,
metadata: json["metadata"] as Dictionary<string, object>,
name: json["name"] as string,
type: ChatRoomUtils.getRoomTypeFromString(json["type"] as string),
users: usersList);
}
/// Converts room to the map representation, encodable to JSON.
public Dictionary<string, object> toJson()
{
var users = new List<User>();
return new Dictionary<string, object>
{
{"createdAt", createdAt},
{"id", id},
{"imageUrl", imageUrl},
{"metadata", metadata},
{"name", name},
{"type", ChatRoomUtils.toShortString(type)},
{"users", users.Where(e => e.toJson() != null).ToList()}
};
}
/// Creates a copy of the room with an updated data.
/// [imageUrl] and [name] with null values will nullify existing values
/// [metadata] with null value will nullify existing metadata, otherwise
/// both metadatas will be merged into one Map, where keys from a passed
/// metadata will overwite keys from the previous one.
/// [type] and [users] with null values will be overwritten by previous values.
private Room copyWith(
string imageUrl = null,
Dictionary<string, object> metadata = null,
string name = null,
RoomType? type = null,
List<User> users = null
)
{
var result = new Dictionary<string, object>();
if (this.metadata != null)
foreach (var metaItem in this.metadata)
result.Add(metaItem.Key, metaItem.Value);
foreach (var metaItem in metadata) result.Add(metaItem.Key, metaItem.Value);
return new Room(
id: id,
imageUrl: imageUrl,
metadata: metadata == null
? null
: result,
name: name,
type: type ?? this.type,
users: users ?? this.users
);
}
}
}

147
AwesomeUIWidgets/Assets/Scripts/ChatRoom/User.cs


using System.Collections.Generic;
using UIWidgetsSample;
using Unity.UIWidgets.foundation;
namespace ChatComponents
{
public enum Role
{
admin,
agent,
moderator,
user
}
/// Extension with one [toShortString] method
/// RoleToShortString
public class RoleToShortString
{
/// Converts enum to the string equal to enum's name
public Role role;
public string toShortString()
{
return ToString().Split('.').last();
}
}
/// A class that represents user.
public class User : Equatable
{
/// Created user timestamp, in ms
public readonly int? createdAt;
/// First name of the user
public readonly string firstName;
/// Unique ID of the user
public readonly string id;
/// Remote image URL representing user's avatar
public readonly string imageUrl;
/// Last name of the user
public readonly string lastName;
/// Timestamp when user was last visible, in ms
public readonly int? lastSeen;
/// Additional custom metadata or attributes related to the user
public readonly Dictionary<string, object> metadata;
/// User [Role]
public Role? role;
/// Creates a user.
public User(
string id,
int? createdAt = null,
string firstName = null,
string imageUrl = null,
string lastName = null,
int? lastSeen = null,
Dictionary<string, object> metadata = null,
Role? role = null
)
{
this.createdAt = createdAt;
this.firstName = firstName;
this.id = id;
this.imageUrl = imageUrl;
this.lastName = lastName;
this.lastSeen = lastSeen;
this.metadata = metadata;
this.role = role;
}
/// Equatable props
public override List<object> props => new List<object>
{createdAt, firstName, id, imageUrl, lastName, lastSeen, metadata, role};
/// Creates user from a map (decoded JSON).
public static User fromJson(Dictionary<string, object> json)
{
return new User(
createdAt: json["createdAt"] as int?,
firstName: json["firstName"] as string,
id: json["id"] as string,
imageUrl: json["imageUrl"] as string,
lastName: json["lastName"] as string,
lastSeen: json["lastSeen"] as int?,
metadata: json["metadata"] as Dictionary<string, object>,
role: ChatRoomUtils.getRoleFromString(json["role"] as string)
);
/// Converts user to the map representation, encodable to JSON.
}
public Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"createdAt", createdAt},
{"firstName", firstName},
{"id", id},
{"imageUrl", imageUrl},
{"lastName", lastName},
{"lastSeen", lastSeen},
{"metadata", metadata},
{"role", ChatRoomUtils.toShortString(role == null ? null : role)}
};
}
/// Creates a copy of the user with an updated data.
/// [firstName], [imageUrl], [lastName], [lastSeen] and [role] with
/// null values will nullify existing values.
/// [metadata] with null value will nullify existing metadata, otherwise
/// both metadatas will be merged into one Map, where keys from a passed
/// metadata will overwite keys from the previous one.
private User copyWith(
string firstName = null,
string imageUrl = null,
string lastName = null,
int? lastSeen = null,
Dictionary<string, object> metadata = null,
Role? role = null
)
{
var result = new Dictionary<string, object>();
if (this.metadata != null)
foreach (var metaItem in this.metadata)
result.Add(metaItem.Key, metaItem.Value);
foreach (var metaItem in metadata) result.Add(metaItem.Key, metaItem.Value);
return new User(
firstName: firstName,
id: id,
imageUrl: imageUrl,
lastName: lastName,
lastSeen: lastSeen,
metadata: metadata == null
? null
: result,
role: role
);
}
}
}

49
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Util.cs


using System;
using System.Collections.Generic;
using Unity.UIWidgets.foundation;
namespace ChatComponents
{
public static class ChatRoomUtils
{
public static Status? getStatusFromString(string stringStatus) {
foreach( var status in Enum.GetValues(typeof(Status))) {
if (status.ToString() == stringStatus) {
return status is Status ? (Status) status : (Status?) null;
}
}
return null;
}
/// Converts [stringRole] to the [Role] enum.
public static Role? getRoleFromString(string stringRole) {
foreach( var role in Enum.GetValues(typeof(Role))) {
if (role.ToString() == stringRole) {
return role is Role ? (Role) role : (Role?) null;
}
}
return null;
}
/// Converts [stringRoomType] to the [RoomType] enum.
public static RoomType getRoomTypeFromString(string stringRoomType) {
foreach( var roomType in Enum.GetValues(typeof(RoomType))) {
if (roomType.ToString() == stringRoomType) {
return (RoomType) (roomType is RoomType ? (RoomType) roomType : (RoomType?) null);
}
}
return RoomType.unsupported;
}
public static string toShortString(object _object = null)
{
return _object.ToString().Split('.').last();
}
}
}

134
AwesomeUIWidgets/Assets/Scripts/ChatRoom/preview_data.cs


using System.Collections.Generic;
using JetBrains.Annotations;
using UIWidgetsSample;
namespace ChatComponents
{
public class PreviewData : Equatable
{
/// Link description (usually og:description meta tag)
public readonly string description;
/// See [PreviewDataImage]
public readonly PreviewDataImage image;
/// Remote resource URL
public readonly string link;
/// Link title (usually og:title meta tag)
public readonly string title;
/// Creates preview data.
public PreviewData(
string description = null,
[CanBeNull] PreviewDataImage image = null,
string link = null,
string title = null
)
{
this.description = description;
this.image = image;
this.link = link;
this.title = title;
}
/// Equatable props
public override List<object> props => new List<object>
{description, image, link, title};
/// Creates preview data from a map (decoded JSON).
public static PreviewData fromJson(Dictionary<string, object> json)
{
return new PreviewData(
json["description"] as string,
json["image"] == null
? null
: PreviewDataImage.fromJson(json["image"] as Dictionary<string, object>),
json["link"] as string,
json["title"] as string
);
}
/// Converts preview data to the map representation, encodable to JSON.
public Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"description", description},
{"image", image?.toJson()},
{"link", link},
{"title", title}
};
}
/// Creates a copy of the preview data with an updated data.
/// Null values will nullify existing values.
private PreviewData copyWith(
string description = null,
PreviewDataImage image = null,
string link = null,
string title = null
)
{
return new PreviewData(
description,
image,
link,
title
);
}
}
/// A utility class that forces image"s width and height to be stored
/// alongside the url.
///
/// See https://github.com/flyerhq/flutter_link_previewer
public class PreviewDataImage : Equatable
{
/// Image height in pixels
public readonly float height;
/// Remote image URL
public readonly string url;
/// Image width in pixels
public readonly float width;
/// Creates preview data image.
public PreviewDataImage(
float height,
string url,
float width)
{
this.height = height;
this.url = url;
this.width = width;
}
/// Equatable props
public override List<object> props => new List<object>
{height, url, width};
/// Creates preview data image from a map (decoded JSON).
public static PreviewDataImage fromJson(Dictionary<string, object> json)
{
return new PreviewDataImage(
json["height"] is float ? (float) json["height"] : 0,
json["url"] as string,
json["width"] is float ? (float) json["width"] : 0
);
}
/// Converts preview data image to the map representation, encodable to JSON.
public Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"height", height},
{"url", url},
{"width", width}
};
}
}
}

156
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/file_message.cs


using System;
using System.Collections.Generic;
namespace ChatComponents
{
public class FileMessage : Message
{
/// Creates a custom message.
public readonly string mimeType;
public readonly string name;
public readonly int size;
public readonly string uri;
public FileMessage(
User author,
string id,
string name,
int size,
string uri,
int? createdAt = null,
Dictionary<string, object> metadata = null,
string mimeType = null,
string roomId = null,
Status? status = default
) : base(
author,
createdAt,
id,
metadata,
roomId,
status,
MessageType.file
)
{
this.name = name;
this.size = size;
this.uri = uri;
this.mimeType = mimeType;
}
public override List<object> props => new List<object>
{
author,
createdAt,
id,
metadata,
mimeType,
name,
roomId,
size,
status,
uri,
};
public FileMessage fromPartial(
User author,
string id,
PartialFile partialFile,
int? createdAt = null,
Dictionary<string, object> metadata = null,
string roomId = null,
Status? status = default
)
{
return new FileMessage(
author : author,
createdAt:createdAt,
id:id,
metadata:metadata,
roomId:roomId,
status:status,
mimeType : partialFile.mimeType,
name : partialFile.name,
size : partialFile.size,
uri : partialFile.uri
);
}
/// Creates a custom message from a map (decoded JSON).
public static FileMessage fromJson(Dictionary<string, object> json)
{
var test = json["size"];
return new FileMessage(
User.fromJson(json["author"] as Dictionary<string, object>),
createdAt: json["createdAt"] as int?,
id: json["id"] as string,
metadata: json["metadata"] as Dictionary<string, object>,
roomId: json["roomId"] as string,
status: ChatRoomUtils.getStatusFromString(json["status"] as string),
mimeType : json["mimeType"] as string,
name : json["name"] as string,
size : Convert.ToInt32(json["size"]) ,
uri : json["uri"] as string
);
}
/// Converts a custom message to the map representation,
/// encodable to JSON.
public override Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"author", author.toJson()},
{"createdAt", createdAt},
{"id", id},
{"metadata", metadata},
{"mimeType", mimeType},
{"name", name},
{"roomId", roomId},
{"size", size},
{"status", ChatRoomUtils.toShortString(status)},
{"type", ChatRoomUtils.toShortString(MessageType.file)},
{"uri", uri}
};
}
/// Creates a copy of the custom message with an updated data.
/// [metadata] with null value will nullify existing metadata, otherwise
/// both metadatas will be merged into one Map, where keys from a passed
/// metadata will overwite keys from the previous one.
/// [previewData] is ignored for this message type.
/// [status] with null value will be overwritten by the previous status.
/// [text] is ignored for this message type.
public override Message copyWith(
Dictionary<string, object> metadata = null,
PreviewData previewData = null,
Status? status = null,
string text = null
)
{
var result = new Dictionary<string, object>();
if (this.metadata != null)
foreach (var metaItem in this.metadata)
result.Add(metaItem.Key, metaItem.Value);
foreach (var metaItem in metadata) result.Add(metaItem.Key, metaItem.Value);
return new FileMessage(
author: author,
createdAt: createdAt,
id: id,
metadata: metadata == null
? null
: result,
mimeType: mimeType,
name: name,
roomId: roomId,
size: size,
status: status ?? this.status,
uri: uri
);
}
/// Equatable props
}
}

164
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/image_message.cs


using System;
using System.Collections.Generic;
namespace ChatComponents
{
public class ImageMessage : Message
{
/// Creates a custom message.
public readonly string name;
public readonly int size;
public readonly string uri;
public readonly float? width;
public readonly float? height;
public ImageMessage(
User author,
string id,
string name,
int size,
string uri,
int? createdAt = null,
Dictionary<string, object> metadata = null,
string roomId = null,
Status? status = default,
float? height = null,
float? width = null
) : base(
author,
createdAt,
id,
metadata,
roomId,
status,
MessageType.image
)
{
this.name = name;
this.size = size;
this.uri = uri;
this.height = height;
this.width = width;
}
public override List<object> props => new List<object>
{
author,
createdAt,
id,
metadata,
height,
width,
name,
roomId,
size,
status,
uri
};
public ImageMessage fromPartial(
User author,
string id,
PartialImage partialImage,
int? createdAt = null,
Dictionary<string, object> metadata = null,
string roomId = null,
Status? status = default
)
{
return new ImageMessage(
author,
createdAt: createdAt,
id: id,
metadata: metadata,
roomId: roomId,
status: status,
name: partialImage.name,
size: partialImage.size,
uri: partialImage.uri,
height: partialImage.height,
width: partialImage.width
);
}
/// Creates a custom message from a map (decoded JSON).
public static ImageMessage fromJson(Dictionary<string, object> json)
{
var test = json["size"];
return new ImageMessage(
User.fromJson(json["author"] as Dictionary<string, object>),
createdAt: json["createdAt"] as int?,
id: json["id"] as string,
metadata: json["metadata"] as Dictionary<string, object>,
roomId: json["roomId"] as string,
status: ChatRoomUtils.getStatusFromString(json["status"] as string),
height: Convert.ToDouble(json["height"]) is float ? (float) Convert.ToDouble(json["height"]) : 0f,
width: Convert.ToDouble(json["width"]) is float ? (float) Convert.ToDouble(json["width"]) : 0f,
name: json["name"] as string,
size: Convert.ToInt32(json["size"]),
uri: json["uri"] as string
);
}
/// Converts a custom message to the map representation,
/// encodable to JSON.
public override Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"author", author.toJson()},
{"createdAt", createdAt},
{"id", id},
{"metadata", metadata},
{"name", name},
{"roomId", roomId},
{"size", size},
{"status", ChatRoomUtils.toShortString(status)},
{"type", ChatRoomUtils.toShortString(MessageType.file)},
{"uri", uri},
{"height", height},
{"width", width}
};
}
/// Creates a copy of the custom message with an updated data.
/// [metadata] with null value will nullify existing metadata, otherwise
/// both metadatas will be merged into one Map, where keys from a passed
/// metadata will overwite keys from the previous one.
/// [previewData] is ignored for this message type.
/// [status] with null value will be overwritten by the previous status.
/// [text] is ignored for this message type.
public override Message copyWith(
Dictionary<string, object> metadata = null,
PreviewData previewData = null,
Status? status = null,
string text = null
)
{
var result = new Dictionary<string, object>();
if (this.metadata != null)
foreach (var metaItem in this.metadata)
result.Add(metaItem.Key, metaItem.Value);
foreach (var metaItem in metadata) result.Add(metaItem.Key, metaItem.Value);
return new ImageMessage(
author,
createdAt: createdAt,
id: id,
metadata: metadata == null
? null
: result,
name: name,
roomId: roomId,
size: size,
status: status ?? this.status,
uri: uri,
height: height,
width: width
);
}
/// Equatable props
}
}

62
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/partial_file.cs


using System;
using System.Collections.Generic;
namespace ChatComponents
{
public class PartialFile
{
/// Media type
public readonly string mimeType;
/// The name of the file
public readonly string name;
/// Size of the file in bytes
public readonly int size;
/// The file source (either a remote URL or a local resource)
public readonly string uri;
/// Creates a partial file message with all variables file can have.
/// Use [FileMessage] to create a full message.
/// You can use [FileMessage.fromPartial] constructor to create a full
/// message from a partial one.
public PartialFile(
string name,
int size,
string uri,
string mimeType = null
)
{
this.name = name;
this.size = size;
this.uri = uri;
this.mimeType = mimeType;
}
/// Creates a partial file message from a map (decoded JSON).
public PartialFile fromJson(Dictionary<string, object> json)
{
return new PartialFile(
mimeType: json["mimeType"] as string,
name: json["name"] as string,
size: Convert.ToInt32(json["size"]),
uri: json["uri"] as string
);
}
/// Converts a partial file message to the map representation, encodable to JSON.
private Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"mimeType", mimeType},
{"name", name},
{"size", size},
{"uri", uri}
};
}
}
}

70
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/partial_image.cs


using System;
using System.Collections.Generic;
namespace ChatComponents
{
public class PartialImage
{
/// The name of the file
public readonly string name;
/// Size of the file in bytes
public readonly int size;
/// The file source (either a remote URL or a local resource)
public readonly string uri;
public readonly float? width;
public readonly float? height;
/// Creates a partial file message with all variables file can have.
/// Use [FileMessage] to create a full message.
/// You can use [FileMessage.fromPartial] constructor to create a full
/// message from a partial one.
public PartialImage(
string name,
int size,
string uri,
float? height = null,
float? width = null
)
{
this.name = name;
this.size = size;
this.uri = uri;
this.height = height;
this.width = width;
}
/// Creates a partial file message from a map (decoded JSON).
public PartialImage fromJson(Dictionary<string, object> json)
{
return new PartialImage(
name: json["name"] as string,
size: Convert.ToInt32(json["size"]),
uri: json["uri"] as string,
height: Convert.ToDouble(json["height"]) is float ? (float) Convert.ToDouble(json["height"]) : 0f,
width: Convert.ToDouble(json["width"]) is float ? (float) Convert.ToDouble(json["width"]) : 0f
);
}
/// Converts a partial file message to the map representation, encodable to JSON.
private Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"name", name},
{"size", size},
{"uri", uri},
{"height", height},
{"width", width}
};
}
}
}

36
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/partial_text.cs


using System.Collections.Generic;
namespace ChatComponents
{
public class PartialText
{
/// User's message
public readonly string text;
/// Creates a partial text message with all variables text can have.
/// Use [TextMessage] to create a full message.
/// You can use [TextMessage.fromPartial] constructor to create a full
/// message from a partial one.
public PartialText(
string text
)
{
this.text = text;
}
/// Creates a partial text message from a map (decoded JSON).
private PartialText fromJson(Dictionary<string, object> json)
{
return new PartialText(json["text"] as string);
}
/// Converts a partial text message to the map representation, encodable to JSON.
private Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"text", text}
};
}
}
}

131
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/text_message.cs


using System.Collections.Generic;
namespace ChatComponents
{
public class TextMessage : Message
{
/// See [PreviewData]
public readonly PreviewData previewData;
/// User"s message
public readonly string text;
/// Creates a text message.
public TextMessage(
User author,
string id,
int? createdAt = null,
Dictionary<string, object> metadata = null,
string roomId = null,
Status? status = default,
PreviewData previewData = null,
string text = null
) : base(
author,
createdAt,
id,
metadata,
roomId,
status,
MessageType.text
)
{
this.previewData = previewData;
this.text = text;
}
public override List<object> props => new List<object>
{
author, createdAt, id, metadata, previewData, roomId, status, text
};
/// Creates a full text message from a partial one.
private TextMessage fromPartial(
User author,
string id,
PartialText partialText,
int? createdAt = null,
Dictionary<string, object> metadata = null,
string roomId = null,
Status? status = default
)
{
return new TextMessage(
author,
createdAt: createdAt,
id: id,
metadata: metadata,
roomId: roomId,
status: status,
previewData: null,
text: partialText.text);
}
/// Creates a text message from a map (decoded JSON).
private TextMessage fromJson(Dictionary<string, object> json)
{
var test = json["size"];
return new TextMessage(
User.fromJson(json["author"] as Dictionary<string, object>),
createdAt: json["createdAt"] as int?,
id: json["id"] as string,
metadata: json["metadata"] as Dictionary<string, object>,
roomId: json["roomId"] as string,
status: ChatRoomUtils.getStatusFromString(json["status"] as string),
previewData: json["previewData"] == null
? null
: PreviewData.fromJson(json["previewData"] as Dictionary<string, object>),
text: json["text"] as string
);
}
public override Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"author", author.toJson()},
{"createdAt", createdAt},
{"id", id},
{"metadata", metadata},
{"roomId", roomId},
{"previewData", previewData?.toJson()},
{"status", ChatRoomUtils.toShortString(status)},
{"type", ChatRoomUtils.toShortString(MessageType.file)},
{"text", text}
};
}
/// Converts a text message to the map representation, encodable to JSON.
/// Creates a copy of the text message with an updated data
/// [metadata] with null value will nullify existing metadata, otherwise
/// both metadatas will be merged into one Map, where keys from a passed
/// metadata will overwite keys from the previous one.
/// [status] with null value will be overwritten by the previous status.
public override Message copyWith(
Dictionary<string, object> metadata = null,
PreviewData previewData = null,
Status? status = null,
string text = null
)
{
var result = new Dictionary<string, object>();
if (this.metadata != null)
foreach (var metaItem in this.metadata)
result.Add(metaItem.Key, metaItem.Value);
foreach (var metaItem in metadata) result.Add(metaItem.Key, metaItem.Value);
return new TextMessage(
author,
createdAt: createdAt,
id: id,
metadata: metadata == null
? null
: result,
previewData: previewData,
roomId: roomId,
text: text ?? this.text,
status: status ?? this.status
);
}
}
}

102
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/unsupported_message.cs


using System.Collections.Generic;
namespace ChatComponents
{
public class UnsupportedMessage : Message
{
/// Creates a text message.
public UnsupportedMessage(
User author,
string id,
int? createdAt = null,
Dictionary<string, object> metadata = null,
string roomId = null,
Status? status = default
) : base(
author,
createdAt,
id,
metadata,
roomId,
status,
MessageType.unsupported
)
{
}
public override List<object> props => new List<object>
{
author, createdAt, id, metadata, roomId, status
};
/// Creates a text message from a map (decoded JSON).
private UnsupportedMessage fromJson(Dictionary<string, object> json)
{
var test = json["size"];
return new UnsupportedMessage(
User.fromJson(json["author"] as Dictionary<string, object>),
createdAt: json["createdAt"] as int?,
id: json["id"] as string,
metadata: json["metadata"] as Dictionary<string, object>,
roomId: json["roomId"] as string,
status: ChatRoomUtils.getStatusFromString(json["status"] as string)
);
}
public override Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"author", author.toJson()},
{"createdAt", createdAt},
{"id", id},
{"metadata", metadata},
{"roomId", roomId},
{"status", ChatRoomUtils.toShortString(status)},
{"type", ChatRoomUtils.toShortString(MessageType.file)},
};
}
/// Converts a text message to the map representation, encodable to JSON.
/// Creates a copy of the text message with an updated data
/// [metadata] with null value will nullify existing metadata, otherwise
/// both metadatas will be merged into one Map, where keys from a passed
/// metadata will overwite keys from the previous one.
/// [status] with null value will be overwritten by the previous status.
public override Message copyWith(
Dictionary<string, object> metadata = null,
PreviewData previewData = null,
Status? status = null,
string text = null
)
{
var result = new Dictionary<string, object>();
if (this.metadata != null)
foreach (var metaItem in this.metadata)
result.Add(metaItem.Key, metaItem.Value);
foreach (var metaItem in metadata) result.Add(metaItem.Key, metaItem.Value);
return new UnsupportedMessage(
author,
createdAt: createdAt,
id: id,
metadata: metadata == null
? null
: result,
roomId: roomId,
status: status ?? this.status
);
}
}
}

97
AwesomeUIWidgets/Assets/Scripts/ChatRoom/Messages/custom_message.cs


using System.Collections.Generic;
namespace ChatComponents
{
public class CustomMessage : Message
{
/// Creates a custom message.
public CustomMessage(
User author,
string id,
int? createdAt = null,
Dictionary<string, object> metadata = null,
string roomId = null,
Status? status = default
) : base(
author,
createdAt,
id,
metadata,
roomId,
status,
MessageType.custom
)
{
}
public override List<object> props => new List<object>
{
author,
createdAt,
id,
metadata,
roomId,
status
};
/// Creates a custom message from a map (decoded JSON).
public static CustomMessage fromJson(Dictionary<string, object> json)
{
return new CustomMessage(
User.fromJson(json["author"] as Dictionary<string, object>),
createdAt: json["createdAt"] as int?,
id: json["id"] as string,
metadata: json["metadata"] as Dictionary<string, object>,
roomId: json["roomId"] as string,
status: ChatRoomUtils.getStatusFromString(json["status"] as string));
}
/// Converts a custom message to the map representation,
/// encodable to JSON.
public override Dictionary<string, object> toJson()
{
return new Dictionary<string, object>
{
{"author", author.toJson()},
{"createdAt", createdAt},
{"id", id},
{"metadata", metadata},
{"roomId", roomId},
{"status", ChatRoomUtils.toShortString(status)},
{"type", ChatRoomUtils.toShortString(type)}
};
}
/// Creates a copy of the custom message with an updated data.
/// [metadata] with null value will nullify existing metadata, otherwise
/// both metadatas will be merged into one Map, where keys from a passed
/// metadata will overwite keys from the previous one.
/// [previewData] is ignored for this message type.
/// [status] with null value will be overwritten by the previous status.
/// [text] is ignored for this message type.
public override Message copyWith(
Dictionary<string, object> metadata = null,
PreviewData previewData = null,
Status? status = null,
string text = null
)
{
var result = new Dictionary<string, object>();
if (this.metadata != null)
foreach (var metaItem in this.metadata)
result.Add(metaItem.Key, metaItem.Value);
foreach (var metaItem in metadata) result.Add(metaItem.Key, metaItem.Value);
return new CustomMessage(
author,
createdAt: createdAt,
id: id,
metadata: metadata == null
? null
: result,
roomId: roomId,
status: status ?? this.status
);
}
/// Equatable props
}
}

135
AwesomeUIWidgets/Assets/Scripts/Conditional/conditional.cs


using System;
using System.Collections.Generic;
using System.Linq;
using ChatComponents;
using uiwidgets;
using Unity.UIWidgets.animation;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.rendering;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using Image = Unity.UIWidgets.widgets.Image;
namespace UIWidgetsSample
{
public abstract class Conditional
{
/// Creates a new platform appropriate conditional.
///
/// Creates an `IOConditional` if `dart:io` is available and a `BrowserConditional` if
/// `dart:html` is available, otherwise it will throw an unsupported error.
public Conditional() => createConditional();
/// Returns an appropriate platform ImageProvider for specified URI
public abstract ImageProvider getProvider(string uri);
public abstract BaseConditional createConditional();
}
public abstract class BaseConditional : Conditional
{
public override BaseConditional createConditional() => new BrowserConditional();
/*BaseConditional createConditional() =>
throw UnsupportedError('Cannot create a conditional');*/
}
/// A conditional for browser
class BrowserConditional : BaseConditional
{
/// Returns [NetworkImage] if URI starts with http
/// otherwise returns transparent image
public override ImageProvider getProvider(string uri)
{
if ( uri.StartsWith("http") || uri.StartsWith("blob")) {
return new NetworkImage(uri);
}
else {
return new MemoryImage(ConditionalUtils.kTransparentImage);
}
}
}
public static class ConditionalUtils
{
/// Transparent image data
public static byte[] kTransparentImage = nums.SelectMany(BitConverter.GetBytes).ToArray();
public static List<Int32> nums = new List<Int32>()
{
0x89,
0x50,
0x4E,
0x47,
0x0D,
0x0A,
0x1A,
0x0A,
0x00,
0x00,
0x00,
0x0D,
0x49,
0x48,
0x44,
0x52,
0x00,
0x00,
0x00,
0x01,
0x00,
0x00,
0x00,
0x01,
0x08,
0x06,
0x00,
0x00,
0x00,
0x1F,
0x15,
0xC4,
0x89,
0x00,
0x00,
0x00,
0x0A,
0x49,
0x44,
0x41,
0x54,
0x78,
0x9C,
0x63,
0x00,
0x01,
0x00,
0x00,
0x05,
0x00,
0x01,
0x0D,
0x0A,
0x2D,
0xB4,
0x00,
0x00,
0x00,
0x00,
0x49,
0x45,
0x4E,
0x44,
0xAE,
};
}
}

98
AwesomeUIWidgets/Assets/Scripts/Equatable/equatable.cs


using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Unity.UIWidgets.foundation;
namespace UIWidgetsSample
{
public abstract class Equatable : IEquatable<Equatable>
{
/// {@macro equatable}
public Equatable()
{
}
/// {@template equatable_props}
/// The list of properties that will be used to determine whether
/// two instances are equal.
/// {@endtemplate}
public abstract List<Object> props
{
get;
}
/// {@template equatable_stringify}
/// If set to `true`, the [toString] method will be overridden to output
/// this instance's [props].
///
/// A global default value for [stringify] can be set using
/// `EquatableConfig.stringify`.
///
/// If this instance's [stringify] is set to null, the value of
/// `EquatableConfig.stringify` will be used instead. This defaults to
/// `false`.
/// {@endtemplate}
// ignore: avoid_returning_null
bool? stringify
{
get
{
return null;
}
}
public static bool operator ==(Equatable left,Equatable right)
{
return left is Equatable && Equals(left, right) && Equals(left.props,right.props);
}
public static bool operator !=(Equatable left, Equatable right)
{
return !(left == right);
}
/* public override int GetHashCode() {
return (this.GetType().GetHashCode()) ^ mapPropsToHashCode(props);
}*/ // ????
public override string ToString() {
switch (stringify) {
case true:
return EquatableUtils.mapPropsToString(this.GetType(), props);
case false:
return this.GetType().ToString();
default:
return EquatableConfig.stringify == true
? EquatableUtils.mapPropsToString(this.GetType(), props)
: this.GetType().ToString();
}
}
public bool Equals(Equatable other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(props, other.props);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Equatable) obj);
}
public override int GetHashCode()
{
return (props != null ? props.GetHashCode() : 0);
}
}
}

44
AwesomeUIWidgets/Assets/Scripts/Equatable/equatable_config.cs


using Unity.UIWidgets.foundation;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Unity.UIWidgets.foundation;
namespace UIWidgetsSample
{
class EquatableConfig
{
/// {@template stringify}
/// Global [stringify] setting for all [Equatable] instances.
///
/// If [stringify] is overridden for a particular [Equatable] instance,
/// then the local [stringify] value takes precedence
/// over [EquatableConfig.stringify].
///
/// This value defaults to true in debug mode and false in release mode.
/// {@endtemplate}
public static bool stringify
{
get
{
if (_stringify == null)
{
D.assert(() =>
{
_stringify = true;
return true;
});
}
return false;
}
set { _stringify = value; }
}
/// {@macro stringify}
static bool? _stringify;
}
}

73
AwesomeUIWidgets/Assets/Scripts/Equatable/equatable_mixin.cs


using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Unity.UIWidgets.foundation;
namespace UIWidgetsSample
{
public abstract class EquatableMixin: IEquatable<EquatableMixin> {
/// {@macro equatable_props}
private List<object> props
{
get;
}
/// {@macro equatable_stringify}
// ignore: avoid_returning_null
bool? stringify
{
get
{
return null;
}
}
public static bool operator ==(EquatableMixin left,EquatableMixin right) {
return Equals(left, right) && Equals(left.props, right.props);
}
public static bool operator !=(EquatableMixin left, EquatableMixin right)
{
return !(left == right);
}
//@override int get hashCode => runtimeType.hashCode ^ mapPropsToHashCode(props);
public override string ToString() {
switch (stringify) {
case true:
return EquatableUtils.mapPropsToString(this.GetType(), props);
case false:
return this.GetType().ToString();
default:
return EquatableConfig.stringify == true
? EquatableUtils.mapPropsToString(this.GetType(), props)
: this.GetType().ToString();
}
}
public bool Equals(EquatableMixin other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(props, other.props);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((EquatableMixin) obj);
}
public override int GetHashCode()
{
return (props != null ? props.GetHashCode() : 0);
}
}
}

113
AwesomeUIWidgets/Assets/Scripts/Equatable/equatable_utils.cs


using System;
using System.Collections.Generic;
namespace UIWidgetsSample
{
public class EquatableUtils
{
// private DeepCollectionEquality _equality = DeepCollectionEquality();
private int mapPropsToHashCode(List<object> props)
{
var value = 0;
foreach (var prop in props)
{
value = _combine(value, prop);
}
return _finish(props == null ? 0 : value);
}
/// Determines whether [list1] and [list2] are equal.
private bool equals(List<object> list1, List<object> list2)
{
if (list1.Equals(list2)) return true;
if (list1 == null || list2 == null) return false;
var length = list1.Count;
if (length != list2.Count) return false;
for (var i = 0; i < length; i++)
{
var unit1 = list1[i];
var unit2 = list2[i];
if (_isEquatable(unit1) && _isEquatable(unit2))
{
if (unit1 != unit2) return false;
}
else if (unit1 is List<object> || unit1 is Dictionary<object, object>)
{
//if (!_equality.equals(unit1, unit2))
if(!Equals(unit1,unit2))
return false;
}
else if (unit1?.GetType() != unit2?.GetType())
{
return false;
}
else if (unit1 != unit2)
{
return false;
}
}
return true;
}
private bool _isEquatable(object _object)
{
return _object is Equatable || _object is EquatableMixin;
}
/// Jenkins Hash Functions
/// https://en.wikipedia.org/wiki/Jenkins_hash_function
private int _combine(int hash, object _object)
{
if (_object is Dictionary<object, object>)
{
var Keys = new List<object>();
foreach (var key in ((Dictionary<object, object>) _object).Keys) Keys.Add(key);
Keys.Sort((a, b) => a.GetHashCode() - b.GetHashCode());
foreach (var key in Keys)
{
var value = (object) null;
var keyValue = ((Dictionary<object, object>) _object).TryGetValue(key, out value);
hash = hash ^ _combine(hash, new Dictionary<object, object> {{key, value}});
}
;
return hash;
}
if (_object is List<object>)
{
foreach (var value in (List<object>) _object) hash = hash ^ _combine(hash, value);
return hash ^ ((List<object>) _object).Count;
}
hash = 0x1fffffff & (hash + _object.GetHashCode());
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
private int _finish(int hash)
{
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
/// Returns a string for [props].
public static string mapPropsToString(Type runtimeType, List<object> props)
{
var result = "";
var results = new List<string>();
foreach (var prop in props) results.Add(prop.ToString());
//props.map((prop) => prop.toString()).join(', ')
return string.Join(",", results);
}
}
}

20
AwesomeUIWidgets/Assets/Scripts/Models/date_header.cs


using System.Collections.Generic;
namespace UIWidgetsSample
{
public class DateHeader : Equatable
{
/// Text to show in a header
public readonly string text;
/// Creates a date header.
public DateHeader(string text = null)
{
this.text = text;
}
/// Equatable props
public override List<object> props => new List<object>
{text};
}
}

25
AwesomeUIWidgets/Assets/Scripts/Models/message_spacer.cs


using System.Collections.Generic;
namespace UIWidgetsSample
{
public class MessageSpacer : Equatable
{
/// Text to show in a header
public readonly string id;
public readonly float height;
/// Creates a date header.
public MessageSpacer(
float height = 0.0f,
string id = null)
{
this.id = id;
this.height = height;
}
/// Equatable props
public override List<object> props => new List<object>
{id,height};
}
}

27
AwesomeUIWidgets/Assets/Scripts/Models/preview_image.cs


using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Unity.UIWidgets.foundation;
namespace UIWidgetsSample
{
public class PreviewImage : Equatable {
/// Creates a preview image.
public PreviewImage(
string id,
string uri)
{
this.id = id;
this.uri = uri;
}
public override List<object> props => new List<object>{id, uri};
/// Unique ID of the image
public readonly string id;
/// Image's URI
public readonly string uri;
}
}

55
AwesomeUIWidgets/Assets/Scripts/Widgets/attachment_button.cs


using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using UnityEngine;
using Image = Unity.UIWidgets.widgets.Image;
namespace UIWidgetsSample
{
public delegate void OnPressed();
internal class AttachmentButton : StatelessWidget
{
/// Callback for attachment button tap event
public readonly OnPressed onPressed;
/// Creates attachment button widget
public AttachmentButton(
OnPressed onPressed,
Key key = null
) : base(key)
{
this.onPressed = onPressed;
}
public override Widget build(BuildContext context)
{
var test = InheritedChatTheme.of(context).theme.inputTextColor;
return new Container(
height: 14,
margin: EdgeInsets.only(right: 16),
width: 24,
child: new IconButton(
icon: InheritedChatTheme.of(context).theme.attachmentButtonIcon != null
? InheritedChatTheme.of(context).theme.attachmentButtonIcon
: Image.file(
"assets/icon-attachment.png",
color: InheritedChatTheme.of(context).theme.inputTextColor,
//package: "flutter_chat_ui",
scale: 1
),
onPressed: ()=>
{
Debug.Log("add file , not available yet");
//onPressed();
},
padding: EdgeInsets.zero,
tooltip:
InheritedL10n.of(context)?.l10n?.attachmentButtonAccessibilityLabel
)
);
}
}
}

299
AwesomeUIWidgets/Assets/Scripts/Widgets/chat_list.cs


using System;
using System.Collections.Generic;
using System.Linq;
using uiwidgets;
using Unity.UIWidgets.animation;
using Unity.UIWidgets.async;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.scheduler;
using Unity.UIWidgets.widgets;
using UnityEngine;
using Color = Unity.UIWidgets.ui.Color;
namespace UIWidgetsSample
{
public delegate Widget ItemBuilder(object _object, int? index);
public class ChatList : StatefulWidget
{
/// Used for pagination (infinite scroll) together with [onEndReached].
/// When true, indicates that there are no more pages to load and
/// pagination will not be triggered.
public readonly bool? isLastPage;
/// Item builder
public readonly ItemBuilder itemBuilder;
/// Items to build
public readonly List<object> items;
/// Used for pagination (infinite scroll). Called when user scrolls
/// to the very end of the list (minus [onEndReachedThreshold]).
public readonly OnEndReached onEndReached;
/// Used for pagination (infinite scroll) together with [onEndReached].
/// Can be anything from 0 to 1, where 0 is immediate load of the next page
/// as soon as scroll starts, and 1 is load of the next page only if scrolled
/// to the very end of the list. Default value is 0.75, e.g. start loading
/// next page when scrolled through about 3/4 of the available content.
public readonly float? onEndReachedThreshold;
/// Creates a chat list widget
public ChatList(
ItemBuilder itemBuilder,
List<object> items,
OnEndReached onEndReached = null,
float? onEndReachedThreshold = null,
Key key = null,
bool? isLastPage = null
) : base(key)
{
this.itemBuilder = itemBuilder;
this.items = items;
this.onEndReached = onEndReached;
this.onEndReachedThreshold = onEndReachedThreshold;
this.isLastPage = isLastPage;
}
public override State createState()
{
return new _ChatListState();
}
}
/// [ChatList] widget state
public class _ChatListState : SingleTickerProviderStateMixin<ChatList>
{
public readonly GlobalKey<SliverAnimatedListState> _listKey = GlobalKey<SliverAnimatedListState>.key();
public readonly ScrollController _scrollController = new ScrollController();
public Animation<float> _animation;
public AnimationController _controller;
public bool _isNextPageLoading;
public List<object> _oldData;
public List<string> _oldIndex;
public override void initState()
{
base.initState();
didUpdateWidget(widget);
_controller = new AnimationController(vsync: this);
_animation = new CurvedAnimation(
curve: Curves.easeOutQuad,
parent: _controller
);
_isNextPageLoading = false;
_oldData = new List<object>();
_oldData.AddRange(widget.items);
_oldIndex = new List<string>();
}
public override void didUpdateWidget(StatefulWidget oldWidget)
{
oldWidget = (ChatList) oldWidget;
base.didUpdateWidget(oldWidget);
_calculateDiffs(((ChatList) oldWidget).items);
}
public override void dispose()
{
base.dispose();
_controller.dispose();
_scrollController.dispose();
}
private void _calculateDiffs(List<object> oldList)
{
foreach (var item in widget.items)
{
if (item is Dictionary<string, object> )
{
var message1 = ((Dictionary<string, object>)item)["message"] as ChatComponents.Message;
int test = widget.items.IndexOf(item);
if (message1 != null)
{
if (_oldIndex != null && !_oldIndex.Contains(message1.id))
{
_listKey.currentState?.insertItem(0);
}
}
}
}
_scrollToBottomIfNeeded(oldList);
_oldData = new List<object>(widget.items);
List<string> _newIndex = new List<string>();
foreach (var item in widget.items)
{
if (item is Dictionary<string, object> )
{
var message1 = ((Dictionary<string, object>)item)["message"] as ChatComponents.Message;
if (message1 != null)
_newIndex.Add(message1.id);
}
}
_oldIndex = _newIndex;
}
// Hacky solution to reconsider
private void _scrollToBottomIfNeeded(List<object> oldList)
{
try
{
// Take index 1 because there is always a spacer on index 0
var oldItem = oldList[1];
var item = widget.items[1];
// Compare items to fire only on newly added messages
if (oldItem != item && item is Dictionary<string, object>)
{
var message = ((Dictionary<string, object>) item)["message"] as ChatComponents.Message;
// Run only for sent message
if (message.author.id ==
InheritedUser.of(context).user.id) // Delay to give some time for Flutter to calculate new
// size after new message was added
Future.delayed(TimeSpan.FromMilliseconds(100), () =>
{
_scrollController.animateTo(
0,
TimeSpan.FromMilliseconds(200),
Curves.easeInQuad
);
return default;
});
}
}
catch (Exception e)
{
// Do nothing if there are no items
}
}
private Widget _buildRemovedMessage(object item, Animation<float> animation)
{
return new SizeTransition(
axisAlignment: -1,
sizeFactor: animation.drive(new CurveTween(Curves.easeInQuad)),
child: new FadeTransition(
opacity: animation.drive(new CurveTween(Curves.easeInQuad)),
child: widget.itemBuilder(item, null)
)
);
}
private Widget _buildNewMessage(int index, Animation<float> animation)
{
try
{
var item = _oldData[index];
return new SizeTransition(
axisAlignment: -1,
sizeFactor: animation.drive(new CurveTween(Curves.easeOutQuad)),
child: widget.itemBuilder(item, index)
);
}
catch (Exception e)
{
return new SizedBox();
}
}
public override Widget build(BuildContext context)
{
return new NotificationListener<ScrollNotification>(
onNotification: notification =>
{
if (widget.onEndReached == null || widget.isLastPage == true) return false;
var _onEndReachedThreshold =
widget.onEndReachedThreshold == null ? 0.75f : (float) widget.onEndReachedThreshold;
if (notification.metrics.pixels >= notification.metrics.maxScrollExtent * _onEndReachedThreshold)
{
if (widget.items.isEmpty() || _isNextPageLoading)
return false;
SchedulerBinding.instance.addPostFrameCallback(stamp =>
{
_controller.duration = TimeSpan.Zero;
_controller.forward();
setState(() => { _isNextPageLoading = true; });
widget.onEndReached().whenComplete(() =>
{
_controller.duration = TimeSpan.FromMilliseconds(300);
_controller.reverse();
setState(() => { _isNextPageLoading = false; });
});
});
}
return false;
},
child:
new CustomScrollView(
controller: _scrollController,
reverse: true,
slivers: new List<Widget>
{
new SliverPadding(
padding: EdgeInsets.only(bottom: 4),
sliver: new SliverAnimatedList(
initialItemCount: widget.items.Count,
key: _listKey,
itemBuilder: (_, index, animation) =>
{
return _buildNewMessage(index, animation);
}
)
),
new SliverPadding(
padding: EdgeInsets.only(
top: 16
),
sliver: new SliverToBoxAdapter(
child: new SizeTransition(
axisAlignment: 1,
sizeFactor: _animation,
child: new Center(
child: new Container(
alignment: Alignment.center,
height: 32,
width: 32,
child: new SizedBox(
height: 16,
width: 16,
child: new CircularProgressIndicator(
backgroundColor: Colors.transparent,
strokeWidth: 2,
valueColor: new AlwaysStoppedAnimation<Color>(
InheritedChatTheme.of(context).theme.primaryColor
)
)
)
)
)
)
)
)
}
)
);
}
}
}

33
AwesomeUIWidgets/Assets/Scripts/Widgets/inherited_l10n.cs


using Unity.UIWidgets.foundation;
using Unity.UIWidgets.widgets;
namespace UIWidgetsSample
{
public class InheritedL10n : InheritedWidget
{
/// Represents localized copy
public readonly ChatL10n l10n;
/// Creates [InheritedWidget] from a provided [ChatL10n] class
public InheritedL10n(
ChatL10n l10n,
Widget child,
Key key = null
) : base(key, child)
{
this.l10n = l10n;
}
public static InheritedL10n of(BuildContext context)
{
return context.dependOnInheritedWidgetOfExactType<InheritedL10n>();
}
public override bool updateShouldNotify(InheritedWidget oldWidget)
{
var test = ((InheritedL10n) oldWidget).l10n;
return l10n.GetHashCode() != ((InheritedL10n) oldWidget).l10n?.GetHashCode();
}
}
}

33
AwesomeUIWidgets/Assets/Scripts/Widgets/inherited_theme.cs


using Unity.UIWidgets.foundation;
using Unity.UIWidgets.widgets;
namespace UIWidgetsSample
{
internal class InheritedChatTheme : InheritedWidget
{
/// Represents chat theme
public readonly ChatTheme theme;
/// Creates [InheritedWidget] from a provided [ChatTheme] class
public InheritedChatTheme(
ChatTheme theme,
Widget child,
Key key = null
) : base(key, child)
{
this.theme = theme;
}
public static InheritedChatTheme of(BuildContext context)
{
return context.dependOnInheritedWidgetOfExactType<InheritedChatTheme>();
}
public override bool updateShouldNotify(InheritedWidget oldWidget)
{
var result = theme.GetHashCode() != ((InheritedChatTheme) oldWidget).theme.GetHashCode();
return result;
}
}
}

33
AwesomeUIWidgets/Assets/Scripts/Widgets/inherited_user.cs


using ChatComponents;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.widgets;
namespace UIWidgetsSample
{
internal class InheritedUser : InheritedWidget
{
/// Represents current logged in user. Used to determine message's author.
public readonly User user;
/// Creates [InheritedWidget] from a provided [types.User] class
public InheritedUser(
User user,
Widget child,
Key key = null
) : base(key, child)
{
this.user = user;
}
public static InheritedUser of(BuildContext context)
{
return context.dependOnInheritedWidgetOfExactType<InheritedUser>();
}
public override bool updateShouldNotify(InheritedWidget oldWidget)
{
var result = user.id != ((InheritedUser) oldWidget).user.id;
return result;
}
}
}

272
AwesomeUIWidgets/Assets/Scripts/Widgets/message.cs


using System.Collections.Generic;
using ChatComponents;
using uiwidgets;
using Unity.UIWidgets.animation;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.rendering;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using Image = Unity.UIWidgets.widgets.Image;
namespace UIWidgetsSample
{
internal class Message : StatelessWidget
{
/// Build a custom message inside predefined bubble
public readonly BuildCustomMessage buildCustomMessage;
/// Any message type
public readonly ChatComponents.Message message;
/// Maximum message width
public readonly int messageWidth;
/// Called when user makes a long press on any message
public readonly OnMessageLongPress onMessageLongPress;
/// Called when user taps on any message
public readonly OnMessageTap onMessageTap;
/// See [TextMessage.onPreviewDataFetched]
public readonly OnPreviewDataFetched onPreviewDataFetched;
/// Rounds border of the message to visually group messages together.
public readonly bool roundBorder;
/// Show user avatar for the received message. Useful for a group chat.
public readonly bool showAvatar;
/// See [TextMessage.showName]
public readonly bool showName;
/// Show message's status
public readonly bool showStatus;
/// Show user avatars for received messages. Useful for a group chat.
public readonly bool showUserAvatars;
/// See [TextMessage.usePreviewData]
public readonly bool usePreviewData;
/// Creates a particular message from any message type
public Message(
ChatComponents.Message message,
int messageWidth,
bool roundBorder,
bool showAvatar,
bool showName,
bool showStatus,
bool showUserAvatars,
bool usePreviewData,
Key key = null,
OnMessageLongPress onMessageLongPress = null,
OnMessageTap onMessageTap = null,
OnPreviewDataFetched onPreviewDataFetched = null,
BuildCustomMessage buildCustomMessage = null
) : base(key)
{
this.message = message;
this.messageWidth = messageWidth;
this.buildCustomMessage = buildCustomMessage;
this.onMessageTap = onMessageTap;
this.onMessageLongPress = onMessageLongPress;
this.onPreviewDataFetched = onPreviewDataFetched;
this.roundBorder = roundBorder;
this.showAvatar = showAvatar;
this.showName = showName;
this.showStatus = showStatus;
this.showUserAvatars = showUserAvatars;
this.usePreviewData = usePreviewData;
}
private Widget _buildAvatar(BuildContext context)
{
var color = ChatUtils.getUserAvatarNameColor(message.author,
InheritedChatTheme.of(context).theme.userAvatarNameColors);
var hasImage = message.author.imageUrl != null;
string name = ChatUtils.getUserName(message.author);
return showAvatar
? new Container(
margin: EdgeInsets.only(right: 8),
child: new CircleAvatar(
backgroundImage:
hasImage ? new NetworkImage(message.author.imageUrl == null ? "" : (string)message.author.imageUrl) : null,
backgroundColor: color,
radius: 16,
child: !hasImage
? new Text(
name.isEmpty() ? "" : name[0].ToString().ToUpper(),
style: InheritedChatTheme.of(context).theme.userAvatarTextStyle
)
: null
)
)
: new Container(
margin: EdgeInsets.only(right: 40)
);
}
private Widget _buildMessage()
{
switch (message.type)
{
case MessageType.custom:
var customMessage = message as CustomMessage;
return buildCustomMessage != null
? buildCustomMessage(customMessage)
: new SizedBox();
/*case MessageType.file:
var fileMessage = message as ChatComponents.FileMessage;
return new FileMessage(
message: fileMessage
);
case MessageType.image:
var imageMessage = message as ChatComponents.ImageMessage;
return new ImageMessage(
message: imageMessage,
messageWidth: messageWidth
);*/
case MessageType.text:
var textMessage = message as ChatComponents.TextMessage;
return new TextMessage(
message: textMessage,
onPreviewDataFetched: onPreviewDataFetched,
showName: showName,
usePreviewData: usePreviewData
);
default:
return new SizedBox();
}
}
private Widget _buildStatus(BuildContext context)
{
switch (message.status)
{
case Status.error:
return InheritedChatTheme.of(context).theme.errorIcon != null
? InheritedChatTheme.of(context).theme.errorIcon
: Image.asset(
"assets/icon-error.png",
color: InheritedChatTheme.of(context).theme.errorColor,
package: "flutter_chat_ui"
);
case Status.sent:
case Status.delivered:
return InheritedChatTheme.of(context).theme.deliveredIcon != null
? InheritedChatTheme.of(context).theme.deliveredIcon
: Image.asset(
"assets/icon-delivered.png",
color: InheritedChatTheme.of(context).theme.primaryColor,
package: "flutter_chat_ui"
);
case Status.seen:
return InheritedChatTheme.of(context).theme.seenIcon != null
? InheritedChatTheme.of(context).theme.seenIcon
: Image.file(
"assets/icon-seen.png",
color: InheritedChatTheme.of(context).theme.primaryColor,
scale:1
//package: "flutter_chat_ui"
);
case Status.sending:
return new Center(
child: new SizedBox(
height: 10,
width: 10,
child: new CircularProgressIndicator(
backgroundColor: Colors.transparent,
strokeWidth: 1.5f,
valueColor: new AlwaysStoppedAnimation<Color>(
InheritedChatTheme.of(context).theme.primaryColor
)
)
)
);
default:
return new SizedBox();
}
}
public override Widget build(BuildContext context)
{
var _user = InheritedUser.of(context).user;
var _messageBorderRadius =
InheritedChatTheme.of(context).theme.messageBorderRadius;
var _borderRadius = BorderRadius.only(
bottomLeft: Radius.circular(_user.id == message.author.id || roundBorder
? _messageBorderRadius
: 0),
bottomRight: Radius.circular(_user.id == message.author.id
? roundBorder
? _messageBorderRadius
: 0
: _messageBorderRadius),
topLeft: Radius.circular(_messageBorderRadius),
topRight: Radius.circular(_messageBorderRadius)
);
var _currentUserIsAuthor = _user.id == message.author.id;
var results = new List<Widget>();
if (!_currentUserIsAuthor && showUserAvatars)
results.Add(_buildAvatar(context));
results.Add(new ConstrainedBox(
constraints: new BoxConstraints(
maxWidth: messageWidth * 1f
),
child: new Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: new List<Widget>
{
new GestureDetector(
onLongPress: () => onMessageLongPress?.Invoke(message),
onTap: () => onMessageTap?.Invoke(message),
child: new Container(
decoration: new BoxDecoration(
borderRadius: _borderRadius,
color: !_currentUserIsAuthor ||
message.type == MessageType.image
? InheritedChatTheme.of(context).theme.secondaryColor
: InheritedChatTheme.of(context).theme.primaryColor
),
child: new ClipRRect(
borderRadius: _borderRadius,
child: _buildMessage()
)
)
)
}
)
));
if (_currentUserIsAuthor)
results.Add(new Padding(
padding: EdgeInsets.symmetric(horizontal: 4),
child: new Center(
child: new SizedBox(
height: 16,
width: 16,
child: showStatus ? _buildStatus(context) : null
)
)
));
return new Container(
alignment: _user.id == message.author.id
? Alignment.centerRight
: Alignment.centerLeft,
margin: EdgeInsets.only(
bottom: 4,
left: 20
),
child: new Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: results)
);
}
}
}

45
AwesomeUIWidgets/Assets/Scripts/Widgets/send_button.cs


using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.widgets;
namespace UIWidgetsSample
{
public class SendButton : StatelessWidget
{
/// Callback for send button tap event
public readonly OnPressed onPressed;
/// Creates send button widget
public SendButton(
OnPressed onPressed,
Key key = null
) : base(key)
{
this.onPressed = onPressed;
}
public override Widget build(BuildContext context)
{
Widget icon = InheritedChatTheme.of(context).theme.sendButtonIcon != null
? InheritedChatTheme.of(context).theme.sendButtonIcon
: Image.file(
"assets/icon-send.png",
color: InheritedChatTheme.of(context).theme.inputTextColor,
scale: 1
);
var tooltip = InheritedL10n.of(context).l10n?.sendButtonAccessibilityLabel;
return new Container(
height: 20,
margin: EdgeInsets.only(right:16),
width: 30,
child: new IconButton(
icon: icon,
onPressed: () => { onPressed(); },
padding: EdgeInsets.zero,
tooltip: tooltip
)
);
}
}
}

156
AwesomeUIWidgets/Assets/Scripts/Widgets/text_message.cs


using System.Collections.Generic;
using System.Text.RegularExpressions;
using ChatComponents;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.rendering;
using Unity.UIWidgets.widgets;
namespace UIWidgetsSample
{
internal class TextMessage : StatelessWidget
{
/// [types.TextMessage]
public readonly ChatComponents.TextMessage message;
/// See [LinkPreview.onPreviewDataFetched]
public readonly OnPreviewDataFetched
onPreviewDataFetched;
/// Show user name for the received message. Useful for a group chat.
public readonly bool showName;
/// Enables link (URL) preview
public readonly bool usePreviewData;
/// Creates a text message widget from a [types.TextMessage] class
public TextMessage(
ChatComponents.TextMessage message,
bool usePreviewData,
bool showName,
Key key = null,
OnPreviewDataFetched onPreviewDataFetched = null
) : base(key)
{
this.message = message;
this.usePreviewData = usePreviewData;
this.showName = showName;
this.onPreviewDataFetched = onPreviewDataFetched;
}
private void _onPreviewDataFetched(PreviewData previewData)
{
if (message.previewData == null)
onPreviewDataFetched?.Invoke(previewData,message);
}
private Widget _linkPreview(
User user,
float width,
BuildContext context
)
{
var bodyTextStyle = user.id == message.author.id
? InheritedChatTheme.of(context).theme.sentMessageBodyTextStyle
: InheritedChatTheme.of(context).theme.receivedMessageBodyTextStyle;
var linkDescriptionTextStyle = user.id == message.author.id
? InheritedChatTheme.of(context)
.theme
.sentMessageLinkDescriptionTextStyle
: InheritedChatTheme.of(context)
.theme
.receivedMessageLinkDescriptionTextStyle;
var linkTitleTextStyle = user.id == message.author.id
? InheritedChatTheme.of(context).theme.sentMessageLinkTitleTextStyle
: InheritedChatTheme.of(context)
.theme
.receivedMessageLinkTitleTextStyle;
var test = InheritedChatTheme.of(context);
var color = ChatUtils.getUserAvatarNameColor(message.author, InheritedChatTheme.of(context).theme.userAvatarNameColors);
var name = ChatUtils.getUserName(message.author);
return new LinkPreview(
width: width,
enableAnimation: true,
header: showName ? name : null,
headerStyle: InheritedChatTheme.of(context)
.theme
.userNameTextStyle
.copyWith(color: color),
linkStyle: bodyTextStyle,
metadataTextStyle: linkDescriptionTextStyle,
metadataTitleStyle: linkTitleTextStyle,
onPreviewDataFetched: (previewData,textMessage)=>
{
_onPreviewDataFetched(previewData);
},
padding: EdgeInsets.symmetric(
horizontal: 24,
vertical: 16
),
previewData: message.previewData,
text: message.text,
textStyle: bodyTextStyle
);
}
private Widget _textWidget(User user, BuildContext context)
{
var color = ChatUtils.getUserAvatarNameColor(message.author,
InheritedChatTheme.of(context).theme.userAvatarNameColors);
var name = ChatUtils.getUserName(message.author);
var results = new List<Widget>();
if (showName)
results.Add(new Padding(
padding: EdgeInsets.only(bottom: 6.0f),
child: new Text(
name,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: InheritedChatTheme.of(context)
.theme
.userNameTextStyle
.copyWith(color: color)
)
));
var test = InheritedChatTheme.of(context);
var style = user.id == message.author.id
? InheritedChatTheme.of(context).theme.sentMessageBodyTextStyle
: InheritedChatTheme.of(context)
.theme
.receivedMessageBodyTextStyle;
results.Add(//new SelectableText(
new Text(
data: message.text,
style: style ,
textWidthBasis: TextWidthBasis.longestLine
));
return new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: results
);
}
public override Widget build(BuildContext context)
{
var _user = InheritedUser.of(context).user;
var _width = MediaQuery.of(context).size.width;
var urlRegexp = new Regex(ChatUtils.REGEX_LINK);
var matches = urlRegexp.Match(message.text.ToLower());
if (matches.Length !=0 && usePreviewData && onPreviewDataFetched != null)
return _linkPreview(_user, _width, context);
return new Container(
margin: EdgeInsets.symmetric(
horizontal: 24,
vertical: 16
),
child: _textWidget(_user, context)
);
}
}
}

455
AwesomeUIWidgets/Assets/Scripts/Widgets/chat.cs


using System;
using System.Collections.Generic;
using ChatComponents;
using uiwidgets;
using Unity.UIWidgets.async;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using UnityEngine;
using Color = Unity.UIWidgets.ui.Color;
namespace UIWidgetsSample
{
public delegate string CustomDateHeaderText(DateTime dateTime);
public delegate void OnAttachmentPressed();
public delegate Future OnEndReached();
public delegate void OnMessageLongPress(ChatComponents.Message message);
public delegate void OnMessageTap(ChatComponents.Message message);
public delegate void OnPreviewDataFetched( PreviewData previewData,ChatComponents.TextMessage textMessage = null);
public delegate void OnSendPressed(PartialText partialText);
public delegate void OnTextChanged(string _str);
public delegate Widget BuildCustomMessage(ChatComponents.Message message);
public class Chat : StatefulWidget
{
/// See [Message.buildCustomMessage]
/// If [dateFormat], [dateLocale] and/or [timeFormat] is not enough to
/// customize date headers in your case, use this to return an arbitrary
/// string based on a [DateTime] of a particular message. Can be helpful to
/// return "Today" if [DateTime] is today. IMPORTANT: this will replace
/// all default date headers, so you must handle all cases yourself, like
/// for example today, yesterday and before. Or you can just return the same
/// date header for any message.
public readonly BuildCustomMessage buildCustomMessage;
public readonly CustomDateHeaderText customDateHeaderText;
/// Allows you to customize the date format. IMPORTANT: only for the date,
/// do not return time here. See [timeFormat] to customize the time format.
/// [dateLocale] will be ignored if you use this, so if you want a localized date
/// make sure you initialize your [DateFormat] with a locale. See [customDateHeaderText]
/// for more customization.
public readonly DateTime? dateFormat;
/// Locale will be passed to the `Intl` package. Make sure you initialized
/// date formatting in your app before passing any locale here, otherwise
/// an error will be thrown. Also see [customDateHeaderText], [dateFormat], [timeFormat].
public readonly string dateLocale;
/// Disable automatic image preview on tap.
public readonly bool? disableImageGallery;
/// See [Input.isAttachmentUploading]
public readonly bool? isAttachmentUploading;
/// See [ChatList.isLastPage]
public readonly bool? isLastPage;
/// Localized copy. Extend [ChatL10n] class to create your own copy or use
/// existing one, like the default [ChatL10nEn]. You can customize only
/// certain variables, see more here [ChatL10nEn].
public readonly ChatL10n l10n;
/// List of [types.Message] to render in the chat widget
public readonly List<ChatComponents.Message> messages;
/// See [Input.onAttachmentPressed]
public readonly OnAttachmentPressed onAttachmentPressed;
/// See [ChatList.onEndReached]
public readonly OnEndReached onEndReached;
/// See [ChatList.onEndReachedThreshold]
public readonly float? onEndReachedThreshold;
/// See [Message.onMessageLongPress]
public readonly OnMessageLongPress onMessageLongPress;
/// See [Message.onMessageTap]
public readonly OnMessageTap onMessageTap;
/// See [Message.onPreviewDataFetched]
public readonly OnPreviewDataFetched onPreviewDataFetched;
/// See [Input.onSendPressed]
public readonly OnSendPressed onSendPressed;
/// See [Input.onTextChanged]
public readonly OnTextChanged onTextChanged;
/// See [Message.showUserAvatars]
public readonly bool showUserAvatars;
/// Show user names for received messages. Useful for a group chat. Will be
/// shown only on text messages.
public readonly bool showUserNames;
/// Chat theme. Extend [ChatTheme] class to create your own theme or use
/// existing one, like the [DefaultChatTheme]. You can customize only certain
/// variables, see more here [DefaultChatTheme].
public readonly ChatTheme theme;
/// Allows you to customize the time format. IMPORTANT: only for the time,
/// do not return date here. See [dateFormat] to customize the date format.
/// [dateLocale] will be ignored if you use this, so if you want a localized time
/// make sure you initialize your [DateFormat] with a locale. See [customDateHeaderText]
/// for more customization.
public readonly DateTime? timeFormat;
/// See [Message.usePreviewData]
public readonly bool usePreviewData;
/// See [InheritedUser.user]
public readonly User user;
/// Creates a chat widget
public Chat(
List<ChatComponents.Message> messages,
OnSendPressed onSendPressed,
User user,
Key key = null,
BuildCustomMessage buildCustomMessage = null,
CustomDateHeaderText customDateHeaderText = null,
DateTime? dateFormat = null,
string dateLocale = null,
bool? disableImageGallery = null,
bool? isAttachmentUploading = null,
bool? isLastPage = null,
ChatL10nEn l10n = null,
OnAttachmentPressed onAttachmentPressed = null,
OnEndReached onEndReached = null,
float? onEndReachedThreshold = null,
OnMessageLongPress onMessageLongPress = null,
OnMessageTap onMessageTap = null,
OnPreviewDataFetched onPreviewDataFetched = null,
OnTextChanged onTextChanged = null,
bool showUserAvatars = false,
bool showUserNames = false,
ChatTheme theme = null,
DateTime? timeFormat = null,
bool usePreviewData = true
) : base(key)
{
this.buildCustomMessage = buildCustomMessage;
this.customDateHeaderText = customDateHeaderText;
this.dateFormat = dateFormat;
this.dateLocale = dateLocale;
this.disableImageGallery = disableImageGallery;
this.isAttachmentUploading = isAttachmentUploading;
this.isLastPage = isLastPage;
this.l10n = l10n == null ? new ChatL10nEn() : l10n;
this.messages = messages;
this.onAttachmentPressed = onAttachmentPressed;
this.onEndReached = onEndReached;
this.onEndReachedThreshold = onEndReachedThreshold;
this.onMessageLongPress = onMessageLongPress;
this.onMessageTap = onMessageTap;
this.onPreviewDataFetched = onPreviewDataFetched;
this.onSendPressed = onSendPressed;
this.onTextChanged = onTextChanged;
this.showUserAvatars = showUserAvatars;
this.showUserNames = showUserNames;
this.theme = theme == null ? new DefaultChatTheme() : theme;
this.timeFormat = timeFormat;
this.usePreviewData = usePreviewData;
this.user = user;
}
public override State createState()
{
return new _ChatState();
}
}
/// [Chat] widget state
public class _ChatState : State<Chat>
{
private List<object> _chatMessages = new List<object>();
private List<PreviewImage> _gallery = new List<PreviewImage>();
private int _imageViewIndex;
private bool _isImageViewVisible;
public override void initState()
{
base.initState();
didUpdateWidget(widget);
}
public override void didUpdateWidget(StatefulWidget oldWidget)
{
oldWidget = (Chat) oldWidget;
base.didUpdateWidget((Chat)oldWidget);
if (widget.messages.isNotEmpty())
{
var result = ChatUtils.calculateChatMessages(
widget.messages,
widget.user,
customDateHeaderText: widget.customDateHeaderText,
dateFormat: widget.dateFormat,
dateLocale: widget.dateLocale,
showUserNames: widget.showUserNames,
timeFormat: widget.timeFormat
);
_chatMessages = result[0] as List<object>;
_gallery = result[1] as List<PreviewImage>;
}
}
/*private Widget _buildImageGallery()
{
return new Dismissible(
GlobalKey.key("photo_view_gallery"),
direction:
DismissDirection.down,
onDismissed:
direction => _onCloseGalleryPressed(),
child:
new Stack(
children: new List<Widget>
{
PhotoViewGallery.builder(
builder: (BuildContext context, int index) =>
PhotoViewGalleryPageOptions(
imageProvider: new BrowserConditional().getProvider(_gallery[index].uri)
),
itemCount: _gallery.Count,
loadingBuilder: (_context, _event) =>
_imageGalleryLoadingBuilder(_context, _event),
onPageChanged:
_onPageChanged,
pageController:
new PageController(_imageViewIndex),
scrollPhysics:
new ClampingScrollPhysics()
),
new Positioned(
right: 16,
top: 56,
child: new CloseButton(
color: Colors.white,
onPressed: _onCloseGalleryPressed
)
)
}
)
);
}*/
private Widget _buildMessage(object _object)
{
if (_object is DateHeader)
{
return new Container(
alignment: Alignment.center,
margin: EdgeInsets.only(
bottom: 32,
top: 16
),
child:
new Text(
((DateHeader) _object).text,
style: widget.theme.dateDividerTextStyle
)
);
}
else if (_object is MessageSpacer)
{
var height = ((MessageSpacer) _object).height;
return new SizedBox(
height: height
);
}
else
{
var map = _object as Dictionary<string, object>;
var message = map["message"] as ChatComponents.Message;
var _messageWidth =
widget.showUserAvatars && message.author.id != widget.user.id
? Mathf.Min(MediaQuery.of(context).size.width * 0.72f, 440).floor()
: Mathf.Min(MediaQuery.of(context).size.width * 0.78f, 440).floor();
return new Message(
key: new ValueKey<string>(message.id),
buildCustomMessage: widget.buildCustomMessage,
message: message,
messageWidth: _messageWidth,
onMessageLongPress: widget.onMessageLongPress,
onMessageTap: tappedMessage =>
{
if (tappedMessage is ImageMessage && widget.disableImageGallery != true)
_onImagePressed((ImageMessage) tappedMessage);
widget.onMessageTap?.Invoke(tappedMessage);
},
onPreviewDataFetched:
(previewData,textMessage)=>
{
_onPreviewDataFetched( textMessage,previewData);
},
roundBorder: true, //(map["nextMessageInGroup"] is bool ? (bool) map["nextMessageInGroup"] : false),
showAvatar:
widget.showUserAvatars && false,
//(map["nextMessageInGroup"] is bool ? (bool) map["nextMessageInGroup"] : false) == false,
showName:
false,
//(map["showName"] is bool ? (bool) map["showName"] : false),
showStatus:
false,
//(map["showStatus"] is bool ? (bool) map["showStatus"] : false),
showUserAvatars:
widget.showUserAvatars,
usePreviewData:
widget.usePreviewData
);
}
}
private Widget _imageGalleryLoadingBuilder(
BuildContext context,
ImageChunkEvent _event = null
)
{
return new Center(
child: new SizedBox(
width: 20.0f,
height: 20.0f,
child: new CircularProgressIndicator(
value: _event == null || _event.expectedTotalBytes == null
? 0
: _event.cumulativeBytesLoaded / _event.expectedTotalBytes
)
)
);
}
private void _onCloseGalleryPressed()
{
setState(() => { _isImageViewVisible = false; });
}
private void _onImagePressed(ImageMessage message)
{
setState(() =>
{
/*_imageViewIndex = _gallery.Where(
element => element.id == message.id && element.uri == message.uri
);*/
foreach (var element in _gallery)
if (element.id == message.id && element.uri == message.uri)
{
_imageViewIndex = _gallery.IndexOf(element);
break;
}
_isImageViewVisible = true;
});
}
private void _onPageChanged(int index)
{
setState(() => { _imageViewIndex = index; });
}
private void _onPreviewDataFetched(
ChatComponents.TextMessage message,
PreviewData previewData
)
{
widget.onPreviewDataFetched?.Invoke(previewData,message);
}
public override Widget build(BuildContext context)
{
var results = new List<Widget>();
results.Add(new Container(
color: Color.fromARGB(0, 0, 0, 0),
child: new SafeArea(
bottom: false,
child: new Column(
children: new List<Widget>
{
new Flexible(
child: widget.messages.isEmpty()
? (Widget) SizedBox.expand(
child: new Container(
//color: Colors.yellow,
alignment: Alignment.center,
margin: EdgeInsets.symmetric(
horizontal: 24
),
child: new Text(
widget.l10n.emptyChatPlaceholder,
style: widget.theme.emptyChatPlaceholderTextStyle,
textAlign: TextAlign.center
)
)
)
: new GestureDetector(
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
child: new ChatList(
isLastPage: widget.isLastPage,
itemBuilder: (item, index) => _buildMessage(item),
items: _chatMessages,
onEndReached: widget.onEndReached,
onEndReachedThreshold: widget.onEndReachedThreshold
)
)
),
new Input(
isAttachmentUploading: widget.isAttachmentUploading,
onAttachmentPressed: widget.onAttachmentPressed,
onSendPressed: widget.onSendPressed,
onTextChanged: widget.onTextChanged
)
}
)
)
));
// if (_isImageViewVisible)
// results.Add(_buildImageGallery());
var test = widget.l10n;
return new InheritedUser(
widget.user,
new InheritedChatTheme(
widget.theme,
new InheritedL10n(
widget.l10n,
new Stack(
children: results
)
)
)
);
}
}
}

260
AwesomeUIWidgets/Assets/Scripts/Widgets/input.cs


using System.Collections.Generic;
using ChatComponents;
using uiwidgets;
using Unity.UIWidgets.animation;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.service;
using Unity.UIWidgets.services;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using System;
namespace UIWidgetsSample
{
public class NewLineIntent : Intent
{
public NewLineIntent(LocalKey key ) : base(key)
{
}
}
public class SendMessageIntent : Intent
{
public SendMessageIntent(LocalKey key ) : base(key)
{
}
}
/// A class that represents bottom bar widget with a text field, attachment and
/// send buttons inside. Hides send button when text field is empty.
public class Input : StatefulWidget
{
/// Whether attachment is uploading. Will replace attachment button with a
/// [CircularProgressIndicator]. Since we don't have libraries for
/// managing media in dependencies we have no way of knowing if
/// something is uploading so you need to set this manually.
public readonly bool? isAttachmentUploading;
/// See [AttachmentButton.onPressed]
public readonly OnAttachmentPressed onAttachmentPressed;
/// Will be called on [SendButton] tap. Has [types.PartialText] which can
/// be transformed to [types.TextMessage] and added to the messages list.
public readonly OnSendPressed onSendPressed;
/// Will be called whenever the text inside [TextField] changes
public readonly OnTextChanged onTextChanged;
/// Creates [Input] widget
public Input(
OnSendPressed onSendPressed,
Key key = null,
bool? isAttachmentUploading = null,
OnAttachmentPressed onAttachmentPressed = null,
OnTextChanged onTextChanged = null
) : base(key)
{
this.onAttachmentPressed = onAttachmentPressed;
this.isAttachmentUploading = isAttachmentUploading;
this.onSendPressed = onSendPressed;
this.onTextChanged = onTextChanged;
}
public override State createState()
{
return new _InputState();
}
}
/// [Input] widget state
internal class _InputState : State<Input>
{
public readonly FocusNode _inputFocusNode = new FocusNode();
public readonly TextEditingController _textController = new TextEditingController();
private bool _sendButtonVisible;
public override void initState()
{
base.initState();
_textController.addListener(_handleTextControllerChange);
}
public override void dispose()
{
_inputFocusNode.dispose();
_textController.dispose();
base.dispose();
}
private void _handleSendPressed()
{
var _partialText = new PartialText(_textController.text.TrimEnd());
widget.onSendPressed(_partialText);
_textController.clear();
}
private void _handleTextControllerChange()
{
setState(() =>
{
_sendButtonVisible = _textController.text != "";
});
}
private Widget _leftWidget()
{
if (widget.isAttachmentUploading == true)
return new SizedBox(
height: 14,
width: 24,
child: new CircularProgressIndicator(
backgroundColor: Colors.transparent,
strokeWidth: 2,
valueColor: new AlwaysStoppedAnimation<Color>(
InheritedChatTheme.of(context).theme.inputTextColor
)
)
);
else
{
return new AttachmentButton(onPressed: ()=>
{
widget.onAttachmentPressed();
});
}
}
public CallbackAction sendPress(){
return new CallbackAction(
intentKey: DoNothingAction.key,
onInvoke: (FocusNode node, Intent intent) => _handleSendPressed()
);
}
public CallbackAction sendSelectionPress()
{
return new CallbackAction(
intentKey: DoNothingAction.key,
onInvoke: (FocusNode node, Intent intent) =>
{
var _newValue = $"{_textController.text}\r\n";
_textController.value = new TextEditingValue(
_newValue,
TextSelection.fromPosition(
new TextPosition(_newValue.Length)
)
);
}
);
}
public override Widget build(BuildContext context)
{
var _query = MediaQuery.of(context);
var results = new List<Widget>();
//if (widget.onAttachmentPressed != null)
// results.Add(_leftWidget());
results.Add( new SizedBox(
height: 14,
width: 24
));
var hintStyle = InheritedChatTheme.of(context)?
.theme
.inputTextStyle
.copyWith(
color: InheritedChatTheme.of(context)?
.theme
.inputTextColor
.withOpacity(0.5f)
);
var hintText = InheritedL10n.of(context)?.l10n?.inputPlaceholder;
var decoration = InputDecoration.collapsed(
hintStyle: hintStyle,
hintText: hintText
);
var style = InheritedChatTheme.of(context)
.theme
.inputTextStyle
.copyWith(
color: InheritedChatTheme.of(context)
.theme
.inputTextColor
);
var item = new Expanded(
child: new TextField(
controller: _textController,
decoration: decoration ,
focusNode: _inputFocusNode,
keyboardType: TextInputType.multiline,
maxLines: 5,
minLines: 1,
onChanged: (_str) =>
{
widget.onTextChanged(_str);
},
style: style,
textCapitalization: TextCapitalization.sentences
)
);
results.Add(item);
results.Add(new Visibility(
visible: _sendButtonVisible,
child: new SendButton(
onPressed: _handleSendPressed
)
));
var shortCutsKey = new Dictionary<LogicalKeySet, Intent>
{
{new LogicalKeySet(LogicalKeyboardKey.enter), new SendMessageIntent(DoNothingAction.key)},
{
new LogicalKeySet(LogicalKeyboardKey.enter, LogicalKeyboardKey.alt),
new NewLineIntent(DoNothingAction.key)
},
{
new LogicalKeySet(LogicalKeyboardKey.enter, LogicalKeyboardKey.shift),
new NewLineIntent(DoNothingAction.key)
}
};
var actionKeys = new Dictionary<LocalKey, ActionFactory>
{
{new ObjectKey(typeof(SendMessageIntent)), sendPress},
{new ObjectKey(typeof(NewLineIntent)), sendSelectionPress}
};
var test = _query;
return new GestureDetector(
onTap: () => _inputFocusNode.requestFocus(),
child: new Shortcuts(
shortcuts: shortCutsKey ,
child: new Actions(
actions: actionKeys,
child: new Focus(
autofocus: true,
child: new Material(
borderRadius: InheritedChatTheme.of(context).theme.inputBorderRadius,
color: InheritedChatTheme.of(context).theme.inputBackgroundColor,
child: new Container(
padding: EdgeInsets.fromLTRB(
left:_query.padding.left,
top:10,
right:_query.padding.right,
bottom:10 + _query.viewInsets.bottom + _query.padding.bottom
),
child: new Row(
children: results
)
)
)
)
)
)
);
}
}
}

78
AwesomeUIWidgets/Assets/Smartphone/StandardColorMask.shader


Shader "VertexStudio/FurnitureColorMask" {
Properties {
[NoScaleOffset]
_Mask ("Mask (RGB)", 2D) = "black" {}
[NoScaleOffset]
_MainTex ("Diffuse", 2D) = "white" {}
[NoScaleOffset]
_Spec ("Specular", 2D) = "black" {}
[NoScaleOffset]
_Normal ("Normal", 2D) = "bump" {}
[NoScaleOffset]
_OcclusionMap("Ambient Occlusion", 2D) = "white" {}
_OcclusionStrength("AO intensity", Range(0.0, 1.0)) = 1.0
[NoScaleOffset]
_Emission ("Emission", 2D) = "white" {}
_ColorR ("Color (R)", Color) = (1,1,1,1)
_ColorG ("Color (G)", Color) = (1,1,1,1)
_ColorB ("Color (B)", Color) = (1,1,1,1)
[HDR]
_EmissionColor("EmissionColor", Color) = (0,0,0)
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf StandardSpecular fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex,_Mask;
sampler2D _Normal;
sampler2D _Spec;
sampler2D _Emission;
sampler2D _OcclusionMap;
half _OcclusionStrength;
half4 _EmissionColor;
struct Input {
float2 uv_MainTex;
};
fixed4 _ColorR,_ColorG,_ColorB;
void surf (Input IN, inout SurfaceOutputStandardSpecular o) {
fixed4 mask = tex2D (_Mask, IN.uv_MainTex);
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * saturate( ( _ColorR * mask.r + _ColorG * mask.g + _ColorB * mask.b) );
half occ = tex2D(_OcclusionMap, IN.uv_MainTex).g;
o.Occlusion = LerpOneTo (occ, _OcclusionStrength);
o.Albedo = c.rgb;
o.Normal = UnpackNormal ( tex2D (_Normal, IN.uv_MainTex) );
fixed4 spec = tex2D (_Spec, IN.uv_MainTex);
o.Specular = spec.rgb;
o.Smoothness = spec.a;
o.Emission = _EmissionColor * ( tex2D (_Emission, IN.uv_MainTex) );
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}

82
AwesomeUIWidgets/Assets/Smartphone/screen.mat


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: screen
m_Shader: {fileID: 45, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords: _EMISSION
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 2800000, guid: 9d60262e41ffc3b4aa3b8e53643b334b, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.95
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 0, g: 0, b: 0, a: 1}
- _EmissionColor: {r: 1, g: 1, b: 1, a: 1}
- _SpecColor: {r: 0.50735295, g: 0.50735295, b: 0.50735295, a: 1}

102
AwesomeUIWidgets/Assets/Smartphone/smartphone.FBX


Kaydara FBX Binary ��FBXHeaderExtension\FBXHeaderVersionI�x
FBXVersionI��EncryptionTypeI�CreationTimeStamp�VersionI��YearI��MonthIDayI 'HourI?MinuteIWSecondI0t MillisecondI<�)CreatorS$FBX SDK/FBX Plugins version 2014.0.1�' SceneInfoSGlobalInfoSceneInfoSUserData TypeSUserData2VersionIdMetaData`VersionIdwTitleS�SubjectS�AuthorS�KeywordsS�RevisionS�CommentS� Properties70�hPS DocumentUrlSKStringSUrlSS:D:\Projects\Archive\i-orange\Assets\Smartphone\m-phone.FBX
kPSSrcDocumentUrlSKStringSUrlSS:D:\Projects\Archive\i-orange\Assets\Smartphone\m-phone.FBX<$PSOriginalSCompoundSS�BPSOriginal|ApplicationVendorSKStringSSSAutodesk�?PSOriginal|ApplicationNameSKStringSSS3ds Max&?PSOriginal|ApplicationVersionSKStringSSS2014�MPSOriginal|DateTime_GMTSDateTimeSSS11/05/2017 13:02:48.828�kPSOriginal|FileNameSKStringSSS:D:\Projects\Archive\i-orange\Assets\Smartphone\m-phone.FBX-%PS LastSavedSCompoundSS~CPSLastSaved|ApplicationVendorSKStringSSSAutodesk�@PSLastSaved|ApplicationNameSKStringSSS3ds Max@PSLastSaved|ApplicationVersionSKStringSSS2014vNPSLastSaved|DateTime_GMTSDateTimeSSS11/05/2017 13:02:48.828�FileIdR,�&��*�͸Ͷ%�%��� CreationTimeS2017-05-11 16:02:48:828F8CreatorS3FBX SDK/FBX Plugins version 2014.0.1 build=20130205� GlobalSettingszVersionI�� Properties70�)PSUpAxisSintSIntegerSI -PS
UpAxisSignSintSIntegerSI? ,PS FrontAxisSintSIntegerSI} 0PS FrontAxisSignSintSIntegerSI� ,PS CoordAxisSintSIntegerSI� 0PS CoordAxisSignSintSIntegerSI4
1PSOriginalUpAxisSintSIntegerSIw
5PSOriginalUpAxisSignSintSIntegerSI�
8PSUnitScaleFactorSdoubleSNumberSD�? @PSOriginalUnitScaleFactorSdoubleSNumberSD�?a HPS AmbientColorSColorRGBSColorSDDD� APS DefaultCameraSKStringSSSProducer Perspective� %PSTimeModeSenumSSI )PS TimeProtocolSenumSSIT ,PSSnapOnFrameModeSenumSSI� 3PS TimeSpanStartSKTimeSTimeSL� 2PS TimeSpanStopSKTimeSTimeSL�y]�# 8PSCustomFrameRateSdoubleSNumberSD��O &PS
TimeMarkerSCompoundSS� 4PSCurrentTimeMarkerSintSIntegerSI����� Documents� CountI�DocumentLPe�cSSScene� Properties70R&PS SourceObjectSobjectSS�3PSActiveAnimStackNameSKStringSSS� RootNodeL�
References; Definitions-VersionIdDCountI �
ObjectTypeSGlobalSettings�CountIx
ObjectTypeSAnimationStack�CountIkPropertyTemplateS FbxAnimStack^ Properties70S+PS DescriptionSKStringSSS�0PS
LocalStartSKTimeSTimeSL�/PS LocalStopSKTimeSTimeSL4PSReferenceStartSKTimeSTimeSLQ3PS ReferenceStopSKTimeSTimeSL5
ObjectTypeSAnimationLayer�CountI(PropertyTemplateS FbxAnimLayer Properties708*PSWeightSNumberSSADY@g!PSMuteSboolSSI�!PSSoloSboolSSI�!PSLockSboolSSIAPSColorSColorRGBSColorSD�������?D�������?D�������?H&PS BlendModeSenumSSI�5PSRotationAccumulationModeSenumSSI�2PSScaleAccumulationModeSenumSSI5PSBlendModeBypassS ULongLongSSL�'
ObjectTypeSModelmCountI�' PropertyTemplateSFbxNode�' Properties70�2PSQuaternionInterpolateSenumSSIHKPSRotationOffsetSVector3DSVectorSDDD�JPS RotationPivotSVector3DSVectorSDDD�JPS ScalingOffsetSVector3DSVectorSDDDOIPS ScalingPivotSVector3DSVectorSDDD�.PSTranslationActiveSboolSSI�KPSTranslationMinSVector3DSVectorSDDD=KPSTranslationMaxSVector3DSVectorSDDDw,PSTranslationMinXSboolSSI�,PSTranslationMinYSboolSSI�,PSTranslationMinZSboolSSI%,PSTranslationMaxXSboolSSI_,PSTranslationMaxYSboolSSI�,PSTranslationMaxZSboolSSI�*PS RotationOrderSenumSSI6PSRotationSpaceForLimitOnlySboolSSI^;PSRotationStiffnessXSdoubleSNumberSD�;PSRotationStiffnessYSdoubleSNumberSD�;PSRotationStiffnessZSdoubleSNumberSD.0PSAxisLenSdoubleSNumberSD$@�HPS PreRotationSVector3DSVectorSDDD�IPS PostRotationSVector3DSVectorSDDD+PSRotationActiveSboolSSIjHPS RotationMinSVector3DSVectorSDDD�HPS RotationMaxSVector3DSVectorSDDD�)PS RotationMinXSboolSSI.)PS RotationMinYSboolSSIe)PS RotationMinZSboolSSI�)PS RotationMaxXSboolSSI�)PS RotationMaxYSboolSSI
)PS RotationMaxZSboolSSI@(PS InheritTypeSenumSSIx*PS ScalingActiveSboolSSI�GPS
ScalingMinSVector3DSVectorSDDD"GPS
ScalingMaxSVector3DSVectorSD�?D�?D�?X(PS ScalingMinXSboolSSI�(PS ScalingMinYSboolSSI�(PS ScalingMinZSboolSSI�(PS ScalingMaxXSboolSSI0(PS ScalingMaxYSboolSSIf(PS ScalingMaxZSboolSSI�QPSGeometricTranslationSVector3DSVectorSDDD! NPSGeometricRotationSVector3DSVectorSDDD| MPSGeometricScalingSVector3DSVectorSD�?D�?D�?� 6PS MinDampRangeXSdoubleSNumberSD!6PS MinDampRangeYSdoubleSNumberSDH!6PS MinDampRangeZSdoubleSNumberSD�!6PS MaxDampRangeXSdoubleSNumberSD�!6PS MaxDampRangeYSdoubleSNumberSD"6PS MaxDampRangeZSdoubleSNumberSD["9PSMinDampStrengthXSdoubleSNumberSD�"9PSMinDampStrengthYSdoubleSNumberSD�"9PSMinDampStrengthZSdoubleSNumberSD0#9PSMaxDampStrengthXSdoubleSNumberSDw#9PSMaxDampStrengthYSdoubleSNumberSD�#9PSMaxDampStrengthZSdoubleSNumberSD$7PSPreferedAngleXSdoubleSNumberSDH$7PSPreferedAngleYSdoubleSNumberSD�$7PSPreferedAngleZSdoubleSNumberSD�$(PSLookAtPropertySobjectSS�$*PSUpVectorPropertySobjectSS*%!PSShowSboolSSIp%8PSNegativePercentShapeSupportSboolSSI�%8PSDefaultAttributeIndexSintSIntegerSI�����%#PSFreezeSboolSSI&#PSLODBoxSboolSSIt&NPSLcl TranslationSLcl TranslationSSADDD�&HPS Lcl RotationS Lcl RotationSSADDD'FPS Lcl ScalingS Lcl ScalingSSAD�?D�?D�?^'2PS
VisibilityS
VisibilitySSAD�?�'EPSVisibility InheritanceSVisibility InheritanceSSI*
ObjectTypeSGeometry(CountI* PropertyTemplateSFbxMesh* Properties70�(APSColorSColorRGBSColorSD�������?D�������?D�������?�(DPSBBoxMinSVector3DSVectorSDDDH)DPSBBoxMaxSVector3DSVectorSDDD�)/PSPrimary VisibilitySboolSSI�)*PS Casts ShadowsSboolSSI�),PSReceive ShadowsSboolSSI 1
ObjectTypeSMaterialY*CountI1PropertyTemplateSFbxSurfacePhong1 Properties70�*1PS ShadingModelSKStringSSSPhong+'PS
MultiLayerSboolSSIg+BPS EmissiveColorSColorSSADDD�+2PSEmissiveFactorSNumberSSAD�?�+APS AmbientColorSColorSSAD�������?D�������?D�������?5,1PS AmbientFactorSNumberSSAD�?�,APS DiffuseColorSColorSSAD�������?D�������?D�������?�,1PS DiffuseFactorSNumberSSAD�?-APSBumpSVector3DSVectorSDDDf-FPS NormalMapSVector3DSVectorSDDD�-3PS
BumpFactorSdoubleSNumberSD�?�-EPSTransparentColorSColorSSADDD>.6PSTransparencyFactorSNumberSSAD�.MPSDisplacementColorSColorRGBSColorSDDD�.;PSDisplacementFactorSdoubleSNumberSD�?C/SPSVectorDisplacementColorSColorRGBSColorSDDD�/APSVectorDisplacementFactorSdoubleSNumberSD�?�/BPS SpecularColorSColorSSAD�������?D�������?D�������?"02PSSpecularFactorSNumberSSAD�?e05PSShininessExponentSNumberSSAD4@�0DPSReflectionColorSColorSSADDD�04PSReflectionFactorSNumberSSAD�?�5
ObjectTypeSTextureZ1CountI�5PropertyTemplateSFbxFileTexture�5 Properties70�1+PSTextureTypeUseSenumSSI21PS Texture alphaSNumberSSAD�?X2/PSCurrentMappingTypeSenumSSI�2&PS WrapModeUSenumSSI�2&PS WrapModeVSenumSSI�2#PSUVSwapSboolSSI,3-PSPremultiplyAlphaSboolSSI{3APS TranslationSVectorSSADDD�3>PSRotationSVectorSSADDD4=PSScalingSVectorSSAD�?D�?D�?q4QPSTextureRotationPivotSVector3DSVectorSDDD�4PPSTextureScalingPivotSVector3DSVectorSDDD54PSCurrentTextureBlendModeSenumSSIK5,PSUVSetSKStringSSSdefault�5(PS UseMaterialSboolSSI�5&PS UseMipMapSboolSSI*6
ObjectTypeSAnimationCurve6CountI 7
ObjectTypeSAnimationCurveNodeo6CountI�6PropertyTemplateSFbxAnimCurveNode�6 Properties70�6PSdSCompoundSS ;
ObjectTypeSVideoD7CountI�: PropertyTemplateSFbxVideo�: Properties70�7*PS ImageSequenceSboolSSI86PSImageSequenceOffsetSintSIntegerSIC82PS FrameRateSdoubleSNumberSD}8,PS LastFrameSintSIntegerSI�8(PSWidthSintSIntegerSI�8)PSHeightSintSIntegerSI#9+PSPathSKStringSXRefUrlSS^9-PS
StartFrameSintSIntegerSI�9,PS StopFrameSintSIntegerSI�92PS PlaySpeedSdoubleSNumberSD:,PSOffsetSKTimeSTimeSLJ:*PS InterlaceModeSenumSSI�:(PS FreeRunningSboolSSI�:!PSLoopSboolSSI�:'PS
AccessModeSenumSSI��Objects��!GeometryL����S
GeometrySMesh�; Properties70�;APSColorSColorRGBSColorSD�?D�?D<<<<<<�?�C�Verticesd`�xuXM�UU>��G4I}��2j�3H��ޞ� N �D�q���� ́�
�� ��� ����d�vDE����e����A
�~l}{����:���~wݵ�������-�"n:75��jޜ(������l����Y��~_qbT>�x��]�f >�ݕ��/C|�䒙��s��<��+G��>Kx�ە�������O'�����K���6W�����Ç�7����j7��uۉ\W=��\�K��F�)����}�/>lە���k)�yž�Ӄ�>��$<h��� /��܌����_gR����x�O}$���ٟ�_�K}�����K�[ܱ!�Yp)�W��zÅ����JqϿ�>{��w�����a���������b����͸��������(^ݸ�ꨴ�޾7���X_����C��w~^�\�=����|n���'/><?������s�^���o%�>���׭��u��A�-��~�Z���-��t���N�z��u����5���>�6�q��Y��I�oV.�ui���s ��ې�B�-\~����s��e�>�u�ooI��7���_�>����m��� �}l����c=~!���\o�}|}}��ŮK)����e]�[��_��>����������_�ze_::,:��������|.�����Jt�^�kѱ�;+�Z2���Rt,�NǠ�����^�:�yR�Y�ד������1�����������9��S��#���9u�@'�s^�y>����: ���'p?/Z� )��ϧ`�����t~Q�=ދF�#��}���|��Q� �yy_<�{��������ş[��F�Ÿ,��E)�"�n^�2/�sм>h^$�͋N~���a?��'#O��z�p����-�A:|���:�ɯ<=�����{>�1װn��p�a.X>� �\q^7����:�y���<}��a�����+~8���֯�>��'}W����B����܇�y��D���>�}^+n�0�F�0�黂�3� �+��Ã�p�������L�[�����qy���u)��q�~a�t��������������F�'N�[�>�/����y�[?��x�Cl������ �m#�8t }��mo����?���_��*�����s�J��#�f|T�5�����{>��:�8�3���_�}wx%>u�zyA�?���� ��x뫃������D�-N_]��^���J�|��^'��y��;�}~�k��|��W���C��[��p��!����� �I�\�^��������;����{>x?E��������O��`|8�Y��� ��o}5p���A�O��!��k�_�|��>0�W}�>����}V�����F� ��ꟽ>[�x�3}� }��;@���?yR�}]�g���Ͻ���#��s_/u���W���g��[� �=\}2u��L_�u��w�a����y�n�9�g����^�=�V������������� �S�=� ���3�S����?���M��z�������l�3�����^��{�c�9���8�a�S���g<���"y��zݶ~��1�O������>G�������~]�p�oF��n�?F�-��?o���� �Z�g����[}ƺ��}���>ӿ�?p}qՁO%��7��ٹs 8�I����Ƒ� 7s���� ���{M{���R��-�o�O�x��ץ�y�����n�����Y���;�'x�g�ti�i���0����dߨ����U�o���+���qӷ q���C�g�x��g���Σ������ٟA|��zE>X8�E?���{�,��������Z�Q�>��:���F�g���� }›��F�9�����W;򺵮[ٛ�ol����l|?���[�^=/���͉�>�ͫ�O1tC�ɳ�S&>����<�'f�B�_y�'���;��Ͽx|y�S��Ͽ�0�U��G��>��������;��<#y>��tx*���x�'q�gd?������"OU PolygonVertexIndexi�H xM� ��U��� �6�elI�%-2L�,��RY�>Ѧ$�H&�()JE�7h#���K� -J*���}3����{�u�u����>�9�}��?���+V,+,,,��D��8<����Ag�xܱ#��r�4��;v6V�X��h\���Bc%��2�X>|?���5�$T��;
'㥐�]q�7�y qks�q�ܲȚ�ͱð��Ț�ױ���t��[s������Z�n�
nܜ��+�^ؘc?���(�
���[�� ��w,��;7�Oux;q����=�D�v�sds\�w�>���z��mm��n���\�~!�vܼ�p]�"�;�x� ��7F�������7A����� �����%x�7|)~���� �O�5����l��ڬ�r�g��y��g�����Y[�hl����g��7�pO�Џ�1篍�}^ ;���o�����������9�����7��¹���P
>�{.��5��(��s�'n�|��Y��2�u�+��|�1��� ;�1����7{�n��������xgx?���C� .�$'as|�G����q��Yh0<OD����C|4n���5�)�t�w/�����?��d�-���R�%����[��ѷ���-�����"��Vh!�o����7n��G_�7��<X�y�����7�'Q"��wF_��p� w����n�o�Wܜψ[ۭ�sؘ����nC����g���͂7/��ߎB��e&qk7�|�̹�y�xw�|~
%���}�ߍ��������{�p>�9�����+�3��Sa繦l��]ߘg� ;�1��ܻk ��g�w�:�qٜ{�f�.^����W�"6Ǹ}��������C�`��@�~���w��co��@���{6� ��^�ހ�=��{}�����#�k�4~w�m���i�
���'������3k���1c���Kr��s���9g,���Ț�19ĝo���� ;�M������1����ǰ_�m q{�ޕ�1nO�o�oOګƝ�؇��=�Y��O���s{~���:�a��)�b4�9�9�㚺ϣas=g�ܵͷ��Y��ڬ��qs\�{( ���?'���q)�c�3��N�ߑoQ+x1�����cɿ^��αO���{����
��{p����%�\��~#�ga���qx<z.��p���m�wi:�����ޡލ��Zþ�i���"k|�0���y����⎛g=�:ʄ����|$
?�g�a����� �(4~?�b���h�$l /�A��Z��e|����<N��^AO�Ɯo���*z v�<k��qh�x����k(��^!n���_�݃9o�>�������ϡ8�������B;n���$�m��5�76�������`繦l��]ߘg�v�c��;�����������6�>��/��]��P��;v'l�C���OEw��3PO��L��w��91�V�b�P!_k������������6�)�6?S9�������9�������Zq����97ÎODݣ|��l�1�g��1��Ͻ q{���1no�o�oo�3Ɲ������Y��>�� ��|9��t�=�/э�\��渎k�>w����=s�6��w�7k�{+��q���atN��1���yU�w��ﻲq?�S������Ŀ����\�k�}� �� ��y�=��;�66�������-D��[ �_�/E�{Ƽ�[���K�w�wy����2t������&��Y��"�<_I�ڜsl�Jd���X3�؏Ț�ױ+`c�P:���4x �]�u_
�����5��u��=ţ&������e,]D�7b��&�;��p>�� ��}�u���j�����]����z���w̟�!��.
��_���7/�?� �;�]���ݓ�����9Ƨ��Au�M�F� v�ͨ6���n���[P�q�|��mE�������m���y�໶�����Z��s5x'� Ճ���9����;S��5�[�a{*Y�5�E����Y��d���9����C�`cηf{�9!n����֢��1�׌�}n ;n�����~�{
q{ϸl�}lOz��I{ճp��g��{���bO��pnΩ@ܘ�LUسt���:Ε�q���l���s�sv=��޶ͷ6��C������������l��q{;��y_��OE~����v��' �[���< ���q�{z�-�[�-P'8OG!n��a�> �����+ ��up#�4: ���ˢC�Sb��q��[ ��-�D�����ƺ��oǖ��碎�w�ߵڰ���;?�χ�CP���;�y��Ơ��X|:ʂg�#����MC�ó����q���]�/E5`�tj [�B�:֒x�=�������Ax7� ��yc`�w͞��XX�90X���̯�&E9�ﻪ�U�
�9���� �\?��º����(*�>����'P2|o�6���c���yka��+ ��z�!n~|o���m�<��»��q�J��x�1��y�a���&�᧑��>O����x���>���f'�g���p8?���s�8�,��y1�_���Q�q����;%���M��B��q�9߿�|O&* �����3  �w��Z�u�����ٿ1t�/'�
��9�F��^�I��'��wg��ޟ����{�q�
����@[������gh���I���e�=W��F\ >
��f��~��������7�q����cQ�4�?�����r�a������<����d�/������݇��+{����n7���}���[���µ�T� �ƫ��Q�g�|����ϲuY�����>���|�9�p�t��*���8��s���k;f���,�����gb���� 5T���㞬��טg���u��]�5�_�����/7TEdgesiZ�x��{�q,��X���a^n6���b����#n3�&m�Q��[�����=��y;'uZ����9�XR�B�FŮ��>������P����jR�?R� j�� �.��O҈�iLOʓ4�-iEm ���H��$�.�Ѓ��G<}�K��@��2�$F�F1����dRO�L �L��D6S�!���`&��Ms��|��,d�)`)�X�
VR�j�XC1kYG ���F6��m���줔]��p���cNp�2>�4���_q��|���=?p���D�r�J~�ժT�&�P�:�(��OCј&�JS�Ӓ0�N;�ӑ:I��� 1t�=�I,��#�>�%�� �Y�`�c�Ib#�h�g cI&�q��F:�H�d����C.Ә�,f��<��:�,�-Q�������U��b�R�z6���l�mv��R�g{��>r���8'8�'�q�r>�s�����|��r����GnR�-n�3w�K%��7�󠴪�CԠ&A�(u�OBx�P�ќ0�Жp:Б(:C7�K/zG_����e C�Hƒ�x�H�&�A&Y��$&3��y��1��1�䳐E��嬠�U���b�R���F6�����û��>���^����0G8ƿ9�8�)>��O)�3>�,��� \�k��
W�� ~�&��/�J%��;�x0^U�J5y��$�?Q��S��4�1�4�-iEm���H���3�t!�nt�=����#���#�� ` � f�Ib$�H&�q�'� 2�b2ټB�Lc3��\�ϛ,��%,e+)dE����lb3�y���b7�!���>� G����8'8�)�8��9�9��%_q�K\�[�������
nq�_��]*��}�jT'��<L��M��G}��ӘBy��4�%��5ᴧ�$��DCWby�8����$П$2��$1��<�ƒL
�H%�t&�A&Yd3�����4^e�y�<�2�����Y�[�����"�P�6��-leﰓ�(e{��Aq�c�'9E�9C9�8�.q��ܠ��TP]GH��C0 hB�4�9-�5mhG��� ��I,�$Пg�P���h�I!�t^$�,���tf��<�d1KX�J
YC1�X���_�G)����|�Q�q�3��_�q�/��e��:7��]�S=P�<Lu��фf��5m �=�3DE4]��S�&�><M?x�D�c(�Hb�C2�H%��ȋd�I/1��d�29��*3y�9�e>o��b
X�
VS�:J��f������XTGeometryVersionI|~pLayerElementNormalI�TVersionIf�TNameS�TMappingInformationTypeSByPolygonVertexU ReferenceInformationTypeSDirect�o�Normalsd�x��}�WU��b
�c�.St�Ι̒�R�G�j��.uL�� j��B�0Bit�5e�[L�+��|M4`� I:(pt�
P�dTșA�����x?��i����{�}���g�=�y�}����T�;������a����� ���Ǒ_��?�2�����#�*��1h�G�ݪw��sO��^���.����ϸ�箉���Zr�z���$���9p�ȫ�z��/�y$��b����|9z��R����5�����#>un�W�߸H��^7���[�����jץJy�_w>������ �a^��Y��=*�'^{�Q���ۦH��� ���=:�+}��*��q��]�Ps;��ʣC0���Vq���A��%t�ߖ׼�_�W���SE�Bݱ^��?�]&���V= ?��+���������{�����琏:�k�9����v���g�B�� �J�j�CO�7��}�9�ig<"�l���/� ��Sw��v��[w�\��?:�?�W׍Ϸ�p��A�O��O����~�g�5Gʻ����Er��sA�Q�wy�k�ɷ{�� �xq��<F�E��Ӗ��3�?)�ի�獼4~a��@>�倍/�>���Π�Ƚ�|�v~��$�p;t�+���� /�>�� � �����{��O��g.�o� ��4~ 7ï�/�խ�~!��f���xI�3���C���a�W#���p҇x�n�Iѿxwf��{s�|�z����Λ��K��;ԋ�Nz/�{v��_}ܕO����>U�U�� >#�N�dk��O����%|�#�2���
����M8�����Oa<�CL�����D>�3�+�m��������A��'���
x�<ɧu�p���0���.z�~�F���ڳ��$���Ry����v���x�����rf��Ҏnl��O^sC����+�M��/����y���8Y�'��1�����n���4�'^3��I�kG�]��ϸ�7���}�z����>s�:Hzޖ��4�V���}��V=�~�z��E�[3?��{��qBz"�%^����W�}��S�w�ϻ��Vp3dH���yiz��myM��ޑ��~}���Z�N��a��Ҵ�x����EO7��\�ߝ�󈿲o��qH蟦X��-�<�7S�< ��u�Y&���3���� ��+�>�O�sF(O��� a�V�O��ehܟ� ϫ:�k�9z����~ѧ�v�������x)o��^ʛ�q?O�8.h_ ��
p��Ƶ=����^j���>D/z4�wڇޖ����?'^©^� �W/����������^a]$��ӼD���I�%��E�4��>q�e���3�$�pj�%=I>�I��G�{��A�ö=_�_�����:�~��I�i���Kv�Cr'��2���v
�M�� /� ��� ��#��Ya�1 z�yfN߰*{N_(����-�jA� ���S{�����颏�nJ�O��v���q�P}��`݇v#��myi�`�ݺoOֳ����%���2©}��ۭ�~N������9��`��C�e��?��� � �r ����� rjH�a���7�:a7���>���z�-z}b����>@w��^$��ʫt�~�v��o����|���?;�����Ψ�߁x�=���ǖ���IO����<_���2����?�����?�o֗xe��矓I��M���4�ר^i~N�6m��ǐ��ˢO��]���_��vV����x����.��S������GE�jQ�{���-槃� �����wG��|��P��I��Ǘ^���`�*S��� �,�#�=���$= o�k���,���j���-���ᜥ:0�=�O~OГ����:#����?U��y�������߳z$���������\vė}?qC���<_ѣ�a�y�zr�祈W��E=��:�O w#���~)�a�|H�T�����s��D�i����+�_��zz���~� z�>��E������E{����U���s���o%<�k���?M��Ҹ('��E���=�ώ=K�o�ODŽ0��~�p��מ_���º���Ҕ�_=0j�G�%}�^ċ���%E��g�禍ߓ�N�@�4N��_}�Y��Y���
�$�5/�3�\���~O�:�o���c}��]u���?̸��T����>M�'���<F�$����y8�+71�Ou����̫�.*��7G��M�S�Oz"���'����%^�οT���U��X̊~J����<�8̷ě��â?��s�0����?%= o�[x?�����j:����)�k�������F����{[ޢw�7���T��� Z ������C��!�ځ�#�ҺL�F8鉼�^<4�ߑu�)��
���o�`�W�{��o5� �Dԇ�~ɵ!��%�l�f��/���K���?�?�gu�ςߖ�2��H�I�-^|����5�)�U��H�{}�OY���6�O��;��j��1��@�^|� ��T#��3<w*O� /��1��W`R\�^z�T����z��2)������~E�I>�>�@�'��)��x�_Q?�3;���#�x�˹��S�f\�#�-�� �n|���ُ?m�A��1@�x�pғx�ܩ���ی?�����་��_� '��xq\��A� w��X�S��q6�/�q$�x '��xi����'�jцNiӈ+ ^�+I�N�@��+ҟ�$�%;J%��X��
����i_ݴ�I>��'���|���{��4���F���/ٹd���I��z��Ov7���Һ�㞛�2�ׄ����g����M=���������0����*�8����K�>���=����O���E�T��S} ���R?��������������x �zo�x�&�ծߪ�͛x��U�|�(_=w�8�'�q��q-�򎉿�ŧί�s��o�q9����T�]#���ε��'r�c��K~"��D՟��}�џ~(���Wvϧx^_a���/���9��p<�J��~+�;�|�� n��&��y�y��;�8��H�*����'�<�2� ����5��?�-y͔wL8���N��攘g`���IyĄS^0�Nr(ϗp����'c�y'�ӑ7�߫=b�"���/O�t�M�7�NO���
୦�}d��������?N� �K�K��x!��ۻ{�|��G�<�E�����Z< ��~t��#���k��R?ߒ�:�ԐǓ��IO���R�R>�Dƹ���Ea��<zғp�/�R��y��bO1;Ɠ������v�<Ɠ���$�I6�������a�!0Ǚ�b>��sL�W9�q��#^ �I����W�
y<U�'��눷L����1����I|ގ��"����ǯˡ_�����O���=��q�ṭ7����kS�����2ދ�ޜ�Ӿ�p�`>)F�|��Κ�7:���w�7J������H��p���8u�<zu��O���:��C�!/���8���<z=�3�ן���IO�s^c^%^�gʣb^I����x�Ezޖ׽7󴰾�p�U��?a��G�<z����y��G�r��y yI>�c�||O�L�$�ü����[En��̐G�S< ��v��c^��f+<[����J��H��|6�o��t��8DN�h�' ���x��
���Z�QI��\��Czޖ�����`�u�,Ɠ�c��X̛�l�'���������M�#��'՗ړ�;�!�ڡ-o�2���'��j�萏�O�7;��q1_��@�F�Uk�=GnðKk�;��oc^�ힿ�6�������c�}H&�{Py�Ox��)�p���<��c^?��G;����r=b|8�'����1��͘������O���d�&��nL�,� ��׮����y��}�]@�E�~�%�H�~�u=�މy���!�_�8;=�����a�����#����k���Sc}���R�*��˛R>��� ���X߷�������"|��1���U�Eʗ��xU)�� ��1'�jE�DZ�K���5�� �}2�Ҹ����G��b^�-N
�����K�����ԇ���K���'=<���I���&��/��+���О��K���z���/�y�L�=��{�3��������'��'^s{��2/���<���L�*�o��~x�^ ���'��!^�����I��u�� �G�u��#�V�S��w��&��S}��w�>Q>�=��q��K�I>����DP�C��K�މ�ڙڍ�Nϋx�<ɧ�^�~�x��P��=E8�K/��k`_�>�o���iş+��y/��m/��������󵑗����O�|^���qa'ļD����O���P#����������~�p�/峟$�����y͓�~[�����v; �����ɺ��/���1/����G#^������_.��$�������G�]��xɿIz�|�o�y����Ly��K~U,� �u�[L~4���G#^����Hy�w��E��~4���uя��η��R|K�������R��E8�I��yO�c3�ť{��7��,U ��X����9<��
�e��y>��0�K��Ư����2�ˆ���Ꚕ�}NݏF��ߛ'������H�"�c�(ѿ���G#^��?鉸�CI}�ۣͦ�l��qJ�+�Ox��h�O��h�ף�xq~������]*��d���R|8�K�γN��A�����A���ꘘ�mR��/�����#��溺����A�O�|j�����<.����y�.���t5�'��,�罔O]6�_����*��g�i�l�k���bW �W�� 0���Z��!�������b>�N�/��_��-ׯ*�e����L�)�Ry�ϴ�.v�<O52کyN��ܡ�P����K�I>ԗځ�w���Wr��y����+�_��q[�_�6��&��h�K~%;6�Aۆ_��$�-/���[ct������S}�q��mž�qԴ��^�K~�O����}� ���?�m���z]��������{�$�A7���k.���y���%��9��s/{���:�a]�_���-/=_���m�����%= ��/�?�A�g��q��=���=I����|���n`̻/~Xgb>�M�\��WG��3�By�_���|ji���%\O�y�U� ���q'���\��Y������ҹ�tn�4��^Sd�N����84�A'?l�d�_�;�-/�qdo���B����1�N�~�2߯���ڟxɮ$�����E�4��}+�K';��v��o�O8����$��$\�#���K}��N�vf���^����\�Oi�D�y�%;��!9�ӹ�R�H�� �u�x+�s�^�u�pZ���|;�S����ɟ��V��J~�|�՗pj����M�^Nzb}�yQ;�©�y/�ݨ�'=���/���9 ��>�K�Fr��p:� ^����+蜇pEy�p_�������xN�����K�w��,���y�x��L�I>�4u��ו��o[�3�w�x�S7�''^��Z��y�r�S/����ӣ�'��J��^lz/�?�pz/��-E��ah�������/z�/�I8՗x �{O�c��f����my��l�?�pғ�K��7�����x�����'�my)�]A�<��N~�ּ��K�����T_�O.!O��/��|�x)ޘ��IO���R<�?>�߂�O��my�~'{�pҟ�K���}�t��t�(��}qt���8�SJ�����x!���sH��V��}�C��?�,�[�} ���W�I��$�R|r��Uz���?J~,��_�M���ߟ"������S��ޟ��h��}���5ݯ��{��g����ě��]z�@���|z�&��~F�-����^Q���pz_���T_ғ�ּp_1�7(x�/�|%��pj����ar\_�=Pt?�E��m��F�9��vӟ�����&��$����qe��pp_�����$��K����r�7�����n����K��x���'^�o�?�>4���u!<����ī���q�R^/��b�8��=r� ���q/��y[7�9���lܓCzޖW%=T#�Sƹ�+���a����V©��+���̣�<�υ� (��x�<ȧv#�ځx��Q��}�2�����N����sj7��"�[��ꮟ�����ͼ�Ot^�y=�S�4�Ry��!N���~����x�<ɷy���S��@�Ñ��� .�����+򳓿� zR�I[�4����sj��}T<��l��6����&7�2�^n8��囸Ypמ�j�X�̸n���~��J�a1���}��f������gE�^�ך�"�/��g;T��f��F�����mqsS�ߋ>f�o���Ɨ���aw��˶ĥ"�Q�����4�����3E��q_�Mx�������ǥ�ݜC���1��܈g^���ç�O�U�'��x��Y�����������q� �;�Ͽ?W֧"��؈o�C��M�S����n�f}?����V�8�aո�����Q����Bڣ<�_wm�&��QP��|)��n�_�2^�,ߥ]��m��O.���Vޤ��7����O��Zw�ǥ}���qR��i��H�-�3��y��C��+k��M�Ixֳ�g9����շ�/�"x֧����-��{��Y�?@��"oK\͸y��}5{\�}2^&<�f�Y>���o&��?A�1�:�Y���?"<�����&�&�Y~�m�{�t�ԫ��{j��p�ʫFy��������jrJ����Fyi�����O���&oȓ�`��?����;M�_Cϻ%�>�*��<�m�ش^�}��֭�}�0�/>S�s?U ��Ih�2��bYΖ���T��1�}����sq �K�n�/O�r�'����3����^n�3!O��u=)����_JNq��k�y쭻�v����!�U�� ��_9�|E�jσ�[]��rnT*���"^&�A���$gK�R���� �ø���h��p��M�M//�r��QN�ԋoK��x ����};qpaNormalsWd�Tx��1 �Omo�@a�� 0`�� 0`�� 0`�� 0`�� 0`�� 0`����5�V�LayerElementUVI�pVersionIe�pNameS UVChannel_1qMappingInformationTypeSByPolygonVertexFqReferenceInformationTypeS IndexToDirect�{b
UVd�U
x�Xyt����,"�� �F��@�Xv3��j�����(�LH@�#�V�1aK  ��B�h$���Td��J��;z�������7�ޛ��[~B�EeIB��ٷ��*>���w��Ma�q��g�uy�������6�;`Q�X ؆��ޚ��\m����Ӽ�b&���������nC#`�;�M���g�dn���o����� ��W���خ �~�e`}zĖ�o����q>�;��Gc7E����7FXL�w,����󢯬�X���&®�����_aݪ��K��;����z�a���l� ,V< �*����؝��p>�ɑ+��:w X��{>Ml���K���]�I�����nx��������6�����]N]a��Y}]�w�/�t>
,R w���+��a���!��8��"�9
������U���|����p��V��.�C�^��2��k�YtN�:���k*NП:�����l�]�� ?2�������}�ϱ��|��M_d��/qov=��]�x�J݈/��=���3з���k�s#�"�܃x�ۧ�O�^X���r`�xޫ�S�;7���vþ�z���sa�}�����A.�����V>��4��c��A����8(�F�U�Lگh�{�:8��boK��'��y3t3ޫ7��e��K�?�v$g��oQv��+'_|X��=��sh9~���P��qe�k�ħG�|�j����9������7��n�ö~�TY�!E�_�R3���]�����/b �ﻳ�{S�~�сq}.�C<��ܴ��?�~D��Z��G'3t8�tG5��'�B��}JV#��sP����\�)�6���t|�57¾�`?�/%���ɦ���� �OSX���%�;d�G���1�&X4��x'�6K�/���l���j�w��Q>��V��� ��`����z��~I.�f���|����ǽg!���ȳ�Аu\{x�����sO�F��6���Q�w_-v'�!~���8/.�g������5�Q-����e��`�L?���!�P=�z��g7��f�`]�
�]���A�O�5�}�����\�S}Km`�q��g��kҖ�gN�K..od��8���F�̅�oώd��)�bӴ�(Nf�v�WY��r_o�E �<���C<����*�E}� &�1�5���=X".��/��?�Vb]k��X�zPo (���y���W�}\ ����E�E�u��GTB?�{��=2��[�� ��B�����ߺSY���{��ێ����p�U �7��0`ݷ;�2� �D`�赗�G���ס�><X�!6Ys�ޯ��G�o��������B`;l��k����/����8�� )����vȿIy �&NB��1g�@[�0^�*3�Egp^�j�o��P���o���/����y�*�?����Y�� �g���Ne~�}k1�tzc�5y��ͪ
�q��"��`��7`�a=��}<�7X6e��7�Lnc=ˉ���3 ��\J�y�x��6�S��`���u!w����/���_�li&����{��b-���~h[2�����[���m�U�mjr��5B~/y�c����ޟ�*�
xj�p�O�{�(�k~�/^����C~��Y���]oy�<߱}5�鼇YKC��n lZ܄|���p�6��V�r�}:�i�rX �i�S�����͡�o��2`�E2���㾟��4`��7 ��z���U@.��?Z�}����5����i��~�sf�3�����|o�;��|0kٯ�@��b�D]��0��?��R�̟?u���>��<�u�c�Oq�]�[���PJ1�ŕl�ώ��'���/ᾥ� �����^������׈EY�om�c��|u7����e�/����� �����g�g��k�w�1�K����c/������̇ݳ�}�2����_���P��6C�7%̏���3�����N�eg�M��~eօ~���� E>��<�_�S�K�'c/2I�ݱ{����Ib}���X��+��Zr_�_�l�5�����!Oz/���s�1ɔ�}��$�/�������f|EA{����~� ��h�Ut#�ꖐO�/�Փ��^�ȅ��/�����zո/ȵ��X��@� �sk'�s�X/~k �?����9��D֋y����̗�r�M[֋�����';!����$p�A>�cYg0��|�Ss5��29o��[�yjC?6a��`>U η��+r���7��L�'�\q��r�o]�C��R9�T�&ZqީցS��ϖ�~yp`>�C���a�?��+������}�1�{U�/Y�Dt�u ��/��1��g��|�ǧgG������*����˓�!����D�W�6���߽>��Õq��H�>=�_���W"�ܜ�s��>���b� �Z�'�Q�'�ff�l��O���W�?vA"�����>?r�\I%�N�����5���uC?o|[����y�u��7�+]��x���Q��J�O�r�7��澩$6�j`��R���>�r0杞D}b� `��O~�}j�o� {�٠�ɋ�����
��.ڳ�
�o �Ҿ������鏺���c�������i�����p�տv��@LF��}yۮ����-<���5����O��D�d^�S<�&m�/��_���!I�~UVIndexi�qxM� ��U�q.��
*�\p��ʠ� �$�%D8@� 6�ڤe u��4J�2�,T,4Ͳ���6������V�%4�h������k=k���}���������իW�Ч�*�#��h�m� �h�m7��1�K��/l]�'��v,Թ�a��s1��5X��b�Dn� o~h9kSW���W4�W4ƨ`#�5���R���G<�k�-C���=ž��5�W�� u}�s���_N���y�����h�Γ� �Ø�+�3� �5tn\�/�����'5��Ƈ ��bJ9�;����^�,��������YÁA ��M��������` �9��z�z�Iar0�^N�X � wT�����;��r�O�>�݀�����Y��p/ /���i�������1W��9[s����Fw������)�7�#L/f$��0G=��y�B�bn"w|p/������B����E�U���^��aV8�p���%��bN�#_Ԡ��^��܂��5���«�ז��'&ro ��S���Yñ���z�ׄ%�y=���>C/gmojh�ڗ5��N o m����o/��;��jxG�3�� �ɽ'�����(������I��<ϔCos����{S� ]ŲDnl����́W�o)73�]Rϝ��.|8p��]'o-��j�xgh������!�����])�K�^�ᓅ:wQ�T�t�o��k\R�Sm]�1���]�7l9kSW����ɛ7��u5�8��5�Ը��=���o������s���{
�sg�΃�L������DΙ�7�3�9<�=�X5�����=��9#4�����Ύsq�����#��FV���1���e�����NL S {kw�;������!��L�r�h����|Pѝȝ����r���}p��Ѱ��Q�z>Ԡ����54ם���}���pu�J1���]S�K�� _ _/��� �%ŪD����rjz8k�B�9���}1��9k_Ԡ��>|#X+셓������X �������`o�O�{��A �ݑ�'����4w|�y��>�<S��9Cs��6\Y|�ܗ+㫁���1�YƸ1p��{�O���p�'�Y�����p�e�`9k�F�1��m]�1���o*o��r֦��o�o-o�|�>��pS���c�q�
���{{9w�}Q��s=�=��΃�]� ������)����n�9�y�����z��;��{�9�Q�z8��ðba9�|2l,<��!�n)֗[��<�Z� ����1~XneEc�(p�{�1�
ܺ�[�T�i �{��B]�e���O��:g �xw��r?O�7�@r���Q�/B[�h�GB[�h�G�=<6���?�3���<����` uΞ��Q�_s�L�\���_��v>�.'r���$r��#��s��>8O�����X���o͆�}�u�7aC��n�/�p��{����y�o����s��A �y�3A �}�;^��7�}� /�ˉ\�|G�r���������=r�`��5 H��s�ܳ��pֶMrc��=ԛ�����` �����O�or�����9w���=����$��\p�� �/q���͜枤S��>s̕Cos�����<��݅~���yw�;'�ǫ�˝�xyh�\wp�ְV�� ��[wU�� �݊�;���Dne�_NM7!��_�$\���}ʍͺ� ]ahܐ��ܜpx8�X��;.��B]���ְ�x���w5��f�U���7��K�_Z���/\���s�;{}PCs��o
�(��=���U5}������r'�Ԡ��,ϴX���r��6r�s��w�#�Q�ߍ��fP��b[� r����%r��!��vaR����DN]���(��0�82��>��$.(�f���Ʃ�����X ��Y�g�3�a�D�����;�/���9����b���]š8547"�������3�ߔ���D��弧;c��f�=���ac��Y���U��1'r�������=cnT�m^�n ��^547'�e���-�:ϵ\ܻ�x@�����{������ �α<�i޸�����q���?�Eߣ15���}�%��\�7x���>�7W.����������o��Sôph1=qF13qVyN�_���˭�:����>��?��XL��y��B]�Y��y�A������ɡޜ�\�Y�L���Y��A]���)����LayerElementVisibilityI��VersionIe��NameSۄ MappingInformationTypeSByEdge � ReferenceInformationTypeSDirect��g
VisibilitybZZ��LayerElementMaterialIՈVersionIe��NameS�MappingInformationTypeS ByPolygonS�ReferenceInformationTypeS IndexToDirect��4 Materialsi<'xc`�!0�!0�!0�!0�!�����
���LayerIډVersionIdD� LayerElement�TypeSLayerElementNormal7�
TypedIndexI�� LayerElement��TypeSLayerElementMaterial��
TypedIndexI� LayerElement��TypeSLayerElementVisibility�
TypedIndexI�� LayerElement[�TypeSLayerElementUVw�
TypedIndexI��(ModelL�4�cSsmartphoneModelSMesh��VersionI�u� Properties70`�HPS PreRotationSVector3DSVectorSD�V�D�D��+PSRotationActiveSboolSSIό(PS InheritTypeSenumSSI$�GPS
ScalingMaxSVector3DSVectorSDDD��QPSGeometricTranslationSVector3DSVectorSDD@mM�?D
[P�ߍNPSGeometricRotationSVector3DSVectorSD�V�D�D%�8PSDefaultAttributeIndexSintSIntegerSI��NPSLcl TranslationSLcl TranslationSSADDD
[P>؎IPS Lcl RotationS Lcl RotationSSA+D�)�
�V@D�D,�FPS UDP3DSMAXSKStringSSUSMapChannel:1 = UVChannel_1
h�.PS MaxHandleSintSIntegerSUHI��ShadingCT��CullingS
CullingOffҔ)MaterialL�W�cSMaterial #27MaterialS�VersionIf5�
ShadingModelSphongQ�
MultiLayerIŔ Properties70��1PS ShadingModelSKStringSSSphong��2PSEmissiveFactorSNumberSSAD8�APS AmbientColorSColorSSAD`���?D`���?D`���?��APS DiffuseColorSColorSSAD`���?D`���?D`���?ڑEPSTransparentColorSColorSSAD�?D�?D�?*�BPS SpecularColorSColorSSAD����?D����?D����?j�2PSSpecularFactorSNumberSSAD��5PSShininessExponentSNumberSSAD@�EPSEmissiveSVector3DSVectorSDDDR�DPSAmbientSVector3DSVectorSD`���?D`���?D`���?��DPSDiffuseSVector3DSVectorSD`���?D`���?D`���?��EPSSpecularSVector3DSVectorSDDD7�2PS ShininessSdoubleSNumberSD@u�0PSOpacitySdoubleSNumberSD�?��5PS ReflectivitySdoubleSNumberSD��)MaterialL��cS02 - DefaultMaterialS)�VersionIfL�
ShadingModelSphongh�
MultiLayerIܙ Properties70��1PS ShadingModelSKStringSSSphong�2PSEmissiveFactorSNumberSSADO�APS AmbientColorSColorSSAD����?D����?D����?��APS DiffuseColorSColorSSAD����?D����?D����?��EPSTransparentColorSColorSSAD�?D�?D�?A�BPS SpecularColorSColorSSAD����?D����?D����?��2PSSpecularFactorSNumberSSADė5PSShininessExponentSNumberSSAD����?�EPSEmissiveSVector3DSVectorSDDDi�DPSAmbientSVector3DSVectorSD����?D����?D����?��DPSDiffuseSVector3DSVectorSD����?D����?D����?�EPSSpecularSVector3DSVectorSDDDN�2PS ShininessSdoubleSNumberSD����?��0PSOpacitySdoubleSNumberSD�?ϙ5PS ReflectivitySdoubleSNumberSD��$VideoLp�cS Map #3VideoSClip9� TypeSClipԚ Properties70ǚgPSPathSKStringSXRefUrlSS<D:\Projects\Archive\i-orange\Assets\Smartphone\m-phone_n.tga�� UseMipMapIE�AFilenameS<D:\Projects\Archive\i-orange\Assets\Smartphone\m-phone_n.tgat�RelativeFilenameS m-phone_n.tga*�"TextureL`&�:SMap #3TextureSݛTypeSTextureVideoClip��VersionI�"� TextureNameSMap #3Texture�� Properties70y�0PSUVSetSKStringSSS UVChannel_1��(PS UseMaterialSboolSSI��MediaS Map #3Video6�AFileNameS<D:\Projects\Archive\i-orange\Assets\Smartphone\m-phone_n.tgae�RelativeFilenameS m-phone_n.tga��ModelUVTranslationDDÝModelUVScalingD�?D�?��Texture_Alpha_SourceS Alpha_Black�CroppingIIII�&AnimationStackL�j >STake 001AnimStackS� Properties70��/PS LocalStopSKTimeSTimeSL�y]�#�3PS ReferenceStopSKTimeSTimeSL�y]�#k�'AnimationLayerLp�U=SBaseLayerAnimLayerS�#AnimationCurveNodeL���cSRAnimCurveNodeSr� Properties70��'PSd|XSNumberSSAD�)�
�V@0�'PSd|YSNumberSSAD�e�'PSd|ZSNumberSSADߡAnimationCurveL���=S AnimCurveSՠ DefaultD��KeyVerI��KeyTimelA� KeyValueFloatf�Bk� KeyAttrFlagsi��KeyAttrDataFloatf  ҡKeyAttrRefCounti?�AnimationCurveL�P�9S AnimCurveS5� DefaultDM�KeyVerI�v�KeyTimel�� KeyValueFloatf�ˢ KeyAttrFlagsi�KeyAttrDataFloatf  2�KeyAttrRefCounti��AnimationCurveL�U�9S AnimCurveS�� DefaultD��KeyVerI�֣KeyTimel� KeyValueFloatf+� KeyAttrFlagsie�KeyAttrDataFloatf  ��KeyAttrRefCountiߦ Connections��CSOOL�4�cL�CSOOLp�U=L�j >9�CSOOL���cLp�U=`�CSOOL����L�4�c��CSOOL�W�cL�4�c��CSOOL��cL�4�c��*CSOPL���cL�4�cS Lcl Rotation�*CSOPL`&�:L�W�cS DiffuseColorE�CSOOLp�cL`&�:t�!CSOPL���=L���cSd|X��!CSOPL�P�9L���cSd|YҦ!CSOPL�U�9L���cSd|Z��Takes
�CurrentS�� TakeSTake 001N�FileNameS Take_001.takv� LocalTimeLL�y]�#�� ReferenceTimeLL�y]�#������l�s���!��Z�j���~�� �u�)

101
AwesomeUIWidgets/Assets/Smartphone/smartphone.mat


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: smartphone
m_Shader: {fileID: 4800000, guid: 3048b63456d514c4c93dba0f700343dc, type: 3}
m_ShaderKeywords: _EMISSION _NORMALMAP _SPECGLOSSMAP
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 2800000, guid: d67fec32a0f33184dbab2ed7d58108be, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _Emission:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: 2641e463111fc41468d3192e1fd2946e, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _Mask:
m_Texture: {fileID: 2800000, guid: 3e7f145e17b0aae40b1d33f9edbcafd6, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _Normal:
m_Texture: {fileID: 2800000, guid: d67fec32a0f33184dbab2ed7d58108be, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 2800000, guid: 0ffa4db0d1986dc40aeab4ada94a1679, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _Spec:
m_Texture: {fileID: 2800000, guid: e72c489740867f849a9a02c973f5f9d2, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 2800000, guid: e72c489740867f849a9a02c973f5f9d2, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.815
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _ColorB: {r: 1, g: 1, b: 1, a: 1}
- _ColorG: {r: 0, g: 0, b: 0, a: 1}
- _ColorR: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.32352942, g: 0.32352942, b: 0.32352942, a: 1}

82
AwesomeUIWidgets/Assets/Smartphone/smartphone.prefab


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1191933010613832
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4717887507390182}
- component: {fileID: 33876693957189258}
- component: {fileID: 23136804176431804}
m_Layer: 0
m_Name: smartphone
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4717887507390182
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1191933010613832}
m_LocalRotation: {x: 0.000000021855694, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -0, y: 0, z: 1.5232358e-10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &33876693957189258
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1191933010613832}
m_Mesh: {fileID: 4300002, guid: 4e9bb637798979a4ca9e30741b7e2c77, type: 3}
--- !u!23 &23136804176431804
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1191933010613832}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 4fb885b0b011ab44b82a6408dd6842d6, type: 2}
- {fileID: 2100000, guid: d4fc12dc9beafa44e9f614b7b6ef70c7, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0

664
AwesomeUIWidgets/Assets/Smartphone/smartphone_d.jpg
文件差异内容过多而无法显示
查看文件

702
AwesomeUIWidgets/Assets/Smartphone/smartphone_mask.jpg
文件差异内容过多而无法显示
查看文件

1001
AwesomeUIWidgets/Assets/Smartphone/smartphone_screen.jpg
文件差异内容过多而无法显示
查看文件

257
AwesomeUIWidgets/Assets/Smartphone/demo.unity


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1.19
m_AmbientMode: 0
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 5
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0.4427031, g: 0.48498303, b: 0.5347195, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 11
m_GIWorkflowMode: 0
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 0.96
m_AlbedoBoost: 1.71
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 1
m_LightmapEditorSettings:
serializedVersion: 12
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_ExtractAmbientOcclusion: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 1
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 2
m_BakeBackend: 1
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVRBounces: 2
m_PVREnvironmentSampleCount: 500
m_PVREnvironmentReferencePointCount: 2048
m_PVRFilteringMode: 2
m_PVRDenoiserTypeDirect: 0
m_PVRDenoiserTypeIndirect: 0
m_PVRDenoiserTypeAO: 0
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVREnvironmentMIS: 0
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_LightProbeSampleCountMultiplier: 4
m_LightingDataAsset: {fileID: 112000002, guid: c23d858cbdd35c340af58893bed6acc4,
type: 2}
m_UseShadowmask: 1
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 2
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1001 &1001542614
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4717887507390182, guid: 42db2464346d91c47b812288879592f1, type: 3}
propertyPath: m_RootOrder
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4717887507390182, guid: 42db2464346d91c47b812288879592f1, type: 3}
propertyPath: m_LocalPosition.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 4717887507390182, guid: 42db2464346d91c47b812288879592f1, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4717887507390182, guid: 42db2464346d91c47b812288879592f1, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4717887507390182, guid: 42db2464346d91c47b812288879592f1, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4717887507390182, guid: 42db2464346d91c47b812288879592f1, type: 3}
propertyPath: m_LocalRotation.x
value: 0.000000021855694
objectReference: {fileID: 0}
- target: {fileID: 4717887507390182, guid: 42db2464346d91c47b812288879592f1, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 4717887507390182, guid: 42db2464346d91c47b812288879592f1, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 42db2464346d91c47b812288879592f1, type: 3}
--- !u!1 &1469184644
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1469184646}
- component: {fileID: 1469184645}
m_Layer: 0
m_Name: Directional light
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!108 &1469184645
Light:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1469184644}
m_Enabled: 1
serializedVersion: 10
m_Type: 1
m_Shape: 0
m_Color: {r: 1, g: 0.9667343, b: 0.9411765, a: 1}
m_Intensity: 1.3
m_Range: 10
m_SpotAngle: 30
m_InnerSpotAngle: 21.80208
m_CookieSize: 10
m_Shadows:
m_Type: 2
m_Resolution: -1
m_CustomResolution: -1
m_Strength: 1
m_Bias: 0.05
m_NormalBias: 0.4
m_NearPlane: 0.2
m_CullingMatrixOverride:
e00: 1
e01: 0
e02: 0
e03: 0
e10: 0
e11: 1
e12: 0
e13: 0
e20: 0
e21: 0
e22: 1
e23: 0
e30: 0
e31: 0
e32: 0
e33: 1
m_UseCullingMatrixOverride: 0
m_Cookie: {fileID: 0}
m_DrawHalo: 0
m_Flare: {fileID: 0}
m_RenderMode: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingLayerMask: 1
m_Lightmapping: 4
m_LightShadowCasterMode: 0
m_AreaSize: {x: 1, y: 1}
m_BounceIntensity: 1
m_ColorTemperature: 6570
m_UseColorTemperature: 0
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
m_UseBoundingSphereOverride: 0
m_ShadowRadius: 0
m_ShadowAngle: 0
--- !u!4 &1469184646
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1469184644}
m_LocalRotation: {x: -0.02812678, y: 0.46891794, z: -0.29165342, w: 0.83322453}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 13.1, y: 55, z: -31.742004}

4
AwesomeUIWidgets/Assets/StreamingAssets/assets/icon-attachment.png

之前 之后
宽度: 24  |  高度: 24  |  大小: 354 B

3
AwesomeUIWidgets/Assets/StreamingAssets/assets/icon-seen.png

之前 之后
宽度: 16  |  高度: 16  |  大小: 190 B

4
AwesomeUIWidgets/Assets/StreamingAssets/assets/icon-send.png

之前 之后
宽度: 24  |  高度: 24  |  大小: 375 B

部分文件因为文件数量过多而无法显示

正在加载...
取消
保存