fix:1、更换ui(图鉴相关)

This commit is contained in:
2026-05-18 16:46:13 +08:00
parent cc12dffbaa
commit a23840e6dc
184 changed files with 5800 additions and 1580 deletions
@@ -1,21 +1,40 @@
using SGModule.ConfigLoader;
namespace RedHotRoast {
[ConfigKey("LevelUnlock")]
public class LevelUnlock {
public int LeveType;
public string Name;
public int GoldCoins;
public int PassCoins;
}
[ConfigKey("Live")]
public class Live {
public int Progress;
public string Name;
public int GoldCoins;
public int AD;
public int CD;
public int SubscribeUnlock; // 是否需要订阅解锁(0:不需要,1:需要)
}
}
using SGModule.ConfigLoader;
namespace RedHotRoast {
[ConfigKey("LevelUnlock")]
public class LevelUnlock {
public int LeveType;
public string Name;
public int GoldCoins;
public int PassCoins;
}
[ConfigKey("LevelUnlock_A")]
public class LevelUnlock_A
{
public int LeveType;
public string Name;
public int GoldCoins;
public int PassCoins;
}
[ConfigKey("Live")]
public class Live {
public int Progress;
public string Name;
public int GoldCoins;
public int AD;
public int CD;
public int SubscribeUnlock; // 是否需要订阅解锁(0:不需要,1:需要)
}
[ConfigKey("Live_A")]
public class Live_A
{
public int Progress;
public int SubscribeUnlock; // 是否需要订阅解锁(0:不需要,1:需要)
public string Name;
public int GoldCoins;
public int AD;
public int CD;
}
}
@@ -1,40 +1,73 @@
using System.Collections.Generic;
using SGModule.ConfigLoader;
namespace RedHotRoast
{
[ConfigKey("FreeImageLibrary")]
public class FreeImageLibrary
{
public int id;
public string Name;
public int State;
}
[ConfigKey("ADImageLibrary")]
public class ADImageLibrary
{
public int id;
public string Name;
public int State;
public int GoldCoins;
}
[ConfigKey("SpecialImageLibrary")]
public class SpecialImageLibrary
{
public int id;
public string Name;
public int State;
public int GoldCoins;
}
[ConfigKey("VIPImageLibrary")]
public class VIPImageLibrary
{
public int id;
public string Name;
public int State;
public int GoldCoins;
}
using System.Collections.Generic;
using SGModule.ConfigLoader;
namespace RedHotRoast
{
[ConfigKey("FreeImageLibrary")]
public class FreeImageLibrary
{
public int id;
public string Name;
public int State;
}
[ConfigKey("ADImageLibrary")]
public class ADImageLibrary
{
public int id;
public string Name;
public int State;
public int GoldCoins;
}
[ConfigKey("SpecialImageLibrary")]
public class SpecialImageLibrary
{
public int id;
public string Name;
public int State;
public int GoldCoins;
}
[ConfigKey("VIPImageLibrary")]
public class VIPImageLibrary
{
public int id;
public string Name;
public int State;
public int GoldCoins;
}
[ConfigKey("FreeImageLibrary_A")]
public class FreeImageLibrary_A
{
public int id;
public string Name;
public int State;
}
[ConfigKey("ADImageLibrary_A")]
public class ADImageLibrary_A
{
public int id;
public string Name;
public int State;
public int GoldCoins;
}
[ConfigKey("SpecialImageLibrary_A")]
public class SpecialImageLibrary_A
{
public int id;
public string Name;
public int State;
public int GoldCoins;
}
[ConfigKey("VIPImageLibrary_A")]
public class VIPImageLibrary_A
{
public int id;
public string Name;
public int State;
public int GoldCoins;
}
}
@@ -1,20 +1,38 @@
using SGModule.ConfigLoader;
namespace RedHotRoast {
[ConfigKey("SecretAlbums")]
public class SecretAlbums {
public int id;
public int HotType;
public string Name;
public string Name2;
public float Price;
public int PayType; //解锁方式(0:支付,1:金币,2:广告)
public float DiscountPrice;
public int GoldCoins;
public int AD;
public int CD;
public float Quantity;
public int[] State;
public int SubscribeUnlock; // 是否需要订阅解锁(0:不需要,1:需要)
}
}
using SGModule.ConfigLoader;
namespace RedHotRoast {
[ConfigKey("SecretAlbums")]
public class SecretAlbums {
public int id;
public int HotType;
public string Name;
public string Name2;
public float Price;
public int PayType; //解锁方式(0:支付,1:金币,2:广告)
public float DiscountPrice;
public int GoldCoins;
public int AD;
public int CD;
public float Quantity;
public int[] State;
public int SubscribeUnlock; // 是否需要订阅解锁(0:不需要,1:需要)
}
[ConfigKey("SecretAlbums_A")]
public class SecretAlbums_A
{
public int id;
public int HotType;
public string Name;
public string Name2;
public float Price;
public int SubscribeUnlock; // 是否需要订阅解锁(0:不需要,1:需要)
public int PayType; //解锁方式(0:支付,1:金币,2:广告)
public float DiscountPrice;
public int GoldCoins;
public int AD;
public int CD;
public float Quantity;
public int[] State;
}
}
@@ -19,7 +19,7 @@ namespace FGUI.LG_Common
{
base.ConstructFromXML(xml);
anim = (GGraph)GetChildAt(1);
anim = (GGraph)GetChildAt(0);
}
}
}
@@ -9,6 +9,7 @@ namespace FGUI.LG_Unlock
public static void BindAll()
{
UIObjectFactory.SetPackageItemExtension(com_chatUnlock.URL, typeof(com_chatUnlock));
UIObjectFactory.SetPackageItemExtension(com_imgMask.URL, typeof(com_imgMask));
UIObjectFactory.SetPackageItemExtension(com_scAlbumLock.URL, typeof(com_scAlbumLock));
UIObjectFactory.SetPackageItemExtension(com_LiveUnlock.URL, typeof(com_LiveUnlock));
UIObjectFactory.SetPackageItemExtension(com_SubUnlock.URL, typeof(com_SubUnlock));
@@ -0,0 +1,25 @@
/** This is an automatically generated class by FairyGUI. Please do not modify it. **/
using FairyGUI;
using FairyGUI.Utils;
namespace FGUI.LG_Unlock
{
public partial class com_imgMask : GComponent
{
public GGraph anim;
public const string URL = "ui://876wwqikd3y01h";
public static com_imgMask CreateInstance()
{
return (com_imgMask)UIPackage.CreateObject("LG_Unlock", "com_imgMask");
}
public override void ConstructFromXML(XML xml)
{
base.ConstructFromXML(xml);
anim = (GGraph)GetChildAt(1);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9023c92b04f52a142ba0852e04f2eb2f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -8,6 +8,7 @@ namespace FGUI.LG_Unlock
public partial class com_scAlbumLock : GComponent
{
public GButton btn_close;
public GGraph anim;
public GTextField text_unlock;
public const string URL = "ui://876wwqiki5pm0";
@@ -21,7 +22,8 @@ namespace FGUI.LG_Unlock
base.ConstructFromXML(xml);
btn_close = (GButton)GetChildAt(1);
text_unlock = (GTextField)GetChildAt(2);
anim = (GGraph)GetChildAt(2);
text_unlock = (GTextField)GetChildAt(4);
}
}
}
@@ -28,12 +28,12 @@ namespace FGUI.LG_albums
type = GetControllerAt(0);
is_vip = GetControllerAt(1);
com_loader = (GComponent)GetChildAt(1);
btn_pay = (GButton)GetChildAt(12);
btn_vip = (GButton)GetChildAt(13);
btn_download = (GButton)GetChildAt(14);
btn_watch = (GButton)GetChildAt(15);
btn_download_coin = (GButton)GetChildAt(16);
com_loader = (GComponent)GetChildAt(2);
btn_pay = (GButton)GetChildAt(13);
btn_vip = (GButton)GetChildAt(14);
btn_download = (GButton)GetChildAt(15);
btn_watch = (GButton)GetChildAt(16);
btn_download_coin = (GButton)GetChildAt(17);
}
}
}
@@ -11,6 +11,8 @@ namespace FGUI.LG_live
UIObjectFactory.SetPackageItemExtension(com_live.URL, typeof(com_live));
UIObjectFactory.SetPackageItemExtension(item_live.URL, typeof(item_live));
UIObjectFactory.SetPackageItemExtension(com_liveDetail.URL, typeof(com_liveDetail));
UIObjectFactory.SetPackageItemExtension(btn_claim.URL, typeof(btn_claim));
UIObjectFactory.SetPackageItemExtension(btn_unlock_1.URL, typeof(btn_unlock_1));
}
}
}
@@ -0,0 +1,27 @@
/** This is an automatically generated class by FairyGUI. Please do not modify it. **/
using FairyGUI;
using FairyGUI.Utils;
namespace FGUI.LG_live
{
public partial class btn_claim : GButton
{
public Controller have_vip;
public GImage ad_icon;
public const string URL = "ui://ttzukgl9lk0x1d";
public static btn_claim CreateInstance()
{
return (btn_claim)UIPackage.CreateObject("LG_live", "btn_claim");
}
public override void ConstructFromXML(XML xml)
{
base.ConstructFromXML(xml);
have_vip = GetControllerAt(0);
ad_icon = (GImage)GetChildAt(1);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d080593136c6b74438e366864f073a4c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
/** This is an automatically generated class by FairyGUI. Please do not modify it. **/
using FairyGUI;
using FairyGUI.Utils;
namespace FGUI.LG_live
{
public partial class btn_unlock_1 : GButton
{
public Controller down_load;
public const string URL = "ui://ttzukgl9lk0x1i";
public static btn_unlock_1 CreateInstance()
{
return (btn_unlock_1)UIPackage.CreateObject("LG_live", "btn_unlock_1");
}
public override void ConstructFromXML(XML xml)
{
base.ConstructFromXML(xml);
down_load = GetControllerAt(0);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c6836849b9bedcb4b9f3e81def6d3a3f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -20,8 +20,8 @@ namespace FGUI.LG_live
{
base.ConstructFromXML(xml);
list_ = (GList)GetChildAt(2);
btn_close = (GButton)GetChildAt(3);
list_ = (GList)GetChildAt(1);
btn_close = (GButton)GetChildAt(2);
}
}
}
@@ -16,8 +16,8 @@ namespace FGUI.LG_live
public GComponent com_loader;
public GComponent img_cover;
public GImage img_mask;
public GButton btn_download;
public GButton btn_download_coin;
public btn_claim btn_download;
public btn_unlock_1 btn_download_coin;
public GButton btn_pay;
public GButton btn_watchad;
public GButton btn_vip_unlock;
@@ -41,8 +41,8 @@ namespace FGUI.LG_live
com_loader = (GComponent)GetChildAt(4);
img_cover = (GComponent)GetChildAt(5);
img_mask = (GImage)GetChildAt(6);
btn_download = (GButton)GetChildAt(7);
btn_download_coin = (GButton)GetChildAt(8);
btn_download = (btn_claim)GetChildAt(7);
btn_download_coin = (btn_unlock_1)GetChildAt(8);
btn_pay = (GButton)GetChildAt(11);
btn_watchad = (GButton)GetChildAt(12);
btn_vip_unlock = (GButton)GetChildAt(13);
@@ -26,6 +26,7 @@ namespace FGUI.ZM_Lobby_03
public GButton btn_head;
public GButton btn_gold;
public btn_play btn_play;
public btn_play btn_play_1;
public GButton btn_album;
public GButton btn_secret;
public GButton btn_vip;
@@ -72,22 +73,23 @@ namespace FGUI.ZM_Lobby_03
btn_head = (GButton)GetChildAt(19);
btn_gold = (GButton)GetChildAt(20);
btn_play = (btn_play)GetChildAt(21);
btn_album = (GButton)GetChildAt(22);
btn_secret = (GButton)GetChildAt(23);
btn_vip = (GButton)GetChildAt(24);
btn_live = (GButton)GetChildAt(25);
btn_wheel = (GButton)GetChildAt(26);
btn_sign = (btn_sign)GetChildAt(27);
btn_shop = (GButton)GetChildAt(28);
btn_pass = (btn_task_pass)GetChildAt(29);
btn_three_day = (GButton)GetChildAt(30);
btn_task = (GButton)GetChildAt(31);
btn_noads = (GButton)GetChildAt(32);
btn_record = (GButton)GetChildAt(33);
btn_restore = (GButton)GetChildAt(34);
btn_egg = (btn_egg)GetChildAt(35);
top_panel = (GGroup)GetChildAt(36);
btn_chat = (GButton)GetChildAt(37);
btn_play_1 = (btn_play)GetChildAt(22);
btn_album = (GButton)GetChildAt(23);
btn_secret = (GButton)GetChildAt(24);
btn_vip = (GButton)GetChildAt(25);
btn_live = (GButton)GetChildAt(26);
btn_wheel = (GButton)GetChildAt(27);
btn_sign = (btn_sign)GetChildAt(28);
btn_shop = (GButton)GetChildAt(29);
btn_pass = (btn_task_pass)GetChildAt(30);
btn_three_day = (GButton)GetChildAt(31);
btn_task = (GButton)GetChildAt(32);
btn_noads = (GButton)GetChildAt(33);
btn_record = (GButton)GetChildAt(34);
btn_restore = (GButton)GetChildAt(35);
btn_egg = (btn_egg)GetChildAt(36);
top_panel = (GGroup)GetChildAt(37);
btn_chat = (GButton)GetChildAt(38);
}
}
}
+2 -2
View File
@@ -350,8 +350,8 @@ namespace RedHotRoast
//is debug test--------
return false;
// return true; //zhushi
// return false;
return true; //zhushi
return GetLoginModel().IsMagic;
}
+202 -203
View File
@@ -1,204 +1,203 @@
namespace RedHotRoast
{
using System;
using FairyGUI;
using Spine.Unity;
using UnityEngine;
using System.Collections.Generic;
using Object = UnityEngine.Object;
public class FXManager : BaseUnityManager<FXManager>
{
private string fxPath = "Effect/sys/";
FXPool<Fx_Type> fx_ObjMonoObjPool;
private Transform goWrapperPar;
public override void Init()
{
base.Init();
GameObject obj = new GameObject("FX_Pool");
obj.transform.parent = transform;
obj.transform.localPosition = Vector3.zero;
obj.transform.localEulerAngles = Vector3.zero;
fx_ObjMonoObjPool = new FXPool<Fx_Type>(obj.transform);
fx_ObjMonoObjPool.NewObjFunc = NewObjFunc;
fx_ObjMonoObjPool.GetObjFunc = GetObjFunc;
fx_ObjMonoObjPool.RecObjFunc = RecObjFunc;
}
private void RecObjFunc(Fx_Type arg1, Object arg2)
{
var componet = arg2 as Component;
if (componet)
componet.gameObject.SetActive(false);
else
{
(arg2 as GameObject).SetActive(false);
}
}
private void GetObjFunc(Fx_Type arg1, Object arg2)
{
var componet = arg2 as Component;
if (componet)
componet.gameObject.SetActive(true);
else
{
(arg2 as GameObject).SetActive(true);
}
}
private Object NewObjFunc(Fx_Type arg)
{
if ((int)arg < 100)
{
var go = LoadKit.Instance.LoadGameObjectAndCloneSync("Effect.spine." + arg, arg.ToString());
SkeletonAnimation sk = go.GetComponent<SkeletonAnimation>();
return sk;
}
else
{
fxPath = "Effect.sys." + arg;
var go = LoadKit.Instance.LoadGameObjectAndCloneSync(fxPath, arg.ToString());
ParticleSystem particleSystem = go.GetComponent<ParticleSystem>();
if (particleSystem == null)
{
particleSystem = go.GetComponentInChildren<ParticleSystem>();
}
if (particleSystem != null)
{
foreach (var item in particleSystem.GetComponentsInChildren<ParticleSystem>())
{
var main = item.main;
main.scalingMode = ParticleSystemScalingMode.Hierarchy;
}
particleSystem.transform.localScale = Vector3.one * 100;
return particleSystem;
}
return go;
}
}
public T GetFx<T>(Fx_Type fx_Type) where T : Object
{
T obj = fx_ObjMonoObjPool.GetObject<T>(fx_Type);
SkeletonAnimation ani = obj as SkeletonAnimation;
if (ani != null)
{
ani.gameObject.layer = 0;
ani.ClearState();
ani.transform.localPosition = Vector3.zero;
ani.transform.localEulerAngles = Vector3.zero;
}
return obj;
}
public void RecFx<T>(Fx_Type fx_Type, T obj) where T : Object
{
fx_ObjMonoObjPool.RecObject(fx_Type, obj);
}
public List<GameObject> gameObjects = new List<GameObject>();
public override void Dispose()
{
base.Dispose();
fx_ObjMonoObjPool.Dispose();
}
private Queue<GoWrapper> goWrapperQueue = new Queue<GoWrapper>();
public T SetFx<T>(GGraph gp, Fx_Type fx_Type, ref Action Rec) where T : Component
{
var fx = GetFx<T>(fx_Type);
if (fx != null)
{
var goWrapper = new GoWrapper(fx.gameObject);
gp.SetNativeObject(goWrapper);
fx.transform.localPosition = Vector3.zero;
fx.transform.localScale = Vector3.one * 100;
fx.transform.localEulerAngles = Vector3.zero;
Rec += () =>
{
goWrapper.wrapTarget = null;
gp.SetNativeObject(null);
RecFx(fx_Type, fx);
};
}
return fx;
}
public GameObject SetFx(GGraph gp, Fx_Type fx_Type, ref Action Rec, bool supportStencil = false)
{
GameObject fx = GetFx<GameObject>(fx_Type);
if (fx != null)
{
var goWrapper = new GoWrapper(fx.gameObject);
gp.SetNativeObject(goWrapper);
fx.transform.localPosition = Vector3.zero;
fx.transform.localScale = Vector3.one * 100;
fx.transform.localEulerAngles = Vector3.zero;
Rec += () =>
{
goWrapper.wrapTarget = null;
gp.SetNativeObject(null);
RecFx(fx_Type, fx);
};
}
return fx;
}
}
public enum Fx_Type
{
None = -1,
gamwin,
fx_broad,
fx_login,
fx_hand_pre,
fx_wheel,
fx_disaappear_1,
fx_disaappear_2,
fx_first_reward,
fx_open_bg,
fx_open,
fx_wins,
fx_win,
fx_end_bg,
fx_btn_secret,
fx_login_btn,
fx_btn_play,
fx_btn_vip,
fx_btn_album,
fx_btn_live,
fx_egg_light,
fx_egg,
fx_play_button,
fx_sign,
fx_sign7,
fx_three_gift,
fx_add_box,
fx_pass_free,
fx_pass_premium,
fx_proplight,
fx_btnchat,
fx_chatunlock,
fx_chatunlock1,
fx_chatunlock2,
fx_free_idle = 104,
fx_ui_jinbi_click = 107,
}
namespace RedHotRoast
{
using System;
using FairyGUI;
using Spine.Unity;
using UnityEngine;
using System.Collections.Generic;
using Object = UnityEngine.Object;
public class FXManager : BaseUnityManager<FXManager>
{
private string fxPath = "Effect/sys/";
FXPool<Fx_Type> fx_ObjMonoObjPool;
private Transform goWrapperPar;
public override void Init()
{
base.Init();
GameObject obj = new GameObject("FX_Pool");
obj.transform.parent = transform;
obj.transform.localPosition = Vector3.zero;
obj.transform.localEulerAngles = Vector3.zero;
fx_ObjMonoObjPool = new FXPool<Fx_Type>(obj.transform);
fx_ObjMonoObjPool.NewObjFunc = NewObjFunc;
fx_ObjMonoObjPool.GetObjFunc = GetObjFunc;
fx_ObjMonoObjPool.RecObjFunc = RecObjFunc;
}
private void RecObjFunc(Fx_Type arg1, Object arg2)
{
var componet = arg2 as Component;
if (componet)
componet.gameObject.SetActive(false);
else
{
(arg2 as GameObject).SetActive(false);
}
}
private void GetObjFunc(Fx_Type arg1, Object arg2)
{
var componet = arg2 as Component;
if (componet)
componet.gameObject.SetActive(true);
else
{
(arg2 as GameObject).SetActive(true);
}
}
private Object NewObjFunc(Fx_Type arg)
{
if ((int)arg < 100)
{
var go = LoadKit.Instance.LoadGameObjectAndCloneSync("Effect.spine." + arg, arg.ToString());
SkeletonAnimation sk = go.GetComponent<SkeletonAnimation>();
return sk;
}
else
{
fxPath = "Effect.sys." + arg;
var go = LoadKit.Instance.LoadGameObjectAndCloneSync(fxPath, arg.ToString());
ParticleSystem particleSystem = go.GetComponent<ParticleSystem>();
if (particleSystem == null)
{
particleSystem = go.GetComponentInChildren<ParticleSystem>();
}
if (particleSystem != null)
{
foreach (var item in particleSystem.GetComponentsInChildren<ParticleSystem>())
{
var main = item.main;
main.scalingMode = ParticleSystemScalingMode.Hierarchy;
}
particleSystem.transform.localScale = Vector3.one * 100;
return particleSystem;
}
return go;
}
}
public T GetFx<T>(Fx_Type fx_Type) where T : Object
{
T obj = fx_ObjMonoObjPool.GetObject<T>(fx_Type);
SkeletonAnimation ani = obj as SkeletonAnimation;
if (ani != null)
{
ani.gameObject.layer = 0;
ani.ClearState();
ani.transform.localPosition = Vector3.zero;
ani.transform.localEulerAngles = Vector3.zero;
}
return obj;
}
public void RecFx<T>(Fx_Type fx_Type, T obj) where T : Object
{
fx_ObjMonoObjPool.RecObject(fx_Type, obj);
}
public List<GameObject> gameObjects = new List<GameObject>();
public override void Dispose()
{
base.Dispose();
fx_ObjMonoObjPool.Dispose();
}
private Queue<GoWrapper> goWrapperQueue = new Queue<GoWrapper>();
public T SetFx<T>(GGraph gp, Fx_Type fx_Type, ref Action Rec) where T : Component
{
var fx = GetFx<T>(fx_Type);
if (fx != null)
{
var goWrapper = new GoWrapper(fx.gameObject);
gp.SetNativeObject(goWrapper);
fx.transform.localPosition = Vector3.zero;
fx.transform.localScale = Vector3.one * 100;
fx.transform.localEulerAngles = Vector3.zero;
Rec += () =>
{
goWrapper.wrapTarget = null;
gp.SetNativeObject(null);
RecFx(fx_Type, fx);
};
}
return fx;
}
public GameObject SetFx(GGraph gp, Fx_Type fx_Type, ref Action Rec, bool supportStencil = false)
{
GameObject fx = GetFx<GameObject>(fx_Type);
if (fx != null)
{
var goWrapper = new GoWrapper(fx.gameObject);
gp.SetNativeObject(goWrapper);
fx.transform.localPosition = Vector3.zero;
fx.transform.localScale = Vector3.one * 100;
fx.transform.localEulerAngles = Vector3.zero;
Rec += () =>
{
goWrapper.wrapTarget = null;
gp.SetNativeObject(null);
RecFx(fx_Type, fx);
};
}
return fx;
}
}
public enum Fx_Type
{
None = -1,
gamwin,
fx_broad,
fx_login,
fx_hand_pre,
fx_wheel,
fx_disaappear_1,
fx_disaappear_2,
fx_first_reward,
fx_open_bg,
fx_open,
fx_wins,
fx_win,
fx_end_bg,
fx_btn_secret,
fx_login_btn,
fx_btn_vip,
fx_btn_album,
fx_btn_live,
fx_egg_light,
fx_egg,
fx_play_button,
fx_sign,
fx_sign7,
fx_three_gift,
fx_add_box,
fx_pass_free,
fx_secret_girl,
fx_proplight,
fx_btnchat,
fx_chatunlock,
fx_chatunlock1,
fx_chatunlock2,
fx_free_idle = 104,
fx_ui_jinbi_click = 107,
}
}