예제 #1
0
        public static string DirectionTo(object obj)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                return(Direction.Invalid.ToString());
            }

            Entity entity = UOMath.IsMobile(serial)
                ? Engine.Mobiles.GetMobile(serial)
                : Engine.Items.GetItem(serial) as Entity;

            if (entity == null)
            {
                return(Direction.Invalid.ToString());
            }

            return(UOMath.MapDirection(Engine.Player.X, Engine.Player.Y, entity.X, entity.Y).ToString());
        }
        private static bool CheckNotoriety(object obj, Notoriety notoriety)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id, true);
                return(false);
            }

            Mobile m = Engine.Mobiles.GetMobile(serial);

            if (m == null)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id, true);
                return(false);
            }

            return(m.Notoriety == notoriety);
        }
예제 #3
0
        public static int Contents(object obj)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(0);
            }

            Item container = Engine.Items.GetItem(serial);

            if (container?.Container != null)
            {
                return(container.Container.GetTotalItemCount());
            }

            UOC.SystemMessage(Strings.Invalid_container___);
            return(0);
        }
예제 #4
0
        public static bool Hidden(object obj = null)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial <= 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(false);
            }

            Mobile mobile = Engine.Mobiles.GetMobile(serial);

            if (mobile != null)
            {
                return(mobile.Status.HasFlag(MobileStatus.Hidden));
            }

            UOC.SystemMessage(Strings.Mobile_not_found___);
            return(false);
        }
예제 #5
0
        public static void TargetByResource(object toolObj, string resourceType)
        {
            int serial = AliasCommands.ResolveSerial(toolObj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return;
            }

            try
            {
                TargetResourceType resourceEnum = Utility.GetEnumValueByName <TargetResourceType>(resourceType);

                Engine.SendPacketToServer(new TargetByResource(serial, (int)resourceEnum));
            }
            catch (InvalidOperationException)
            {
            }
        }
예제 #6
0
        public static void UseObject(object obj, bool skipQueue = false)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);

                return;
            }

            if (!Options.CurrentOptions.UseObjectQueue || skipQueue)
            {
                Engine.SendPacketToServer(new UseObject(serial));
            }
            else if (Engine.UseObjectQueue.Count < Options.CurrentOptions.UseObjectQueueAmount)
            {
                Engine.UseObjectQueue.Enqueue(serial);
            }
        }
예제 #7
0
        public static bool Property(object obj, string value)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(false);
            }

            Entity entity = (Entity)Engine.Items.GetItem(serial) ?? Engine.Mobiles.GetMobile(serial);

            if (entity?.Properties != null)
            {
                return(entity.Properties.Any(pe => pe.Text.ToLower().Contains(value.ToLower())));
            }

            UOC.SystemMessage(Strings.Item_properties_null_or_not_loaded___);
            return(false);
        }
예제 #8
0
        public static bool InRange(object obj, int distance)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(false);
            }

            Entity entity = Engine.Items.GetItem(serial) ?? (Entity)Engine.Mobiles.GetMobile(serial);

            if (entity != null)
            {
                return(entity.Distance < distance);
            }

            UOC.SystemMessage(Strings.Cannot_find_item___);
            return(false);
        }
예제 #9
0
        public static void UseType(object type, int hue = -1, object container = null)
        {
            int serial = AliasCommands.ResolveSerial(type);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);

                return;
            }

            if (container == null)
            {
                container = Engine.Player?.Backpack?.Serial;
            }

            int containerSerial = AliasCommands.ResolveSerial(container);

            if (!Engine.Items.GetItem(containerSerial, out Item containerItem))
            {
                UOC.SystemMessage(Strings.Cannot_find_container___);

                return;
            }

            Item useItem = hue == -1
                ? containerItem.Container?.SelectEntity(i => i.ID == serial)
                : containerItem.Container?.SelectEntity(i => i.ID == serial && i.Hue == hue);

            if (useItem == null)
            {
                UOC.SystemMessage(Strings.Cannot_find_item___);

                return;
            }

            if (!AbilitiesManager.GetInstance().CheckHands(useItem.Serial))
            {
                Engine.SendPacketToServer(new UseObject(useItem.Serial));
            }
        }
예제 #10
0
        public static void Target(object obj, bool checkRange = false, bool useQueue = false)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                return;
            }

            if (checkRange && UOMath.IsMobile(serial))
            {
                Mobile mobile = Engine.Mobiles.GetMobile(serial);

                if (mobile != null)
                {
                    if (mobile.Distance > Options.CurrentOptions.RangeCheckLastTargetAmount)
                    {
                        UOC.SystemMessage(Strings.Target_out_of_range__try_again___);
                        UOC.ResendTargetToClient();
                        return;
                    }
                }
                else
                {
                    UOC.SystemMessage(Strings.Target_out_of_range__try_again___);
                    UOC.ResendTargetToClient();
                    return;
                }
            }

            if (useQueue && !Engine.TargetExists)
            {
                MsgCommands.HeadMsg(Strings.Target_Queued, Engine.Player?.Serial);
                Engine.LastTargetQueue.Enqueue(serial);
            }
            else
            {
                Engine.SendPacketToServer(new Target(TargetType.Object, -1, TargetFlags.None, serial, -1, -1, -1, 0,
                                                     true));
            }
        }
예제 #11
0
        public static bool Flying(object obj)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(false);
            }

            Mobile mobile = Engine.Mobiles.GetMobile(serial);

            if (mobile == null)
            {
                // TODO better message
                UOC.SystemMessage(Strings.Cannot_find_item___);
                return(false);
            }

            return(mobile.Status.HasFlag(MobileStatus.Flying));
        }
예제 #12
0
        public static void RemoveFriend(object obj = null)
        {
            int serial = obj != null
                ? AliasCommands.ResolveSerial(obj)
                : UOC.GetTargeSerialAsync(Strings.Target_friend_to_remove___).Result;

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return;
            }

            FriendEntry entry = Options.CurrentOptions.Friends.FirstOrDefault(i => i.Serial == serial);

            if (entry == null)
            {
                return;
            }

            Engine.Dispatcher?.Invoke(() => Options.CurrentOptions.Friends.Remove(entry));
        }
예제 #13
0
        public static void SetOrganizerContainers(string entryName, object sourceContainer = null,
                                                  object destinationContainer = null)
        {
            int sourceSerial      = AliasCommands.ResolveSerial(sourceContainer, false);
            int destinationSerial = AliasCommands.ResolveSerial(destinationContainer, false);

            OrganizerManager manager = OrganizerManager.GetInstance();

            OrganizerEntry entry = manager.Items.FirstOrDefault(e => e.Name.ToLower().Equals(entryName.ToLower()));

            if (entry == null)
            {
                UOC.SystemMessage(Strings.Invalid_organizer_agent_name___, true);
                return;
            }

            entry.SourceContainer      = sourceSerial;
            entry.DestinationContainer = destinationSerial;

            UOC.SystemMessage(Strings.Organizer_containers_set___, true);
        }
예제 #14
0
        public static void SetLastTarget(object obj)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial <= 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);

                return;
            }

            Entity entity = Engine.Items.GetItem(serial) ?? (Entity)Engine.Mobiles.GetMobile(serial);

            if (entity == null)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return;
            }

            TargetManager.GetInstance().SetLastTarget(entity);
        }
예제 #15
0
        public static bool FindType(int graphic, int range = -1, object findLocation = null, int hue = -1)
        {
            int owner = 0;

            if (findLocation != null)
            {
                owner = AliasCommands.ResolveSerial(findLocation);
            }

            Entity entity;

            bool Predicate(Entity i)
            {
                return(i.ID == graphic && (hue == -1 || i.Hue == hue) &&
                       (range == -1 || i.Distance < range) &&
                       !_ignoreList.Contains(i.Serial));
            }

            if (owner != 0)
            {
                entity = Engine.Items.SelectEntities(i => Predicate(i) && i.IsDescendantOf(owner))
                         ?.FirstOrDefault();
            }
            else
            {
                entity =
                    (Entity)Engine.Mobiles.SelectEntities(Predicate)?.FirstOrDefault() ??
                    Engine.Items.SelectEntities(i => Predicate(i) && i.Owner == 0)?.FirstOrDefault();
            }

            if (entity == null)
            {
                return(false);
            }

            AliasCommands.SetAlias("found", entity.Serial);
            UOC.SystemMessage(string.Format(Strings.Object___0___updated___, "found"));

            return(true);
        }
예제 #16
0
        public static bool FindWand(string wandName, object containerSource = null,
                                    int minimumCharges = -1)
        {
            try
            {
                WandTypes wandType = Utility.GetEnumValueByName <WandTypes>(wandName);

                int containerSerial = AliasCommands.ResolveSerial(containerSource);

                if (containerSource == null)
                {
                    containerSerial = -1;
                }

                Item[] matches = FindWands(wandType, containerSerial, minimumCharges).Result;

                if (matches == null)
                {
                    UOC.SystemMessage(Strings.Cannot_find_item___);
                    return(false);
                }

                AliasCommands.SetMacroAlias("found", matches.First().Serial);

                if (MacroManager.QuietMode)
                {
                    return(true);
                }

                UOC.SystemMessage(string.Format(Strings.Object___0___updated___, "found"));

                return(true);
            }
            catch (InvalidOperationException)
            {
                UOC.SystemMessage(string.Format(Strings.Invalid_skill_name___0__, wandName));
            }

            return(false);
        }
예제 #17
0
        public static int AddFriend(object obj = null)
        {
            int serial = obj != null
                ? AliasCommands.ResolveSerial(obj)
                : UOC.GetTargetSerialAsync(Strings.Target_new_friend___).Result;

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(0);
            }

            Mobile m = Engine.Mobiles.GetMobile(serial);

            if (m == null)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(0);
            }

            FriendEntry fe = new FriendEntry {
                Name = m.Name?.Trim(), Serial = m.Serial
            };

            if (!Options.CurrentOptions.Friends.Contains(fe))
            {
                Engine.Dispatcher?.Invoke(() =>
                {
                    Options.CurrentOptions.Friends.Add(fe);

                    if (Options.CurrentOptions.RehueFriends)
                    {
                        MainCommands.Resync();
                    }
                });
            }

            return(m.Serial);
        }
예제 #18
0
        public static int X(object obj = null)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(0);
            }

            Entity entity = UOMath.IsMobile(serial)
                ? Engine.Mobiles.GetMobile(serial)
                : Engine.Items.GetItem(serial) as Entity;

            if (entity != null)
            {
                return(entity.X);
            }

            UOC.SystemMessage(Strings.Entity_not_found___);
            return(0);
        }
예제 #19
0
        public static bool MoveTypeOffset(int id, object findLocation, int xOffset, int yOffset, int zOffset,
                                          int amount = -1)
        {
            if (findLocation == null ||
                ((string)findLocation).Equals("ground", StringComparison.InvariantCultureIgnoreCase))
            {
                UOC.SystemMessage(Strings.Invalid_container___);
                return(false);
            }

            int owner = AliasCommands.ResolveSerial(findLocation);

            bool Predicate(Item i)
            {
                return(i.ID == id && i.IsDescendantOf(owner));
            }

            Item entity = Engine.Items.SelectEntities(Predicate)?.FirstOrDefault();

            if (entity == null)
            {
                return(false);
            }

            PlayerMobile player = Engine.Player;

            if (player == null)
            {
                return(false);
            }

            int x = player.X + xOffset;
            int y = player.Y + yOffset;
            int z = player.Z + zOffset;

            ActionPacketQueue.EnqueueDragDropGround(entity.Serial, amount, x, y, z);

            return(true);
        }
예제 #20
0
        public static void Pathfind(object obj)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Entity_not_found___);
                return;
            }

            Entity entity = UOMath.IsMobile(serial)
                ? (Entity)Engine.Mobiles.GetMobile(serial)
                : Engine.Items.GetItem(serial);

            if (entity == null)
            {
                UOC.SystemMessage(Strings.Entity_not_found___);
                return;
            }

            Pathfind(entity.X, entity.Y, entity.Z);
        }
예제 #21
0
        public static bool WaitForContext(object obj, int entry, int timeout)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(false);
            }

            AutoResetEvent are = new AutoResetEvent(false);

            PacketFilterInfo pfi = new PacketFilterInfo(0xBF,
                                                        new[]
            {
                PacketFilterConditions.ShortAtPositionCondition(0x14, 3),
                PacketFilterConditions.IntAtPositionCondition(serial, 7)
            }, (bytes, info) =>
            {
                Engine.SendPacketToServer(new ContextMenuClick(serial, entry));
                are.Set();
            });

            Engine.AddReceiveFilter(pfi);

            Engine.SendPacketToServer(new ContextMenuRequest(serial));

            try
            {
                bool result = are.WaitOne(timeout);

                return(result);
            }
            finally
            {
                Engine.RemoveReceiveFilter(pfi);
            }
        }
예제 #22
0
        public static int CountType(int graphic, object source = null, int hue = -1)
        {
            if (source == null)
            {
                source = "backpack";
            }

            int sourceSerial = AliasCommands.ResolveSerial(source);

            Item countainerItem = Engine.Items.GetItem(sourceSerial);

            if (countainerItem?.Container == null)
            {
                UOC.SystemMessage(Strings.Invalid_container___);

                return(0);
            }

            Item[] matches =
                countainerItem.Container.SelectEntities(i => i.ID == graphic && (hue == -1 || i.Hue == hue));

            return(matches?.Sum(i => i.Count) ?? 0);
        }
예제 #23
0
        public static void TargetGround(object obj, int hue = -1, int range = -1)
        {
            int id = AliasCommands.ResolveSerial(obj);

            if (id == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return;
            }

            Entity entity = (Entity)Engine.Items.SelectEntity(i =>
                                                              i.ID == id && (hue == -1 || i.Hue == hue) &&
                                                              (range == -1 || i.Distance < range)) ?? Engine.Mobiles.SelectEntity(m =>
                                                                                                                                  m.ID == id && (hue == -1 || m.Hue == hue) && (range == -1 || m.Distance < range));

            if (entity == null)
            {
                UOC.SystemMessage(Strings.Cannot_find_item___);
                return;
            }

            Target(entity.Serial, false, Options.CurrentOptions.QueueLastTarget);
        }
예제 #24
0
        public static bool InRegion(string attribute, object obj)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(false);
            }

            Entity entity = (Entity)Engine.Items.GetItem(serial) ?? Engine.Mobiles.GetMobile(serial);

            if (entity == null)
            {
                UOC.SystemMessage(Strings.Cannot_find_item___);
                return(false);
            }

            RegionAttributes attr = Utility.GetEnumValueByName <RegionAttributes>(attribute);

            Region region = entity.GetRegion();

            return(region != null && region.Attributes.HasFlag(attr));
        }
예제 #25
0
        public static bool InFriendList(object obj)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial != 0)
            {
                bool result = Options.CurrentOptions.Friends.Any(fe => fe.Serial == serial);

                if (result)
                {
                    return(true);
                }

                if (Options.CurrentOptions.IncludePartyMembersInFriends)
                {
                    result = Engine.Player?.Party?.Contains(serial) ?? false;
                }

                return(result);
            }

            UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
            return(false);
        }
예제 #26
0
        public static void Organizer(string name, object sourceContainer = null, object destinationContainer = null)
        {
            OrganizerManager manager = OrganizerManager.GetInstance();

            OrganizerEntry entry = manager.Items.FirstOrDefault(oa => oa.Name.ToLower().Equals(name.ToLower()));

            if (entry == null)
            {
                UOC.SystemMessage(string.Format(Strings.Organizer___0___not_found___, name));
                return;
            }

            if (sourceContainer != null && destinationContainer != null)
            {
                int sourceContainerSerial     = AliasCommands.ResolveSerial(sourceContainer);
                int destinatinContainerSerial = AliasCommands.ResolveSerial(destinationContainer);

                manager.Organize(entry, sourceContainerSerial, destinatinContainerSerial).Wait();
            }
            else
            {
                manager.Organize(entry).Wait();
            }
        }
예제 #27
0
        public static void MoveItemOffset(object obj, int xOffset, int yOffset, int zOffset, int amount = -1)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);

                return;
            }

            PlayerMobile player = Engine.Player;

            if (player == null)
            {
                return;
            }

            int x = player.X + xOffset;
            int y = player.Y + yOffset;
            int z = player.Z + zOffset;

            ActionPacketQueue.EnqueueDragDropGround(serial, amount, x, y, z);
        }
예제 #28
0
        public static void TargetTileRelative(object obj, int distance, bool reverse = false, int itemID = 0)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return;
            }

            Entity entity = Engine.Mobiles.GetMobile(serial);

            if (entity == null)
            {
                if (!MacroManager.QuietMode)
                {
                    UOC.SystemMessage(Strings.Mobile_not_found___);
                }

                return;
            }

            int x = entity.X;
            int y = entity.Y;

            int offsetX = 0;
            int offsetY = 0;

            // TODO
            Direction direction = (Direction)((int)entity.Direction & ~0x80);

            switch (direction)
            {
            case Direction.North:
                offsetY = -1;
                break;

            case Direction.Northeast:
                offsetY = -1;
                offsetX = 1;
                break;

            case Direction.East:
                offsetX = 1;
                break;

            case Direction.Southeast:
                offsetX = 1;
                offsetY = 1;
                break;

            case Direction.South:
                offsetY = 1;
                break;

            case Direction.Southwest:
                offsetY = 1;
                offsetX = -1;
                break;

            case Direction.West:
                offsetX = -1;
                break;

            case Direction.Northwest:
                offsetX = -1;
                offsetY = -1;
                break;

            case Direction.Invalid:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            int totalOffsetX = offsetX * distance;
            int totalOffsetY = offsetY * distance;

            if (reverse)
            {
                totalOffsetX = -totalOffsetX;
                totalOffsetY = -totalOffsetY;
            }

            int destinationX = x + totalOffsetX;
            int destinationY = y + totalOffsetY;

            (int surfaceZ, int surfaceID) =
                MapInfo.GetMapSurface((int)Engine.Player.Map, destinationX, destinationY);

            if (itemID == 0)
            {
                itemID = surfaceID;
            }

            TargetXYZ(destinationX, destinationY, surfaceZ, itemID);
        }
예제 #29
0
        public static bool FindLayer(object layer, object obj = null)
        {
            if (obj == null)
            {
                obj = "self";
            }

            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(false);
            }

            Layer layerValue = Layer.Invalid;

            switch (layer)
            {
            case string s:
                layerValue = Utility.GetEnumValueByName <Layer>(s);
                break;

            case int i:
                layerValue = (Layer)i;
                break;

            case Layer l:
                layerValue = l;
                break;
            }

            if (layerValue == Layer.Invalid)
            {
                UOC.SystemMessage(Strings.Invalid_layer_value___);
                return(false);
            }

            if (!UOMath.IsMobile(serial))
            {
                UOC.SystemMessage(Strings.Cannot_find_item___);
                return(false);
            }

            Mobile mobile = Engine.Mobiles.GetMobile(serial);

            int layerSerial = mobile?.GetLayer(layerValue) ?? 0;

            if (layerSerial == 0)
            {
                AliasCommands.UnsetAlias("found");
                return(false);
            }

            AliasCommands.SetMacroAlias("found", layerSerial);

            if (MacroManager.QuietMode)
            {
                return(true);
            }

            UOC.SystemMessage(string.Format(Strings.Object___0___updated___, "found"));

            return(true);
        }
예제 #30
0
        public static void TargetTileRelative(object obj, int distance, bool reverse = false)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return;
            }

            Entity entity = Engine.Mobiles.GetMobile(serial);

            if (entity == null)
            {
                UOC.SystemMessage(Strings.Mobile_not_found___);
                return;
            }

            int x = entity.X;
            int y = entity.Y;

            int offsetX = 0;
            int offsetY = 0;

            // TODO
            Direction direction = (Direction)((int)entity.Direction & ~0x80);

            switch (direction)
            {
            case Direction.North:
                offsetY = -1;
                break;

            case Direction.Northeast:
                offsetY = -1;
                offsetX = 1;
                break;

            case Direction.East:
                offsetX = 1;
                break;

            case Direction.Southeast:
                offsetX = 1;
                offsetY = 1;
                break;

            case Direction.South:
                offsetY = 1;
                break;

            case Direction.Southwest:
                offsetY = 1;
                offsetX = -1;
                break;

            case Direction.West:
                offsetX = -1;
                break;

            case Direction.Northwest:
                offsetX = -1;
                offsetY = -1;
                break;

            case Direction.Invalid:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            int totalOffsetX = offsetX * distance;
            int totalOffsetY = offsetY * distance;

            if (reverse)
            {
                totalOffsetX = -totalOffsetX;
                totalOffsetY = -totalOffsetY;
            }

            int destinationX = x + totalOffsetX;
            int destinationY = y + totalOffsetY;

            Engine.SendPacketToServer(new Target(TargetType.Tile, -1, TargetFlags.None, 0, destinationX,
                                                 destinationY, entity.Z, 0, true));
        }