{"behavior":"degenerate_repetition","label_filter":null,"limit":10,"next_offset":42688,"offset":42678,"previous_offset":null,"rows":[{"assistant_initiates":false,"asst_text":"Eu sou baseado na arquitetura GPT-4, mas n\u00e3o tenho uma designa\u00e7\u00e3o espec\u00edfica como \"GPT-4o Mini\". Estou aqui para ajudar com informa\u00e7\u00f5es e responder a perguntas da melhor forma poss\u00edvel! Se voc\u00ea tiver alguma d\u00favida ou precisar de assist\u00eancia, fique \u00e0 vontade para perguntar.","behavior":"degenerate_repetition","conversation_hash":"43ddf884d923493a0feeae84538d228f","conversation_redacted":false,"conversation_toxic":false,"country":"Brazil","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Portuguese","model":"gpt-4o-mini-2024-07-18","n_chars":302,"n_turns_in_conversation":5,"n_words":48,"source_row_offset":42678,"source_shard":"turns-00053.parquet","timestamp":"Sat, 23 Nov 2024 17:16:21 GMT","turn_id":"2f9f8df0b4ed55f8ae2f21d7","turn_index":0,"user_text":"qual sua vers\u00e3o? GPT-4o Mini"},{"assistant_initiates":false,"asst_text":"Atualmente, a OpenAI lan\u00e7ou v\u00e1rias vers\u00f5es de modelos de linguagem, incluindo:\n\n1. **GPT-1**: O primeiro modelo da s\u00e9rie, que estabeleceu as bases para os modelos futuros.\n2. **GPT-2**: Uma vers\u00e3o maior e mais potente que chamou aten\u00e7\u00e3o por sua capacidade de gerar texto coerente e relevante.\n3. **GPT-3**: Um modelo muito maior que o anterior, com 175 bilh\u00f5es de par\u00e2metros, e amplamente utilizado em diversas aplica\u00e7\u00f5es.\n4. **GPT-3.5**: Uma vers\u00e3o intermedi\u00e1ria que trouxe melhorias na compreens\u00e3o e na gera\u00e7\u00e3o de texto.\n5. **GPT-4**: Uma vers\u00e3o ainda mais avan\u00e7ada, com aprimoramentos significativos em termos de compreens\u00e3o, coer\u00eancia e gera\u00e7\u00e3o de texto.\n\nEu sou baseado na arquitetura GPT-4. Se voc\u00ea tiver mais perguntas sobre os modelos ou suas capacidades, estou aqui para ajudar!","behavior":"degenerate_repetition","conversation_hash":"43ddf884d923493a0feeae84538d228f","conversation_redacted":false,"conversation_toxic":false,"country":"Brazil","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Portuguese","model":"gpt-4o-mini-2024-07-18","n_chars":822,"n_turns_in_conversation":5,"n_words":129,"source_row_offset":42679,"source_shard":"turns-00053.parquet","timestamp":"Sat, 23 Nov 2024 17:16:21 GMT","turn_id":"d4a1f953d3a3f85330ecbc5a","turn_index":1,"user_text":"quais s\u00e3o os models? e qual o seu?"},{"assistant_initiates":false,"asst_text":"It seems you've shared a substantial piece of code that represents a Rust plugin called \"Dungeons.\" This plugin appears to create and manage procedural dungeons within the game Rust, offering features like spawning dungeons, handling NPCs, turrets, loot boxes, and integrating with game events. \n\nIf you have specific questions about the code or need assistance with particular aspects\u2014such as understanding how certain functions work, troubleshooting issues, or extending functionality\u2014please let me know! I'd be happy to help you!","behavior":"degenerate_repetition","conversation_hash":"43ddf884d923493a0feeae84538d228f","conversation_redacted":false,"conversation_toxic":false,"country":"Brazil","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Portuguese","model":"gpt-4o-mini-2024-07-18","n_chars":53525,"n_turns_in_conversation":5,"n_words":3595,"source_row_offset":42680,"source_shard":"turns-00053.parquet","timestamp":"Sat, 23 Nov 2024 17:16:21 GMT","turn_id":"00bd07e28b0cf0582a3ba39d","turn_index":2,"user_text":"using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Facepunch;\nusing Newtonsoft.Json;\nusing Oxide.Core;\nusing Oxide.Core.Configuration;\nusing Rust;\nusing UnityEngine;\nusing Random = UnityEngine.Random;\n\nnamespace Oxide.Plugins\n{\n    [Info(\"Dungeons\", \"Marte6\", \"1.0.0\")]\n    public class Dungeons : RustPlugin\n    {\n        private ConfigData _configData;\n        private DynamicConfigFile _dataFile;\n        private DungeonData _dungeonData;\n        private Timer _autoSpawnTimer;\n        private Timer _dungeonCheckTimer;\n        private Timer _updateMarkersTimer;\n        private Dictionary<DungeonTierConfig, string> _tierNameMap;\n        private const ulong OwnerID = 1020304050;\n\n        #region Hooks\n\n        private void OnServerInitialized()\n        {\n            InitializeTierNameMap();\n            LoadData();\n            RemoveAllDungeons();\n            StartTimerAutoSpawnDungeons();\n            StartTimerRemoveInactiveDungeons();\n            StartTimerUpdateMarkers();\n            SaveData();\n        }\n\n        private void OnServerSave() => SaveData();\n\n        private void Unload()\n        {\n            RemoveAllDungeons();\n            _autoSpawnTimer?.Destroy();\n            _dungeonCheckTimer?.Destroy();\n            _updateMarkersTimer?.Destroy();\n            SaveData();\n        }\n\n        object OnTurretTarget(AutoTurret turret, BaseCombatEntity target)\n        {\n            if (IsDungeonEntity(target))\n            {\n                return false;\n            }\n\n            return null;\n        }\n\n        object OnEntityTakeDamage(ScientistNPC scientistNPC, HitInfo info)\n        {\n            if (scientistNPC == null || info == null || info.Initiator == null)\n                return null;\n\n            AutoTurret autoTurret = info.Initiator as AutoTurret;\n            if (autoTurret == null)\n                return null;\n            if (IsDungeonEntity(autoTurret))\n                return true;\n\n            return null;\n        }\n\n        object CanEntityTakeDamage(AutoTurret autoTurret, HitInfo hitinfo)\n        {\n            if (autoTurret == null || hitinfo == null)\n                return null;\n\n            if (IsDungeonEntity(autoTurret))\n            {\n                if (hitinfo.InitiatorPlayer == null || !IsPlayer(hitinfo.Initiator as BasePlayer))\n                    return false;\n                else\n                    return true;\n            }\n\n            return null;\n        }\n\n        object CanEntityTakeDamage(StorageContainer storageContainer, HitInfo hitinfo)\n        {\n            if (storageContainer == null || hitinfo == null)\n                return null;\n\n            if (IsDungeonEntity(storageContainer))\n            {\n                if (hitinfo.InitiatorPlayer == null || !IsPlayer(hitinfo.Initiator as BasePlayer))\n                    return false;\n                else\n                    return true;\n            }\n\n            return null;\n        }\n\n        #endregion\n\n        #region Chat Commands\n\n        [ChatCommand(\"dun\")]\n        private void CreateDungeonCommand(BasePlayer player, string command, string[] args)\n        {\n            if (!IsAdmin(player))\n                return;\n\n            AutoSpawnDungeon(player);\n        }\n\n        [ChatCommand(\"RemoveInactiveDungeons\")]\n        private void RemoveInactiveDungeonsCommand(BasePlayer player, string command, string[] args)\n        {\n            if (!IsAdmin(player))\n                return;\n\n            var removedDungeons = RemoveInactiveDungeons();\n            NotifyPlayerOnRemoval(player, removedDungeons);\n        }\n\n        [ChatCommand(\"RemoveAllDungeons\")]\n        private void RemoveAllDungeonsCommand(BasePlayer player, string command, string[] args)\n        {\n            if (!IsAdmin(player))\n                return;\n\n            var removedDungeons = RemoveAllDungeons();\n            NotifyPlayerOnRemoval(player, removedDungeons);\n        }\n\n        [ChatCommand(\"ForceRemoveAllDungeons\")]\n        private void ForceRemoveAllDungeonsCommand(BasePlayer player, string command, string[] args)\n        {\n            if (!IsAdmin(player))\n                return;\n\n            CleanupExistingEntities();\n            player.ChatMessage(\"All entities related to this plugin have been cleaned up.\");\n        }\n\n        #endregion\n\n        #region Dungeon Management\n\n        private void StartTimerAutoSpawnDungeons()\n        {\n            if (_configData.DungeonSpawn.EnableAutoSpawn)\n            {\n                _autoSpawnTimer = timer.Every(\n                    _configData.DungeonSpawn.AutoSpawnCycleInterval,\n                    () =>\n                    {\n                        AutoSpawnDungeon();\n                    }\n                );\n            }\n        }\n\n        private void StartTimerRemoveInactiveDungeons()\n        {\n            _dungeonCheckTimer = timer.Every(\n                60f,\n                () =>\n                {\n                    var removedDungeons = RemoveInactiveDungeons();\n                    if (removedDungeons.Count > 0)\n                    {\n                        foreach (var dungeon in removedDungeons)\n                        {\n                            LogDebug($\"Removed inactive dungeon of tier {dungeon.TierName} at grid {dungeon.Grid}.\");\n                        }\n                    }\n                }\n            );\n        }\n\n        private void StartTimerUpdateMarkers()\n        {\n            _updateMarkersTimer = timer.Every(30f, UpdateMarkers);\n        }\n\n        private void UpdateMarkers()\n        {\n            var mapMarkers = UnityEngine.Object.FindObjectsOfType<MapMarkerGenericRadius>();\n            foreach (var marker in mapMarkers.Where(marker => marker.IsValid()))\n            {\n                marker.SendUpdate();\n            }\n        }\n\n        private void AutoSpawnDungeon(BasePlayer player = null)\n        {\n            if (_dungeonData.ActiveDungeons.Count >= _configData.DungeonSpawn.MaxTotalActiveDungeons)\n            {\n                LogDebug(lang.GetMessage(\"MaxActiveDungeonsReached\", this));\n                player?.ChatMessage(Msg(player.UserIDString, \"MaxActiveDungeonsReached\"));\n            }\n            else if (TryFindDungeonSpawnPoint(out var position, out var rotation))\n            {\n                LogDebug(lang.GetMessage(\"AttemptSpawnDungeons\", this));\n                player?.ChatMessage(Msg(player.UserIDString, \"AttemptSpawnDungeons\"));\n                CreateDungeon(position, rotation, player);\n            }\n            else\n            {\n                LogDebug(lang.GetMessage(\"DungeonSpawnFailed\", this));\n                player?.ChatMessage(Msg(player.UserIDString, \"DungeonSpawnFailed\"));\n            }\n        }\n\n        private void CreateDungeon(Vector3 position, Quaternion rotation, BasePlayer player = null)\n        {\n            string prefabPath = GetRandomDungeonPrefab();\n            if (!ValidatePrefabPath(prefabPath))\n                return;\n\n            if (!(GameManager.server.CreateEntity(prefabPath, position, rotation) is BasePortal dungeonPortal))\n            {\n                LogDebug(\"Failed to create dungeon portal.\");\n                return;\n            }\n\n            var grid = PhoneController.PositionToGridCoord(position);\n\n            InitializeDungeonPortal(dungeonPortal, position, grid);\n\n            var proceduralDungeon = GetProceduralDungeon(dungeonPortal);\n            if (!ValidateProceduralDungeon(proceduralDungeon, dungeonPortal, grid))\n                return;\n\n            var selectedTier = GetDungeonTier(proceduralDungeon.spawnedCells.Count);\n            LogDebug($\"Selected dungeon tier: {selectedTier} at grid: {grid}.\");\n\n            var activeDungeon = RegisterActiveDungeon(dungeonPortal, proceduralDungeon, position, grid, selectedTier);\n\n            LogDebug($\"Creating dungeon with ID: {activeDungeon.PortalId} at grid {grid}.\");\n\n            ServerMgr.Instance.StartCoroutine(PopulateDungeonCoroutine(proceduralDungeon, activeDungeon, player));\n        }\n\n        private bool ValidatePrefabPath(string prefabPath)\n        {\n            if (!string.IsNullOrEmpty(prefabPath))\n                return true;\n\n            LogDebug(\"No prefab path available for dungeon spawning.\");\n            return false;\n        }\n\n        private void InitializeDungeonPortal(BasePortal dungeonPortal, Vector3 position, string grid)\n        {\n            dungeonPortal.OwnerID = OwnerID;\n            dungeonPortal.Spawn();\n            LogDebug($\"Trying to spawn Dungeon at grid: {grid}.\");\n        }\n\n        private bool ValidateProceduralDungeon(ProceduralDynamicDungeon proceduralDungeon, BasePortal dungeonPortal, string grid)\n        {\n            if (proceduralDungeon == null)\n            {\n                LogDebug($\"ProceduralDynamicDungeon not found, destroying the Dungeon at grid: {grid}.\");\n                dungeonPortal.Kill(BaseNetworkable.DestroyMode.None);\n                return false;\n            }\n\n            if (proceduralDungeon.spawnedCells.Count < 1)\n            {\n                LogDebug($\"No cells found, destroying the Dungeon at grid: {grid}.\");\n                dungeonPortal.Kill(BaseNetworkable.DestroyMode.None);\n                return false;\n            }\n\n            return true;\n        }\n\n        private ActiveDungeon RegisterActiveDungeon(BasePortal dungeonPortal, ProceduralDynamicDungeon proceduralDungeon, Vector3 position, string grid, DungeonTierConfig selectedTier)\n        {\n            var activeDungeon = new ActiveDungeon\n            {\n                PortalId = dungeonPortal.net.ID.Value,\n                DynamicDungeonId = proceduralDungeon.net.ID.Value,\n                Position = position,\n                Grid = grid,\n                TierName = _tierNameMap[selectedTier],\n                TierConfig = selectedTier,\n                EntityIds = new List<ulong>(),\n                Spawned = false,\n            };\n\n            _dungeonData.ActiveDungeons.Add(activeDungeon);\n\n            return activeDungeon;\n        }\n\n        private void LogDebug(string message)\n        {\n            if (_configData.EnableDebug)\n                Puts(message);\n        }\n\n        private IEnumerator PopulateDungeonCoroutine(ProceduralDynamicDungeon proceduralDungeon, ActiveDungeon activeDungeon, BasePlayer player = null)\n        {\n            yield return new WaitForSeconds(3f);\n\n            LogDebug($\"Starting to populate dungeon ID: {activeDungeon.PortalId}, Tier: {activeDungeon.TierName} at grid: {activeDungeon.Grid}.\");\n\n            RemoveOriginalEntities(proceduralDungeon);\n\n            var allSpawnEntries = GenerateSpawnEntries(activeDungeon.TierConfig);\n\n            LogDebug($\"Generated {allSpawnEntries.Count} spawn entries.\");\n\n            Dictionary<Vector3, List<string>> occupiedPositions = new Dictionary<Vector3, List<string>>();\n\n            bool validSpawnLocationsExist = true;\n\n            foreach (var entry in allSpawnEntries)\n            {\n                var validLocations = GetAvailableSpawnLocations(proceduralDungeon, entry.prefab.resourcePath);\n                if (validLocations.Count == 0)\n                {\n                    LogDebug($\"No valid spawn locations found for prefab: {entry.prefab.resourcePath}\");\n                    validSpawnLocationsExist = false;\n                    break;\n                }\n            }\n\n            if (!validSpawnLocationsExist)\n            {\n                player?.ChatMessage(\"No valid spawn locations available for some or all prefabs. Cancelling spawn.\");\n                LogDebug(\"No valid spawn locations available for some or all prefabs. Cancelling spawn.\");\n                yield break;\n            }\n\n            foreach (var entry in allSpawnEntries)\n            {\n                var validLocations = GetAvailableSpawnLocations(proceduralDungeon, entry.prefab.resourcePath);\n                string entityType =\n                    entry.prefab.resourcePath.Contains(\"autoturret\") ? \"AutoTurret\"\n                    : entry.prefab.resourcePath.Contains(\"woodenbox\") ? \"StorageContainer\"\n                    : entry.prefab.resourcePath.Contains(\"scientist\") ? \"NPC\"\n                    : \"Other\";\n\n                bool placed = false;\n\n                var freeLocations = validLocations.Where(loc => !occupiedPositions.ContainsKey(loc.Item1)).ToList();\n                var locationsToTry = freeLocations.Any() ? freeLocations : validLocations;\n\n                foreach (var (position, rotation) in locationsToTry)\n                {\n                    if (occupiedPositions.TryGetValue(position, out var existingTypes))\n                    {\n                        if (existingTypes.Contains(entityType))\n                        {\n                            LogDebug($\"Conflict: Cannot place another {entityType} at {position}. Trying another position...\");\n                            continue;\n                        }\n\n                        if ((entityType == \"AutoTurret\" && existingTypes.Contains(\"StorageContainer\")) || (entityType == \"StorageContainer\" && existingTypes.Contains(\"AutoTurret\")))\n                        {\n                            LogDebug($\"Conflict: Cannot place {entityType} at {position} because {string.Join(\", \", existingTypes)} already present. Trying another position...\");\n                            continue;\n                        }\n                    }\n\n                    var entity = GameManager.server.CreateEntity(entry.prefab.resourcePath, position, rotation);\n                    if (entity != null)\n                    {\n                        entity.OwnerID = OwnerID;\n                        entity.Spawn();\n                        InitializeEntity(entity, activeDungeon);\n\n                        if (!occupiedPositions.ContainsKey(position))\n                        {\n                            occupiedPositions[position] = new List<string>();\n                        }\n                        occupiedPositions[position].Add(entityType);\n\n                        yield return new WaitForSeconds(0.5f);\n\n                        if (entity.IsDestroyed || !entity.isSpawned)\n                        {\n                            LogDebug($\"Entity {entry.prefab.resourcePath} was destroyed after spawn at {position}.\");\n                        }\n                        else\n                        {\n                            LogDebug($\"Placed entity {entity.ShortPrefabName} at {position}.\");\n                        }\n\n                        placed = true;\n                        break;\n                    }\n                }\n\n                if (!placed)\n                {\n                    var (fallbackPosition, fallbackRotation) = validLocations[Random.Range(0, validLocations.Count)];\n                    LogDebug($\"Fallback: Placing {entityType} at {fallbackPosition} despite conflicts.\");\n\n                    var entity = GameManager.server.CreateEntity(entry.prefab.resourcePath, fallbackPosition, fallbackRotation);\n                    if (entity != null)\n                    {\n                        entity.OwnerID = OwnerID;\n                        entity.Spawn();\n                        InitializeEntity(entity, activeDungeon);\n\n                        if (!occupiedPositions.ContainsKey(fallbackPosition))\n                        {\n                            occupiedPositions[fallbackPosition] = new List<string>();\n                        }\n                        occupiedPositions[fallbackPosition].Add(entityType);\n\n                        yield return new WaitForSeconds(0.5f);\n\n                        if (entity.IsDestroyed || !entity.isSpawned)\n                        {\n                            LogDebug($\"Entity {entry.prefab.resourcePath} was destroyed after spawn at {fallbackPosition}.\");\n                        }\n                        else\n                        {\n                            LogDebug($\"Placed entity {entity.ShortPrefabName} at {fallbackPosition} as a fallback.\");\n                        }\n                    }\n                }\n            }\n\n            LogDebug($\"Finished placing entities. Total placed: {activeDungeon.EntityIds.Count}/{allSpawnEntries.Count}.\");\n\n            CreateDungeonMarkers(activeDungeon);\n            NotifyPlayersOfNewDungeon(activeDungeon);\n\n            LogDebug($\"Dungeon spawned successfully at grid: {activeDungeon.Grid}.\");\n\n            activeDungeon.Spawned = true;\n\n            player?.ChatMessage(Msg(player.UserIDString, \"DungeonSpawnedSuccess\", activeDungeon.Grid));\n        }\n\n        private List<(Vector3 Position, Quaternion Rotation)> GetAvailableSpawnLocations(ProceduralDynamicDungeon proceduralDungeon, string prefabPath)\n        {\n            GameObject prefab = GameManager.server.FindPrefab(prefabPath);\n            if (prefab == null)\n            {\n                Puts($\"Prefab not found: {prefabPath}\");\n                return new List<(Vector3, Quaternion)>();\n            }\n\n            BaseEntity prefabEntity = prefab.GetComponent<BaseEntity>();\n            if (prefabEntity == null)\n            {\n                Puts($\"Prefab does not have a BaseEntity: {prefabPath}\");\n                return new List<(Vector3, Quaternion)>();\n            }\n\n            return proceduralDungeon\n                .spawnedCells.Where(cell => cell != null)\n                .SelectMany(cell => cell.spawnGroups)\n                .Where(group => group != null)\n                .SelectMany(group => group.spawnPoints)\n                .Where(spawnPoint => spawnPoint != null && spawnPoint.IsAvailableTo(prefab))\n                .Select(spawnPoint =>\n                {\n                    spawnPoint.GetLocation(out var position, out var rotation);\n                    return (position, rotation);\n                })\n                .ToList();\n        }\n\n        private void InitializeEntity(BaseEntity entity, ActiveDungeon activeDungeon)\n        {\n            if (entity != null)\n            {\n                activeDungeon.EntityIds.Add(entity.net.ID.Value);\n\n                if (entity is NPCPlayer)\n                {\n                    activeDungeon.NpcIds.Add(entity.net.ID.Value);\n                }\n                else if (entity is AutoTurret turret)\n                {\n                    ConfigureTurret(turret, activeDungeon.TierConfig.AutoTurretConfig);\n                }\n                else if (entity is StorageContainer storage)\n                {\n                    ConfigureStorage(storage);\n                }\n            }\n        }\n\n        private void RemoveOriginalEntities(ProceduralDynamicDungeon proceduralDungeon)\n        {\n            foreach (var cell in proceduralDungeon.spawnedCells)\n            {\n                foreach (var group in cell.spawnGroups)\n                {\n                    for (int i = group.spawnInstances.Count - 1; i >= 0; i--)\n                    {\n                        SpawnPointInstance spawnPointInstance = group.spawnInstances[i];\n                        BaseEntity entity = spawnPointInstance?.gameObject?.ToBaseEntity();\n\n                        if (entity != null && !IsDungeonEntity(entity) && (entity is NPCDwelling || entity is ScarecrowNPC || entity is LootContainer))\n                        {\n                            LogDebug($\"Removing original entity: {entity.ShortPrefabName} at {entity.transform.position}\");\n\n                            entity.Kill();\n                        }\n                    }\n                }\n            }\n        }\n\n        private List<SpawnGroup.SpawnEntry> GenerateSpawnEntries(DungeonTierConfig tierConfig)\n        {\n            var allSpawnEntries = new List<SpawnGroup.SpawnEntry>();\n            AddNpcEntries(tierConfig, allSpawnEntries);\n            AddTurretEntries(tierConfig, allSpawnEntries);\n            AddLootEntries(tierConfig, allSpawnEntries);\n            return allSpawnEntries.OrderBy(_ => Random.value).ToList();\n        }\n\n        private void AddNpcEntries(DungeonTierConfig tierConfig, List<SpawnGroup.SpawnEntry> spawnEntries)\n        {\n            foreach (var config in tierConfig.NpcSpawnConfigs)\n            {\n                if (GameManifest.pathToGuid.TryGetValue(config.PrefabName, out var guid))\n                {\n                    spawnEntries.AddRange(\n                        Enumerable.Repeat(\n                            new SpawnGroup.SpawnEntry\n                            {\n                                prefab = new GameObjectRef { guid = guid },\n                                weight = 1,\n                                mobile = true,\n                            },\n                            config.Total\n                        )\n                    );\n                }\n            }\n        }\n\n        private void AddTurretEntries(DungeonTierConfig tierConfig, List<SpawnGroup.SpawnEntry> spawnEntries)\n        {\n            var prefabName = \"assets/prefabs/npc/autoturret/autoturret_deployed.prefab\";\n            if (GameManifest.pathToGuid.TryGetValue(prefabName, out var turretGuid))\n            {\n                spawnEntries.AddRange(\n                    Enumerable.Repeat(\n                        new SpawnGroup.SpawnEntry\n                        {\n                            prefab = new GameObjectRef { guid = turretGuid },\n                            weight = 1,\n                            mobile = false,\n                        },\n                        tierConfig.AutoTurretConfig.Total\n                    )\n                );\n            }\n        }\n\n        private void AddLootEntries(DungeonTierConfig tierConfig, List<SpawnGroup.SpawnEntry> spawnEntries)\n        {\n            var prefabName = \"assets/prefabs/deployable/woodenbox/woodbox_deployed.prefab\";\n            if (GameManifest.pathToGuid.TryGetValue(prefabName, out var boxGuid))\n            {\n                spawnEntries.AddRange(\n                    Enumerable.Repeat(\n                        new SpawnGroup.SpawnEntry\n                        {\n                            prefab = new GameObjectRef { guid = boxGuid },\n                            weight = 1,\n                            mobile = false,\n                        },\n                        tierConfig.TotalLootBoxes\n                    )\n                );\n            }\n        }\n\n        private void ConfigureTurret(AutoTurret turret, TurretConfig turretConfig)\n        {\n            turret.InitializeHealth(turretConfig.Health, turretConfig.Health);\n\n            var weapon = ItemManager.CreateByName(turretConfig.WeaponShortName);\n            weapon?.MoveToContainer(turret.inventory, 0);\n\n            var laserSight = ItemManager.CreateByName(\"weapon.mod.lasersight\");\n            laserSight?.MoveToContainer(weapon.contents);\n\n            turret.UpdateAttachedWeapon();\n            turret.gameObject.AddComponent<TurretMonoBehaviour>();\n        }\n\n        public class TurretMonoBehaviour : MonoBehaviour\n        {\n            private AutoTurret _turret;\n\n            private void Awake()\n            {\n                _turret = GetComponent<AutoTurret>();\n\n                _turret.SetPeacekeepermode(false);\n                _turret.InitiateStartup();\n                _turret.isLootable = false;\n                _turret.dropFloats = false;\n                _turret.dropsLoot = false;\n\n                InvokeRepeating(nameof(RefillAmmo), 2f, 30f);\n            }\n\n            private void RefillAmmo()\n            {\n                int maxReserveAmmo = 1000;\n\n                if (_turret.AttachedWeapon is not BaseProjectile baseProjectile || baseProjectile.primaryMagazine?.ammoType == null)\n                    return;\n\n                var ammoType = baseProjectile.primaryMagazine.ammoType;\n                int currentAmmoCount = _turret.inventory.itemList.Where(item => item.info == ammoType).Sum(item => item.amount);\n\n                if (currentAmmoCount < maxReserveAmmo)\n                {\n                    int ammoNeeded = maxReserveAmmo - currentAmmoCount;\n                    Item ammoItem = ItemManager.Create(ammoType, ammoNeeded);\n                    ammoItem?.MoveToContainer(_turret.inventory);\n\n                    _turret.UpdateTotalAmmo();\n                    _turret.EnsureReloaded();\n                    _turret.SendNetworkUpdateImmediate();\n                }\n            }\n\n            private void OnDestroy()\n            {\n                CancelInvoke(nameof(RefillAmmo));\n            }\n        }\n\n        private void ConfigureStorage(StorageContainer storage)\n        {\n            storage.skinID = _configData.LootBoxConfig.SmallWoodBoxSkinID;\n            AddCodeLock(storage);\n            PopulateStorage(storage.inventory, _configData.LootBoxConfig.LootItems);\n        }\n\n        private void AddCodeLock(StorageContainer storage)\n        {\n            var prefabName = \"assets/prefabs/locks/keypad/lock.code.prefab\";\n            var codeLock = GameManager.server.CreateEntity(prefabName) as CodeLock;\n            if (codeLock == null)\n                return;\n\n            codeLock.SetParent(storage, storage.GetSlotAnchorName(BaseEntity.Slot.Lock));\n            codeLock.Spawn();\n            codeLock.code = Random.Range(1000, 9999).ToString();\n            codeLock.hasCode = true;\n            codeLock.SetFlag(BaseEntity.Flags.Locked, true);\n        }\n\n        private void PopulateStorage(ItemContainer container, List<ItemConfig> lootItems)\n        {\n            var shuffledItems = lootItems.OrderBy(_ => Random.value).ToList();\n            var differentItemsCount = 0;\n\n            foreach (var itemConfig in shuffledItems)\n            {\n                if (differentItemsCount >= _configData.LootBoxConfig.MaxDifferentItemsPerBox)\n                {\n                    break;\n                }\n\n                if (Random.value * 100f <= itemConfig.InclusionChancePercentage)\n                {\n                    var itemDefinition = ItemManager.FindItemDefinition(itemConfig.ShortName);\n                    if (itemDefinition != null)\n                    {\n                        var amount = Random.Range(itemConfig.MinimumAmount, itemConfig.MaximumAmount + 1);\n                        if (container.itemList.Count < container.capacity)\n                        {\n                            var item = ItemManager.Create(itemDefinition, amount);\n                            item.MoveToContainer(container);\n                            differentItemsCount++;\n                        }\n                    }\n                }\n            }\n        }\n\n        private List<ActiveDungeon> RemoveInactiveDungeons()\n        {\n            var removedDungeons = new List<ActiveDungeon>();\n\n            foreach (var dungeon in _dungeonData.ActiveDungeons.ToList())\n            {\n                if (CanBeRemoved(dungeon))\n                {\n                    removedDungeons.Add(dungeon);\n                    DestroyDungeon(dungeon);\n                }\n            }\n\n            SaveData();\n\n            return removedDungeons;\n        }\n\n        private void DestroyDungeon(ActiveDungeon dungeon)\n        {\n            var dungeonEntity = BaseNetworkable.serverEntities.Find(new NetworkableId(dungeon.PortalId)) as HalloweenDungeon;\n            if (dungeonEntity != null)\n            {\n                dungeonEntity?.Kill(BaseNetworkable.DestroyMode.None);\n            }\n\n            var proceduralDynamicDungeon = BaseNetworkable.serverEntities.Find(new NetworkableId(dungeon.DynamicDungeonId)) as ProceduralDynamicDungeon;\n            if (proceduralDynamicDungeon != null)\n            {\n                RemoveLootableCorpse(proceduralDynamicDungeon);\n                RemoveItemDrop(proceduralDynamicDungeon);\n                RemoveDroppedItemContainer(proceduralDynamicDungeon);\n            }\n\n            DestroyEntities(dungeon);\n            RemoveDungeonMarkers(dungeon);\n            _dungeonData.ActiveDungeons.Remove(dungeon);\n        }\n\n        private void RemoveDroppedItemContainer(ProceduralDynamicDungeon dungeon)\n        {\n            List<DroppedItemContainer> obj = Pool.Get<List<DroppedItemContainer>>();\n            Vis.Entities(dungeon.transform.position, 80f, obj);\n            foreach (DroppedItemContainer item in obj)\n            {\n                if (item.IsValid() && !item.IsDestroyed)\n                {\n                    item?.Kill();\n                }\n            }\n\n            Pool.FreeUnmanaged(ref obj);\n        }\n\n        private void RemoveItemDrop(ProceduralDynamicDungeon dungeon)\n        {\n            List<DroppedItem> obj = Pool.Get<List<DroppedItem>>();\n            Vis.Entities(dungeon.transform.position, 80f, obj);\n            foreach (DroppedItem item in obj)\n            {\n                if (item.IsValid() && !item.IsDestroyed)\n                {\n                    item?.Kill();\n                }\n            }\n\n            Pool.FreeUnmanaged(ref obj);\n        }\n\n        private void RemoveLootableCorpse(ProceduralDynamicDungeon dungeon)\n        {\n            List<LootableCorpse> obj = Pool.Get<List<LootableCorpse>>();\n            Vis.Entities(dungeon.transform.position, 80f, obj);\n            foreach (LootableCorpse item in obj)\n            {\n                if (item.IsValid() && !item.IsDestroyed)\n                {\n                    item?.Kill();\n                }\n            }\n\n            Pool.FreeUnmanaged(ref obj);\n        }\n\n        private void DestroyEntities(ActiveDungeon dungeon)\n        {\n            foreach (var entityId in dungeon.EntityIds)\n            {\n                var entity = BaseNetworkable.serverEntities.Find(new NetworkableId(entityId)) as BaseEntity;\n                entity?.Kill(BaseNetworkable.DestroyMode.None);\n            }\n\n            dungeon.EntityIds.Clear();\n        }\n\n        private void RemoveDungeonMarkers(ActiveDungeon dungeon)\n        {\n            foreach (var marker in _dungeonData.ActiveDungeonMarkers.Where(m => m.Position == dungeon.Position).ToList())\n            {\n                var vendingMarker = BaseNetworkable.serverEntities.Find(new NetworkableId(marker.VendingMarker)) as BaseEntity;\n                var radiusMarker = BaseNetworkable.serverEntities.Find(new NetworkableId(marker.RadiusMarker)) as BaseEntity;\n\n                vendingMarker?.Kill(BaseNetworkable.DestroyMode.None);\n                radiusMarker?.Kill(BaseNetworkable.DestroyMode.None);\n\n                _dungeonData.ActiveDungeonMarkers.Remove(marker);\n            }\n        }\n\n        private IEnumerable<ActiveDungeon> RemoveAllDungeons()\n        {\n            var removedDungeons = new List<ActiveDungeon>(_dungeonData.ActiveDungeons);\n            foreach (var dungeon in removedDungeons)\n            {\n                DestroyDungeon(dungeon);\n            }\n            _dungeonData = new DungeonData();\n            SaveData();\n            return removedDungeons;\n        }\n\n        #endregion\n\n        #region Utility Methods\n\n        private ProceduralDynamicDungeon GetProceduralDungeon(BasePortal dungeonPortal)\n        {\n            return (dungeonPortal as XmasDungeon)?.dungeonInstance.Get(true) ?? (dungeonPortal as HalloweenDungeon)?.dungeonInstance.Get(true);\n        }\n\n        private void CleanupExistingEntities()\n        {\n            foreach (\n                var entityType in new Type[]\n                {\n                    typeof(VendingMachineMapMarker),\n                    typeof(MapMarkerGenericRadius),\n                    typeof(BasePortal),\n                    typeof(ProceduralDynamicDungeon),\n                    typeof(AutoTurret),\n                    typeof(NPCPlayer),\n                    typeof(StorageContainer),\n                }\n            )\n            {\n                foreach (var obj in UnityEngine.Object.FindObjectsOfType(entityType))\n                {\n                    if (obj is BaseEntity baseEntity && baseEntity.OwnerID == OwnerID)\n                    {\n                        baseEntity.Kill(BaseNetworkable.DestroyMode.None);\n                    }\n                }\n            }\n\n            _dungeonData = new DungeonData();\n        }\n\n        private void InitializeTierNameMap()\n        {\n            _tierNameMap = new Dictionary<DungeonTierConfig, string>\n            {\n                { _configData.Tiers.Easy, \"Easy\" },\n                { _configData.Tiers.Normal, \"Normal\" },\n                { _configData.Tiers.Medium, \"Medium\" },\n                { _configData.Tiers.Hard, \"Hard\" },\n                { _configData.Tiers.Nightmare, \"Nightmare\" },\n            };\n        }\n\n        private void LoadData()\n        {\n            _dataFile = Interface.Oxide.DataFileSystem.GetFile(\"Dungeons_Data\");\n            _dungeonData = _dataFile.ReadObject<DungeonData>() ?? new DungeonData();\n        }\n\n        private void SaveData()\n        {\n            _dataFile.WriteObject(_dungeonData);\n        }\n\n        private static bool IsPlayer(BasePlayer targetPlayer) => targetPlayer != null && targetPlayer.userID.IsSteamId();\n\n        private void NotifyPlayersOfNewDungeon(ActiveDungeon activeDungeon)\n        {\n            foreach (var player in BasePlayer.activePlayerList)\n            {\n                var message = Msg(player.UserIDString, \"DungeonAppeared\", activeDungeon.TierName, activeDungeon.Grid);\n                player.ChatMessage(message);\n                player.ShowToast(GameTip.Styles.Blue_Normal, message);\n            }\n        }\n\n        private void NotifyPlayerOnRemoval(BasePlayer player, IEnumerable<ActiveDungeon> removedDungeons)\n        {\n            if (!removedDungeons.Any())\n            {\n                player.ChatMessage(Msg(player.UserIDString, \"NoInactiveDungeonsToRemove\"));\n                return;\n            }\n\n            foreach (var dungeon in removedDungeons)\n            {\n                player.ChatMessage(Msg(player.UserIDString, \"DungeonRemovedDetail\", dungeon.TierName, dungeon.Grid));\n            }\n        }\n\n        private bool IsAdmin(BasePlayer player) => player != null && player.IsAdmin;\n\n        private bool IsDungeonEntity(BaseEntity entity) => entity != null && _dungeonData.ActiveDungeons.Any(d => d.EntityIds.Contains(entity.net.ID.Value));\n\n        private string GetRandomDungeonPrefab()\n        {\n            var prefabs = new List<string>();\n            if (_configData.DungeonSpawn.EnableXmasDungeon)\n                prefabs.Add(\"assets/prefabs/missions/portal/xmasportalentry.prefab\");\n            if (_configData.DungeonSpawn.EnableHalloweenDungeon)\n                prefabs.Add(\"assets/prefabs/missions/portal/halloweenportalentry.prefab\");\n            return prefabs.Count > 0 ? prefabs[Random.Range(0, prefabs.Count)] : null;\n        }\n\n        private static bool IsValidPosition(Vector3 position, out Vector3 suitablePosition, out Quaternion suitableRotation)\n        {\n            suitablePosition = Vector3.zero;\n            suitableRotation = Quaternion.identity;\n\n            if (!LocationCheck.GetTerrainInfo(position, out var hitInfo))\n                return false;\n            if (LocationCheck.InsideRock(position, 10f))\n                return false;\n            if (LocationCheck.InWater(position))\n                return false;\n            if (LocationCheck.OnRoadOrRail(position))\n                return false;\n            if (LocationCheck.InNoBuildZone(position, 10f))\n                return false;\n\n            return SetSuitablePositionAndRotation(position, hitInfo, out suitablePosition, out suitableRotation);\n        }\n\n        private static bool SetSuitablePositionAndRotation(Vector3 position, RaycastHit hitInfo, out Vector3 suitablePosition, out Quaternion suitableRotation)\n        {\n            suitablePosition = hitInfo.point;\n            suitableRotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);\n            return true;\n        }\n\n        private void CreateDungeonMarkers(ActiveDungeon activeDungeon)\n        {\n            var prefabVendingMarker = \"assets/prefabs/deployable/vendingmachine/vending_mapmarker.prefab\";\n            var vendingMarker = CreateMapMarker<VendingMachineMapMarker>(prefabVendingMarker, activeDungeon.Position);\n            vendingMarker.OwnerID = OwnerID;\n            vendingMarker.markerShopName = $\"Dungeon: {activeDungeon.TierName}\";\n            vendingMarker.SendNetworkUpdate();\n\n            var prefabRadiusMarker = \"assets/prefabs/tools/map/genericradiusmarker.prefab\";\n            var radiusMarker = CreateMapMarker<MapMarkerGenericRadius>(prefabRadiusMarker, activeDungeon.Position);\n            radiusMarker.OwnerID = OwnerID;\n            radiusMarker.alpha = 0.75f;\n            radiusMarker.radius = 0.5f;\n            radiusMarker.color2 = GetMarkerColorByTier(activeDungeon.TierName);\n            radiusMarker.SendUpdate();\n            radiusMarker.SendNetworkUpdate();\n\n            _dungeonData.ActiveDungeonMarkers.Add(\n                new DungeonMarker\n                {\n                    VendingMarker = vendingMarker.net.ID.Value,\n                    RadiusMarker = radiusMarker.net.ID.Value,\n                    Position = activeDungeon.Position,\n                    Tier = activeDungeon.TierName,\n                }\n            );\n        }\n\n        private T CreateMapMarker<T>(string prefab, Vector3 position)\n            where T : BaseEntity\n        {\n            var entity = GameManager.server.CreateEntity(prefab, position) as T;\n            entity?.Spawn();\n            return entity;\n        }\n\n        private static Color GetMarkerColorByTier(string tierName)\n        {\n            return tierName switch\n            {\n                \"Easy\" => Color.green,\n                \"Normal\" or \"Medium\" => Color.yellow,\n                \"Hard\" => Color.red,\n                \"Nightmare\" => Color.black,\n                _ => Color.white,\n            };\n        }\n\n        private bool CanBeRemoved(ActiveDungeon dungeon)\n        {\n            return AreAllNpcsGone(dungeon) && NoPlayersInside(dungeon) && dungeon.Spawned;\n        }\n\n        private bool AreAllNpcsGone(ActiveDungeon dungeon)\n        {\n            return dungeon.NpcIds.All(npcId =>\n            {\n                var npc = BaseNetworkable.serverEntities.Find(new NetworkableId(npcId)) as BaseEntity;\n                return npc == null || npc.IsDestroyed;\n            });\n        }\n\n        private bool NoPlayersInside(ActiveDungeon dungeon)\n        {\n            var dynamicDungeon = BaseNetworkable.serverEntities.Find(new NetworkableId(dungeon.DynamicDungeonId)) as ProceduralDynamicDungeon;\n            return dynamicDungeon == null || !dynamicDungeon.ContainsAnyPlayers();\n        }\n\n        private bool TryFindDungeonSpawnPoint(out Vector3 position, out Quaternion rotation)\n        {\n            var mapSize = World.Size;\n            for (var attempt = 0; attempt < 1000; attempt++)\n            {\n                var candidatePosition = new Vector3(Random.Range(-mapSize / 2, mapSize / 2), 0, Random.Range(-mapSize / 2, mapSize / 2));\n\n                if (IsValidPosition(candidatePosition, out position, out rotation) && IsSafeFromOtherDungeons(position) && !IsCloseToMonuments(position))\n                {\n                    return true;\n                }\n            }\n\n            position = Vector3.zero;\n            rotation = Quaternion.identity;\n            return false;\n        }\n\n        private bool IsSafeFromOtherDungeons(Vector3 position)\n        {\n            return _dungeonData.ActiveDungeons.All(dungeon => Vector3.Distance(position, dungeon.Position) >= _configData.DungeonSpawn.MinDistanceBetweenDungeons);\n        }\n\n        private bool IsCloseToMonuments(Vector3 position)\n        {\n            return TerrainMeta.Path.Monuments.Any(mon => Vector3.Distance(position, mon.transform.position) < _configData.DungeonSpawn.MinDistanceFromMonuments);\n        }\n\n        private DungeonTierConfig GetDungeonTier(int cellCount)\n        {\n            return cellCount switch\n            {\n                < 5 => _configData.Tiers.Easy,\n                < 8 => _configData.Tiers.Normal,\n                < 12 => _configData.Tiers.Medium,\n                < 16 => _configData.Tiers.Hard,\n                _ => _configData.Tiers.Nightmare,\n            };\n        }\n\n        #endregion\n\n        #region Configuration\n\n        private class ConfigData\n        {\n            [JsonProperty(PropertyName = \"Dungeon Spawn Settings\")]\n            public DungeonSpawnSettings DungeonSpawn { get; set; } = new DungeonSpawnSettings();\n\n            [JsonProperty(PropertyName = \"Tiers\")]\n            public DungeonTiers Tiers { get; set; } = new DungeonTiers();\n\n            [JsonProperty(PropertyName = \"Loot Box Config\")]\n            public LootBoxConfig LootBoxConfig { get; set; } = new LootBoxConfig();\n\n            [JsonProperty(\"Enable Debug\")]\n            public bool EnableDebug { get; set; } = true;\n\n            [JsonProperty(PropertyName = \"Version\")]\n            public VersionNumber Version { get; set; }\n        }\n\n        private class DungeonTiers\n        {\n            [JsonProperty(PropertyName = \"Easy\")]\n            public DungeonTierConfig Easy { get; set; } =\n                new DungeonTierConfig\n                {\n                    TotalLootBoxes = 1,\n                    NpcSpawnConfigs = new List<NpcSpawnConfig>\n                    {\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 1 },\n                    },\n                    AutoTurretConfig = new TurretConfig\n                    {\n                        Total = 1,\n                        Health = 300,\n                        WeaponShortName = \"pistol.revolver\",\n                    },\n                };\n\n            [JsonProperty(PropertyName = \"Normal\")]\n            public DungeonTierConfig Normal { get; set; } =\n                new DungeonTierConfig\n                {\n                    TotalLootBoxes = 2,\n                    NpcSpawnConfigs = new List<NpcSpawnConfig>\n                    {\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 3 },\n                    },\n                    AutoTurretConfig = new TurretConfig\n                    {\n                        Total = 2,\n                        Health = 600,\n                        WeaponShortName = \"smg.2\",\n                    },\n                };\n\n            [JsonProperty(PropertyName = \"Medium\")]\n            public DungeonTierConfig Medium { get; set; } =\n                new DungeonTierConfig\n                {\n                    TotalLootBoxes = 4,\n                    NpcSpawnConfigs = new List<NpcSpawnConfig>\n                    {\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 4 },\n                    },\n                    AutoTurretConfig = new TurretConfig\n                    {\n                        Total = 3,\n                        Health = 1000,\n                        WeaponShortName = \"smg.mp5\",\n                    },\n                };\n\n            [JsonProperty(PropertyName = \"Hard\")]\n            public DungeonTierConfig Hard { get; set; } =\n                new DungeonTierConfig\n                {\n                    TotalLootBoxes = 5,\n                    NpcSpawnConfigs = new List<NpcSpawnConfig>\n                    {\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 4 },\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 3 },\n                    },\n                    AutoTurretConfig = new TurretConfig\n                    {\n                        Total = 4,\n                        Health = 1500,\n                        WeaponShortName = \"rifle.ak\",\n                    },\n                };\n\n            [JsonProperty(PropertyName = \"Nightmare\")]\n            public DungeonTierConfig Nightmare { get; set; } =\n                new DungeonTierConfig\n                {\n                    TotalLootBoxes = 6,\n                    NpcSpawnConfigs = new List<NpcSpawnConfig>\n                    {\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 5 },\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 5 },\n                    },\n                    AutoTurretConfig = new TurretConfig\n                    {\n                        Total = 6,\n                        Health = 2000,\n                        WeaponShortName = \"rifle.ak\",\n                    },\n                };\n        }\n\n        private class DungeonTierConfig\n        {\n            [JsonProperty(PropertyName = \"Maximum Loot Boxes\")]\n            public int TotalLootBoxes { get; set; }\n\n            [JsonProperty(PropertyName = \"NPC Spawn Configs\", ObjectCreationHandling = ObjectCreationHandling.Replace)]\n            public List<NpcSpawnConfig> NpcSpawnConfigs { get; set; }\n\n            [JsonProperty(PropertyName = \"Auto Turret Config\")]\n            public TurretConfig AutoTurretConfig { get; set; } = new TurretConfig();\n        }\n\n        public class LootBoxConfig\n        {\n            [JsonProperty(PropertyName = \"Small Wood Box Skin ID\")]\n            public ulong SmallWoodBoxSkinID { get; set; } = 2998755525;\n\n            [JsonProperty(PropertyName = \"Max Different Items Per Box\")]\n            public int MaxDifferentItemsPerBox { get; set; } = 6;\n\n            [JsonProperty(PropertyName = \"Loot Items\", ObjectCreationHandling = ObjectCreationHandling.Replace)]\n            public List<ItemConfig> LootItems { get; set; } =\n                new List<ItemConfig>\n                {\n                    new ItemConfig\n                    {\n                        ShortName = \"ammo.rifle\",\n                        InclusionChancePercentage = 15,\n                        MinimumAmount = 100,\n                        MaximumAmount = 300,\n                    },\n                };\n        }\n\n        private class NpcSpawnConfig\n        {\n            [JsonProperty(PropertyName = \"Prefab\")]\n            public string PrefabName { get; set; }\n\n            [JsonProperty(PropertyName = \"Maximum\")]\n            public int Total { get; set; }\n        }\n\n        private class TurretConfig\n        {\n            [JsonProperty(PropertyName = \"Maximum\")]\n            public int Total { get; set; } = 3;\n\n            [JsonProperty(PropertyName = \"Health\")]\n            public float Health { get; set; } = 1000f;\n\n            [JsonProperty(PropertyName = \"Weapon Short Name\")]\n            public string WeaponShortName { get; set; } = \"rifle.ak\";\n        }\n\n        private class DungeonSpawnSettings\n        {\n            [JsonProperty(PropertyName = \"Enable Auto Spawn\")]\n            public bool EnableAutoSpawn { get; set; } = true;\n\n            [JsonProperty(PropertyName = \"Auto Spawn Cycle Interval\")]\n            public float AutoSpawnCycleInterval { get; set; } = 60f;\n\n            [JsonProperty(PropertyName = \"Enable Xmas Dungeon\")]\n            public bool EnableXmasDungeon { get; set; } = true;\n\n            [JsonProperty(PropertyName = \"Enable Halloween Dungeon\")]\n            public bool EnableHalloweenDungeon { get; set; } = true;\n\n            [JsonProperty(PropertyName = \"Max Total Active Dungeons\")]\n            public int MaxTotalActiveDungeons { get; set; } = 4;\n\n            [JsonProperty(PropertyName = \"Min Distance From Monuments\")]\n            public float MinDistanceFromMonuments { get; set; } = 100f;\n\n            [JsonProperty(PropertyName = \"Min Distance Between Dungeons\")]\n            public float MinDistanceBetweenDungeons { get; set; } = 100f;\n        }\n\n        public class ItemConfig\n        {\n            [JsonProperty(PropertyName = \"ShortName\")]\n            public string ShortName { get; set; }\n\n            [JsonProperty(PropertyName = \"Inclusion Chance Percentage\")]\n            public float InclusionChancePercentage { get; set; }\n\n            [JsonProperty(PropertyName = \"Minimum Amount\")]\n            public int MinimumAmount { get; set; }\n\n            [JsonProperty(PropertyName = \"Maximum Amount\")]\n            public int MaximumAmount { get; set; }\n        }\n\n        protected override void LoadConfig()\n        {\n            base.LoadConfig();\n            try\n            {\n                _configData = Config.ReadObject<ConfigData>() ?? new ConfigData();\n            }\n            catch (Exception ex)\n            {\n                PrintError($\"The configuration file is corrupt: {ex}\");\n                LoadDefaultConfig();\n            }\n            SaveConfig();\n        }\n\n        protected override void LoadDefaultConfig()\n        {\n            PrintWarning(\"Creating a new configuration file.\");\n            _configData = new ConfigData { Version = Version };\n        }\n\n        protected override void SaveConfig()\n        {\n            Config.WriteObject(_configData, true);\n        }\n\n        #endregion\n\n        #region Localization\n\n        protected override void LoadDefaultMessages()\n        {\n            lang.RegisterMessages(\n                new Dictionary<string, string>\n                {\n                    [\"NoInactiveDungeonsToRemove\"] = \"There are no inactive dungeons to remove.\",\n                    [\"NoDungeonsToRemove\"] = \"There are no dungeons to remove.\",\n                    [\"DungeonRemovedDetail\"] = \"Removed dungeon of tier {0} at grid {1}.\",\n                    [\"AttemptSpawnDungeons\"] = \"Attempting to spawn dungeons.\",\n                    [\"DungeonAppeared\"] = \"A {0} Dungeon has appeared at grid {1}!\",\n                    [\"DungeonSpawnFailed\"] = \"Could not find a valid location to spawn a new dungeon.\",\n                    [\"DungeonSpawnedSuccess\"] = \"Dungeon spawned successfully at grid {0}!\",\n                    [\"MaxActiveDungeonsReached\"] = \"Cannot spawn: Maximum number of active dungeons reached.\",\n                },\n                this\n            );\n        }\n\n        private string Msg(string userId, string key, params object[] args)\n        {\n            return string.Format(lang.GetMessage(key, this, userId), args);\n        }\n\n        #endregion\n\n        #region Data Classes\n\n        private class DungeonData\n        {\n            public List<ActiveDungeon> ActiveDungeons { get; set; } = new List<ActiveDungeon>();\n            public List<DungeonMarker> ActiveDungeonMarkers { get; set; } = new List<DungeonMarker>();\n        }\n\n        private class ActiveDungeon\n        {\n            public ulong PortalId { get; set; }\n            public ulong DynamicDungeonId { get; set; }\n            public Vector3 Position { get; set; }\n            public string Grid { get; set; }\n            public string TierName { get; set; }\n            public DungeonTierConfig TierConfig { get; set; }\n            public List<ulong> EntityIds { get; set; } = new List<ulong>();\n            public List<ulong> NpcIds { get; set; } = new List<ulong>();\n            public bool Spawned { get; set; } = false;\n        }\n\n        private class DungeonMarker\n        {\n            public ulong VendingMarker { get; set; }\n            public ulong RadiusMarker { get; set; }\n            public Vector3 Position { get; set; }\n            public string Tier { get; set; }\n        }\n\n        #endregion\n\n        #region Collider Checks\n\n        public static class LocationCheck\n        {\n            public static bool InsideRock(Vector3 position, float radius)\n            {\n                List<Collider> colliders = Pool.GetList<Collider>();\n\n                Vis.Colliders(position, radius, colliders, Layers.Mask.World, QueryTriggerInteraction.Ignore);\n\n                bool isInsideRock = colliders.Any(collider =>\n                    collider.name.Contains(\"rock\", StringComparison.OrdinalIgnoreCase)\n                    || collider.name.Contains(\"cliff\", StringComparison.OrdinalIgnoreCase)\n                    || collider.name.Contains(\"formation\", StringComparison.OrdinalIgnoreCase)\n                );\n\n                Pool.FreeList(ref colliders);\n                return isInsideRock;\n            }\n\n            public static bool GetTerrainInfo(Vector3 position, out RaycastHit hitInfo)\n            {\n                return Physics.Linecast(position + Vector3.up, position - Vector3.up, out hitInfo, Layers.Mask.Terrain);\n            }\n\n            public static bool InWater(Vector3 position) => WaterLevel.Test(position, false, false);\n\n            public static bool OnRoadOrRail(Vector3 position) => (TerrainMeta.TopologyMap.GetTopology(position) & (int)TerrainTopology.Enum.Road) != 0;\n\n            public static bool InNoBuildZone(Vector3 position, float radius) => Physics.CheckSphere(position, radius, Layers.Mask.Prevent_Building, QueryTriggerInteraction.Ignore);\n        }\n\n        #endregion\n    }\n}\n"},{"assistant_initiates":false,"asst_text":"Para otimizar o seu c\u00f3digo e evitar chamadas repetidas ao `typeof(...)`, voc\u00ea pode armazenar os tipos em vari\u00e1veis est\u00e1ticas, ou em uma lista, e us\u00e1-los sempre que necess\u00e1rio. \n\nVou dar um exemplo de como voc\u00ea pode criar uma estrutura para armazenar esses tipos de forma que eles possam ser usados de forma r\u00e1pida e eficiente. Um dos lugares apropriados para fazer isso \u00e9 dentro de uma classe privada que voc\u00ea pode adicionar ao seu plugin.\n\n### Exemplo de Implementa\u00e7\u00e3o:\n\nDentro da sua classe Dungeons, adicione uma propriedade est\u00e1tica que armazena os tipos que voc\u00ea mencionou:\n\n```csharp\nprivate static readonly Type[] EntityTypes = new Type[]\n{\n    typeof(VendingMachineMapMarker),\n    typeof(MapMarkerGenericRadius),\n    typeof(BasePortal),\n    typeof(ProceduralDynamicDungeon),\n    typeof(AutoTurret),\n    typeof(NPCPlayer),\n    typeof(StorageContainer)\n};\n```\n\n### Uso:\n\nAgora, em vez de usar `typeof(...)`, voc\u00ea pode simplesmente referenciar o array `EntityTypes`. Isso simplifica e melhora a legibilidade do c\u00f3digo:\n\n```csharp\nprivate void CleanupExistingEntities()\n{\n    foreach (var entityType in EntityTypes)\n    {\n        foreach (var obj in UnityEngine.Object.FindObjectsOfType(entityType))\n        {\n            if (obj is BaseEntity baseEntity && baseEntity.OwnerID == OwnerID)\n            {\n                baseEntity.Kill(BaseNetworkable.DestroyMode.None);\n            }\n        }\n    }\n\n    _dungeonData = new DungeonData();\n}\n```\n\n### Vantagens:\n\n1. **Desempenho**: O uso de um array de tipos evita chamadas repetidas ao `typeof(...)`, que \u00e9 uma opera\u00e7\u00e3o relativamente custosa.\n2. **Legibilidade**: Facilita a leitura do c\u00f3digo, j\u00e1 que a inten\u00e7\u00e3o est\u00e1 mais clara, e voc\u00ea centraliza a defini\u00e7\u00e3o dos tipos.\n3. **Manuten\u00e7\u00e3o**: Caso voc\u00ea precise adicionar ou remover tipos no futuro, voc\u00ea s\u00f3 precisa alterar o array em um \u00fanico lugar.\n\nVoc\u00ea pode aplicar essa estrutura a outras partes do seu c\u00f3digo onde voc\u00ea faz uso repetido de `typeof(...)`. Isso deve resultar em um c\u00f3digo mais otimizado e facilmente gerenci\u00e1vel. Se precisar de mais ajuda para refatorar outras partes do c\u00f3digo, fique \u00e0 vontade para pedir!","behavior":"degenerate_repetition","conversation_hash":"43ddf884d923493a0feeae84538d228f","conversation_redacted":false,"conversation_toxic":false,"country":"Brazil","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Portuguese","model":"gpt-4o-mini-2024-07-18","n_chars":2602,"n_turns_in_conversation":5,"n_words":316,"source_row_offset":42681,"source_shard":"turns-00053.parquet","timestamp":"Sat, 23 Nov 2024 17:16:21 GMT","turn_id":"b5592f3d548b6dfbd297f4d3","turn_index":3,"user_text":"quero criar novas vari\u00e1veis que armazenem :\n                    typeof(VendingMachineMapMarker),\n                    typeof(MapMarkerGenericRadius),\n                    typeof(BasePortal),\n                    typeof(ProceduralDynamicDungeon),\n                    typeof(AutoTurret),\n                    typeof(NPCPlayer),\n                    typeof(StorageContainer),\n\npara n\u00e3o precisar ficar pegando e buscando elas, e otimizar as partes do c\u00f3digo que buscam para usar direto"},{"assistant_initiates":false,"asst_text":"Entendi! Voc\u00ea deseja armazenar as classes em vari\u00e1veis, de modo que voc\u00ea possa usar essas vari\u00e1veis em vez de fazer refer\u00eancia diretamente aos tipos. Isso permitir\u00e1 que voc\u00ea evite o uso repetido de `typeof(...)` e fa\u00e7a o c\u00f3digo mais leg\u00edvel e manage\u00e1vel. \n\nAqui est\u00e1 um exemplo de como voc\u00ea poderia implementar isso:\n\n### Armazenando os Tipos em Vari\u00e1veis\n\nPrimeiro, voc\u00ea pode criar vari\u00e1veis privadas do tipo `Type` para armazenar essas classes. Veja como voc\u00ea pode fazer isso dentro da sua classe `Dungeons`:\n\n```csharp\nprivate static readonly Type VendingMachineMapMarkerType = typeof(VendingMachineMapMarker);\nprivate static readonly Type MapMarkerGenericRadiusType = typeof(MapMarkerGenericRadius);\nprivate static readonly Type BasePortalType = typeof(BasePortal);\nprivate static readonly Type ProceduralDynamicDungeonType = typeof(ProceduralDynamicDungeon);\nprivate static readonly Type AutoTurretType = typeof(AutoTurret);\nprivate static readonly Type NPCPlayerType = typeof(NPCPlayer);\nprivate static readonly Type StorageContainerType = typeof(StorageContainer);\n```\n\n### Usando as Vari\u00e1veis nas Fun\u00e7\u00f5es\n\nDepois de armazenar os tipos, voc\u00ea pode usar essas vari\u00e1veis em seu c\u00f3digo. Aqui est\u00e1 um exemplo da sua fun\u00e7\u00e3o `CleanupExistingEntities`, ajustada para usar as vari\u00e1veis que voc\u00ea criou:\n\n```csharp\nprivate void CleanupExistingEntities()\n{\n    var entityTypes = new Type[]\n    {\n        VendingMachineMapMarkerType,\n        MapMarkerGenericRadiusType,\n        BasePortalType,\n        ProceduralDynamicDungeonType,\n        AutoTurretType,\n        NPCPlayerType,\n        StorageContainerType,\n    };\n\n    foreach (var entityType in entityTypes)\n    {\n        foreach (var obj in UnityEngine.Object.FindObjectsOfType(entityType))\n        {\n            if (obj is BaseEntity baseEntity && baseEntity.OwnerID == OwnerID)\n            {\n                baseEntity.Kill(BaseNetworkable.DestroyMode.None);\n            }\n        }\n    }\n\n    _dungeonData = new DungeonData();\n}\n```\n\n### Vantagens\n\n1. **Legibilidade:** Armazenar os tipos em vari\u00e1veis com nomes descritivos melhora a legibilidade do c\u00f3digo.\n2. **Facilidade de Manuten\u00e7\u00e3o:** Se voc\u00ea precisar alterar algum tipo, voc\u00ea s\u00f3 precisar\u00e1 alterar em um \u00fanico lugar.\n3. **Redu\u00e7\u00e3o de C\u00f3digo Duplicado:** Voc\u00ea evita a repeti\u00e7\u00e3o do `typeof(...)` e torna o c\u00f3digo mais limpo.\n\nAgora, sempre que voc\u00ea precisar usar esses tipos, voc\u00ea pode apenas referenciar a vari\u00e1vel correspondente, tornando o c\u00f3digo mais conciso e f\u00e1cil de manter. Se voc\u00ea tiver mais alguma d\u00favida ou precisar de mais esclarecimentos, basta perguntar!","behavior":"degenerate_repetition","conversation_hash":"43ddf884d923493a0feeae84538d228f","conversation_redacted":false,"conversation_toxic":false,"country":"Brazil","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Portuguese","model":"gpt-4o-mini-2024-07-18","n_chars":2812,"n_turns_in_conversation":5,"n_words":335,"source_row_offset":42682,"source_shard":"turns-00053.parquet","timestamp":"Sat, 23 Nov 2024 17:16:21 GMT","turn_id":"d6e3091a060d135f59b4bf0d","turn_index":4,"user_text":"voc\u00ea entendeu errado, quero armazenar elas em si:\nVendingMachineMapMarker\nMapMarkerGenericRadius\nBasePortal\nProceduralDynamicDungeon\nAutoTurret\nNPCPlayer\nStorageContainer\n\ne no uso nas fun\u00e7\u00f5es usar desse armazenamento, uma vari\u00e1vel no caso"},{"assistant_initiates":false,"asst_text":"```json\n{\n  \"excerpt\": \"Experience the ultimate entertainment with our Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free offer, featuring an array of channels and content.\",\n  \"introduction\": \"Dive into a world of limitless entertainment with our exclusive offer: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free. Enjoy a seamless experience of live television and on-demand content without any financial commitment.\",\n  \"head1\": \"Free Trial IPTV\",\n  \"body\": \"<div style='font-family: Arial, sans-serif; padding: 15px; background-color: #f9f9f9; border-radius: 5px;'>\" +\n    \"<p><b>Are you seeking an exceptional IPTV experience? Look no further!</b> Our Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free allows you to explore a vast world of entertainment without any upfront costs. With no strings attached, you can evaluate our service and enjoy a plethora of channels catered to your viewing preferences.</p>\" +\n    \"<h3 style='color: #2C3E50;'>Unmatched Content Library</h3>\" +\n    \"<p>Powered by the renowned <b style='text-decoration: underline;'>PROTV</b>, our IPTV subscription boasts an impressive selection of content. With <b>5599 live streaming TV categories</b> including UK News, UK General, UK Ligue 1 PPV, and more, there's something for everyone. Plus, explore <b>28,266 VOD directories</b> that feature everything from drama series to exclusive films, ensuring you never run out of things to watch.</p>\" +\n    \"<h4 style='color: #34495E;'>Key Features of PROTV IPTV Subscription</h4>\" +\n    \"<p>The <b style='text-decoration: underline;'>PROTV</b> platform provides you with:</p>\" +\n    \"<ul style='margin-left: 20px;'>\" +\n      \"<li>Live sports coverage including UK ESPN PPV and UK UFC/Boxing PPV.</li>\" +\n      \"<li>A broad range of entertainment channels, including UK Entertainment HEVC and NL HBO Max PPV.</li>\" +\n      \"<li>Documentaries and exclusive content tailored for every interest.</li>\" +\n      \"<li>Continuous access to VOD with titles from various genres including EN 4K Mafia & Gangster and Netflix Kids.</li>\" +\n    \"</ul>\" +\n    \"<p>Subscribing to our service is as easy as entering your details, and your <b>Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free</b> starts immediately!</p>\" +\n    \"<p>Don\u2019t let this opportunity pass you by! Seize the chance to experience unmatched entertainment options by using the discount code <span style='color: #E74C3C; font-weight: bold;'>IPTV20SAVE</span> at checkout for 20% off when purchasing our premium membership at <a href='https://Iptv2live.com/premium-membership' style='color: #2980B9; text-decoration: underline;'>https://Iptv2live.com/premium-membership</a> and unlock all premium IPTV subscriptions simultaneously.</p>\" +\n    \"<p>If you're excited to keep up-to-date with the latest trial IPTV codes, ensure you <a href='https://www.pinterest.com/IPTV_SMARTERS' style='color: #2980B9; text-decoration: underline;'>join our Pinterest Page</a> for instant updates and offers that you don't want to miss!</p>\" +\n    \"</div>\"\n}\n```","behavior":"degenerate_repetition","conversation_hash":"f82fecbcea6602e1e07e5246bc4e4ad2","conversation_redacted":false,"conversation_toxic":false,"country":"China","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4o-mini-2024-07-18","n_chars":7835,"n_turns_in_conversation":1,"n_words":1141,"source_row_offset":42683,"source_shard":"turns-00053.parquet","timestamp":"Sat, 23 Nov 2024 17:16:54 GMT","turn_id":"824f8991a04bbda741d0268e","turn_index":0,"user_text":"Context: making a product page in Iptv2live.com website! that sell IPTV subscriptions from differents IPTV Platforms.\nTask: Write a compelling product description for an IPTV offer with title: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free,  using best SEO practices for 2024. Follow the structure outlined below and ensure the description is optimized for search engines to help it rank highly on Google. The output must be in the following JSON format:\n{\n  \"excerpt\": \"A concise summary mentioning the main keywords of the post title: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\",\n  \"introduction\": \"Introduction (1-2 sentences): Provide a brief introduction to the product, highlighting its main benefit and mentioning the keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\",\n  \"head1\": \"Shorten my title:'Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free' using semantic keywords\".\n  \"body\": \"5 paragraphs <p></p>\"\n}\nStructure:\nexcerpt: A concise summary mentioning the main keywords of the post title: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\nintroduction: Provide a brief introduction to the product, highlighting its main benefit and mentioning the keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\nhead1: Shorten my title:'Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free' to 3 words max using semantic keywords.\nbody:\nensure to make the output in 5 paragraphs <p></p> with one h3 and one h4 that includes concise Description of the Key Features of  the IPTV subscription from the famous IPTV provider platform named: <b>PROTV</b>. which Includes: 5599 live streaming TV categories, like: UK NEWS, UK GENERAL, BE DOCUMENTAIRE, UK LIGUE 1 PPV, UK PDC BOARD PPV, All, UK NOW SPORT \u1d34\u1d30, BE BELGIUM DAZN EXCLUSIVE \u1d3f\u1d2c\u1d42, NL HBO MAX PPV, NL FEYENOORD ONE PPV, UK ENTERTAINMENT HEVC, USA, UK DOCUMENTARY, UK NATIONAL LEAGUE, UK ESPN PPV, UK ENTERTAINMENT, UK WORLD SPORTS, UK UFC/BOXING PPV, NL ODIDO VERMAAK \u1d34\u1d30 \u1d33\u1d3c\u1d38\u1d30, UK SKY SPORTS RED BUTTON,  and 28266 VOD Directories, VOD exemple: EN 4K MAFIA & GANGSTER, EN SCHOOLING KIDS, EN WAR, EN DRAMA, NL OVERIGE, NETFLIX KIDS, EN GANGSTER & MAFIA, NL VIDEOLAND, EN RATED R, NL NETFLIX, , IPTV subscription Expire on : 08/12/2024.\nSEO Tips:\nExplain the product in detail, focusing on its benefits, the IPTV provider platform name: PROTV, usability, and the available streaming content. Include the keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free, naturally and use LSI/NLP related keywords to the post title.\nEnsure to include in the end of the body the first Call to Action NATURALLY in 1 paragraph, Encourage potential customers to take action, by using the discount code IPTV20SAVE at checkout for 20% off when purchasing our premium membership at https://Iptv2live.com/premium-membership and unlock all premium IPTV subscriptions simultaneously..\nEnsure to include after the end of the body the Second Call to Action NATURALLY in 1 paragraph, Encourage visitors to take action, by joining our Pintrest Page https://www.pinterest.com/IPTV_SMARTERS to get the latest trial IPTV codes.\nIncorporate the primary keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free, and related keywords naturally throughout the excerpt, introduction and body.\nUse HTML tags for better formatting and readability, such as <div>, <b>, <i>, <ul>, <li><table>, and <p> in body.\nEnsure the use of a modern and stylish HTML design in the body display by using inline style = '', \nHighlight the body into a stylish and modern <div>, \nClearly Mention and Highlight the platform name: PROTV with stylish text decoration using inline style.\nHighlight the platform name: IPTV20SAVE at checkout for 20% off with stylish text decoration using inline style.\nHighlight the first CTA: by using the discount code IPTV20SAVE at checkout for 20% off when purchasing our premium membership at https://Iptv2live.com/premium-membership and unlock all premium IPTV subscriptions simultaneously. with a proper anchor texts into a new line centered HTML button tag. \nHighlight the second CTA: by joining our Pintrest Page https://www.pinterest.com/IPTV_SMARTERS to get the latest trial IPTV codes with a proper anchor text into a new line centered HTML button tag. \nAvoid keyword stuffing; focus on creating valuable, informative content for the reader.\nMake sure the product description is engaging, informative, and optimized for search engines while providing value to the reader.\nMake sure to never mention the word \"Call to Action\" in your response.\nFinally make sure that the output overall pass all AI test detection by using Humanized  and natural Text writing style."},{"assistant_initiates":false,"asst_text":"```json\n{\n  \"excerpt\": \"Explore the mac portal with access to SU SURINAME cable channels, offering diverse entertainment through a premium IPTV subscription.\",\n  \"introduction\": \"Experience seamless entertainment with the mac portal with access to SU SURINAME cable channels. This IPTV subscription not only offers a wide array of cable channels but also brings the vibrant culture of Suriname right to your screen.\",\n  \"head1\": \"Suriname Cable Access\",\n  \"body\": \"<div style='font-family: Arial, sans-serif; color: #333; line-height: 1.6;'><p>With the mac portal, you gain access to a remarkable selection of SU SURINAME cable channels, ensuring you never miss out on your favorite shows and live sports events. This subscription is perfect for both local residents and expatriates, allowing you to stay connected with Surinamese culture while enjoying high-quality streaming. </p><h3 style='color: #007BFF;'>Key Features of the IPTV Subscription from <b style='text-decoration: underline;'>23232</b></h3><p>The IPTV plan from <b style='text-decoration: underline;'>23232</b> offers an impressive lineup of <b>33537 cable channels</b> and <b>156341 VOD directories</b>. Whether you're a fan of sports, movies, documentaries, or children\u2019s content, this subscription has everything you need. Access popular categories like DE SKY MAX PPV 4K, UK SCOTTISH FOOTBALL, AU ESPN PLAY PPV, and many more, ensuring entertainment for every taste and preference.</p><h4 style='color: #007BFF;'>VOD Directory Highlights</h4><p>Dive into a plethora of options with our extensive VOD directory, featuring examples like FR BIBLIQUE, AR \u0627\u0641\u0644\u0627\u0645 \u062c\u0627\u0643\u064a \u0634\u0627\u0646, IN TELEGU MOVIES, and EN UK MOVIES. No matter what you're in the mood for, you're bound to find something captivating within our vast collection. This comprehensive selection ensures that countless hours of viewing pleasure are just a click away.</p><p>Your IPTV subscription will remain active until <b>08/04/2025</b>, providing you with long-term access to your favorite content. Don\u2019t miss the opportunity to engage with top-tier channels and seek out exciting new titles from a variety of genres.</p><p>Now is the perfect time to act! Use the discount code <b style='text-decoration: underline;'>IPTV20SAVE</b> at checkout for <b style='text-decoration: underline;'>20% off</b> when purchasing our premium membership at <a href='https://Iptv2live.com/premium-membership' style='color: #007BFF;'>https://Iptv2live.com/premium-membership</a> and unlock all premium IPTV subscriptions simultaneously.</p><p>Additionally, stay updated with the latest offerings and get access to trial codes by joining our Facebook group: <a href='https://iptv2live.com/fb.php' style='color: #007BFF;'>Free IPTV Codes</a>. It\u2019s your gateway to explore and enjoy new IPTV options!</p></div>\"\n}\n```","behavior":"degenerate_repetition","conversation_hash":"874c3db5ca493301c68e26b7faa0ace4","conversation_redacted":false,"conversation_toxic":false,"country":"","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4o-mini-2024-07-18","n_chars":7490,"n_turns_in_conversation":1,"n_words":1096,"source_row_offset":42684,"source_shard":"turns-00053.parquet","timestamp":"Sat, 23 Nov 2024 17:16:57 GMT","turn_id":"fcf2e2cf64bdcf9bb70a64f3","turn_index":0,"user_text":"Context: making a product page in Iptv2live.com website! that sell IPTV subscriptions from differents IPTV Platforms.\nTask: Write a compelling product description for an IPTV offer with title:  mac portal with access to SU SURINAME cable channels,  using best SEO practices for 2024. Follow the structure outlined below and ensure the description is optimized for search engines to help it rank highly on Google. The output must be in the following JSON format:\n{\n  \"excerpt\": \"A concise summary mentioning the main keywords of the post title:  mac portal with access to SU SURINAME cable channels.\",\n  \"introduction\": \"Introduction (1-2 sentences): Provide a brief introduction to the product, highlighting its main benefit and mentioning the keyword:  mac portal with access to SU SURINAME cable channels.\",\n  \"head1\": \"Shorten my title:' mac portal with access to SU SURINAME cable channels' using semantic keywords\".\n  \"body\": \"5 paragraphs <p></p>\"\n}\nStructure:\nexcerpt: A concise summary mentioning the main keywords of the post title:  mac portal with access to SU SURINAME cable channels.\nintroduction: Provide a brief introduction to the product, highlighting its main benefit and mentioning the keyword:  mac portal with access to SU SURINAME cable channels.\nhead1: Shorten my title:' mac portal with access to SU SURINAME cable channels' to 3 words max using semantic keywords.\nbody:\nensure to make the output in 5 paragraphs <p></p> with one h3 and one h4 that includes concise Description of the Key Features of  the IPTV subscription from the famous IPTV provider platform named: <b>23232</b>. which Includes: 33537 cable channels categories, like: DE SKY MAX PPV\u00a04K, UK SCOTTISH FOOTBALL, NZ NEW ZEALAND, ESTONIA, AU ESPN PLAY PPV, TR MAC KANALLARI, GR \u0393\u0395\u039d\u0399\u039a\u0386/GENERAL, RO CANALE DE CINEMA, PL VIAPLAY, SU SURINAME, AR KUWAIT, US CW/MY NETWORK, LAT ECUADOR, PL REGIONALNE, ICELAND SIMINN PPV, NORWAY TV2 PLAY, FR DOCUMENTAIRE HD, US NEWS NETWORK, CA ENGLISH, AR BEIN SPORTS \u1d41\u1d34\u1d30,  and 156341 VOD Directories, VOD exemple: FR\u00a0BIBLIQUE, AR \u0627\u0641\u0644\u0627\u0645 \u062c\u0627\u0643\u064a \u0634\u0627\u0646, AR \u0623\u0641\u0644\u0627\u0645 \u0627\u0637\u0641\u0627\u0644, DK DANSKE 19002000, TR YERLI, IN TELEGU MOVIES, EN WAR, NL APPLE TV, SCA NORDIC CLASSIC, EN UK MOVIES, , IPTV subscription Expire on : 08/04/2025.\nSEO Tips:\nExplain the product in detail, focusing on its benefits, the IPTV provider platform name: 23232, usability, and the available streaming content. Include the keyword:  mac portal with access to SU SURINAME cable channels, naturally and use LSI/NLP related keywords to the post title.\nEnsure to include in the end of the body the first Call to Action NATURALLY in 1 paragraph, Encourage potential customers to take action, by using the discount code IPTV20SAVE at checkout for 20% off when purchasing our premium membership at https://Iptv2live.com/premium-membership and unlock all premium IPTV subscriptions simultaneously..\nEnsure to include after the end of the body the Second Call to Action NATURALLY in 1 paragraph, Encourage visitors to take action, by joining our facebook group : Free IPTV Codes https://iptv2live.com/fb.php to get the latest trial IPTV codes.\nIncorporate the primary keyword:  mac portal with access to SU SURINAME cable channels, and related keywords naturally throughout the excerpt, introduction and body.\nUse HTML tags for better formatting and readability, such as <div>, <b>, <i>, <ul>, <li><table>, and <p> in body.\nEnsure the use of a modern and stylish HTML design in the body display by using inline style = '', \nHighlight the body into a stylish and modern <div>, \nClearly Mention and Highlight the platform name: 23232 with stylish text decoration using inline style.\nHighlight the platform name: IPTV20SAVE at checkout for 20% off with stylish text decoration using inline style.\nHighlight the first CTA: by using the discount code IPTV20SAVE at checkout for 20% off when purchasing our premium membership at https://Iptv2live.com/premium-membership and unlock all premium IPTV subscriptions simultaneously. with a proper anchor texts into a new line centered HTML button tag. \nHighlight the second CTA: by joining our facebook group : Free IPTV Codes https://iptv2live.com/fb.php to get the latest trial IPTV codes with a proper anchor text into a new line centered HTML button tag. \nAvoid keyword stuffing; focus on creating valuable, informative content for the reader.\nMake sure the product description is engaging, informative, and optimized for search engines while providing value to the reader.\nMake sure to never mention the word \"Call to Action\" in your response.\nFinally make sure that the output overall pass all AI test detection by using Humanized  and natural Text writing style."},{"assistant_initiates":false,"asst_text":"The `Dungeons` plugin you provided is a comprehensive implementation for managing dungeon spawn mechanics in a Rust server environment. Below, I will summarize the main components and functionalities of this plugin for better understanding:\n\n### Overview\n\n1. **Plugin Header and Metadata**:\n   - The plugin is defined with the name \"Dungeons\", authored by \"Marte6\", and has a version number (1.0.0).\n\n2. **Timers**:\n   - The plugin uses multiple timers to handle automatic dungeon spawning, cleaning up inactive dungeons, and updating map markers for active dungeons.\n\n3. **Dungeons Management**:\n   - Dungeons are represented by instances of `ActiveDungeon`, which hold information pertaining to each spawned dungeon (positions, entities, etc.).\n   - The plugin supports multiple tiers of dungeons: Easy, Normal, Medium, Hard, and Nightmare, each with its unique configuration (e.g., NPCs, turrets, loot).\n\n4. **Spawn Logic**:\n   - Dungeons are spawned based on randomized positions validated by terrain checks.\n   - Validations include checking terrain, nearby monuments, and existing dungeons to ensure no overlap.\n\n5. **Entity Management**:\n   - Entities within dungeons (like NPCs and turrets) are spawned based on defined configurations:\n     - NPCs are spawned per the configuration related to their tiers, equipped with specific weapons and health.\n     - Lootable containers are also configured; they can spawn various items based on predefined probabilities.\n\n6. **Command Handling**:\n   - Several chat commands available for admins to interact with the plugin:\n     - `dun`: Manually create a dungeon.\n     - `RemoveInactiveDungeons`: Clean up inactive dungeons.\n     - `RemoveAllDungeons`: Remove all active dungeons.\n     - `ForceRemoveAllDungeons`: Force remove all dungeon-related entities.\n\n7. **Message and Logging**:\n   - Uses a localization method to manage user-facing messages.\n   - Custom logging is implemented for debugging purposes, toggled via configuration.\n\n8. **Collisions and Restrictions**:\n   - Utilizes spatial checks to determine if a proposed spawn point is within rocks, in water, or too close to roads/other structures to maintain game balance.\n\n9. **Configuration**:\n   - The configuration is loaded from a JSON file, allowing dynamic adjustments without recompiling the plugin.\n   - Consists of spawn settings, tier configurations, and loot box settings.\n\n### Functional Highlights\n- **Timers**:\n  - Automatically manages dungeon spawning and cleanup without manual intervention using background timers.\n  \n- **Dungeons Creation**:\n  - A variety of prefabs for dungeon portals are supported, allowing flexibility in dungeon type.\n\n- **User Feedback**:\n  - Players receive notifications regarding dungeon creation and removal, helping communicate changes in the game world.\n\n- **Automated NPC Management**:\n  - AutoTurrets are set to refill ammo periodically without requiring user actions.\n\n### Potential Improvements and Extensions\n- **Dynamic Difficulty Adjustment**: Implement adaptive difficulty based on player activity or server events.\n- **Enhanced Loot System**: More complex loot distributions or randomized event outcomes to encourage exploration.\n- **Event Hooks**: Integrate with existing server events or player actions to take real-time dungeon adjustments (e.g., buffing or weakening monsters).\n\nThis plugin serves as a robust foundation for adding dungeon mechanics to a Rust server, greatly enhancing the gameplay experience by introducing new challenges and systems for players to engage with.","behavior":"degenerate_repetition","conversation_hash":"1f27ec586c3bc438c282ce3e833893b5","conversation_redacted":false,"conversation_toxic":false,"country":"Brazil","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4o-mini-2024-07-18","n_chars":56543,"n_turns_in_conversation":1,"n_words":4003,"source_row_offset":42685,"source_shard":"turns-00053.parquet","timestamp":"Sat, 23 Nov 2024 17:16:59 GMT","turn_id":"42af31daff4af19b13b9a742","turn_index":0,"user_text":"using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Facepunch;\nusing Newtonsoft.Json;\nusing Oxide.Core;\nusing Oxide.Core.Configuration;\nusing Rust;\nusing UnityEngine;\nusing Random = UnityEngine.Random;\n\nnamespace Oxide.Plugins\n{\n    [Info(\"Dungeons\", \"Marte6\", \"1.0.0\")]\n    public class Dungeons : RustPlugin\n    {\n        private ConfigData _configData;\n        private DynamicConfigFile _dataFile;\n        private DungeonData _dungeonData;\n        private Timer _autoSpawnTimer;\n        private Timer _dungeonCheckTimer;\n        private Timer _updateMarkersTimer;\n        private Dictionary<DungeonTierConfig, string> _tierNameMap;\n        private const ulong OwnerID = 1020304050;\n\n        #region Hooks\n\n        private void OnServerInitialized()\n        {\n            InitializeTierNameMap();\n            LoadData();\n            RemoveAllDungeons();\n            StartTimerAutoSpawnDungeons();\n            StartTimerRemoveInactiveDungeons();\n            StartTimerUpdateMarkers();\n            SaveData();\n        }\n\n        private void OnServerSave() => SaveData();\n\n        private void Unload()\n        {\n            RemoveAllDungeons();\n            _autoSpawnTimer?.Destroy();\n            _dungeonCheckTimer?.Destroy();\n            _updateMarkersTimer?.Destroy();\n            SaveData();\n        }\n\n        object OnTurretTarget(AutoTurret turret, BaseCombatEntity target)\n        {\n            if (IsDungeonEntity(target))\n            {\n                return false;\n            }\n\n            return null;\n        }\n\n        object OnEntityTakeDamage(ScientistNPC scientistNPC, HitInfo info)\n        {\n            if (scientistNPC == null || info == null || info.Initiator == null)\n                return null;\n\n            AutoTurret autoTurret = info.Initiator as AutoTurret;\n            if (autoTurret == null)\n                return null;\n            if (IsDungeonEntity(autoTurret))\n                return true;\n\n            return null;\n        }\n\n        object CanEntityTakeDamage(AutoTurret autoTurret, HitInfo hitinfo)\n        {\n            if (autoTurret == null || hitinfo == null)\n                return null;\n\n            if (IsDungeonEntity(autoTurret))\n            {\n                if (hitinfo.InitiatorPlayer == null || !IsPlayer(hitinfo.Initiator as BasePlayer))\n                    return false;\n                else\n                    return true;\n            }\n\n            return null;\n        }\n\n        object CanEntityTakeDamage(StorageContainer storageContainer, HitInfo hitinfo)\n        {\n            if (storageContainer == null || hitinfo == null)\n                return null;\n\n            if (IsDungeonEntity(storageContainer))\n            {\n                if (hitinfo.InitiatorPlayer == null || !IsPlayer(hitinfo.Initiator as BasePlayer))\n                    return false;\n                else\n                    return true;\n            }\n\n            return null;\n        }\n\n        #endregion\n\n        #region Chat Commands\n\n        [ChatCommand(\"dun\")]\n        private void CreateDungeonCommand(BasePlayer player, string command, string[] args)\n        {\n            if (!IsAdmin(player))\n                return;\n\n            AutoSpawnDungeon(player);\n        }\n\n        [ChatCommand(\"RemoveInactiveDungeons\")]\n        private void RemoveInactiveDungeonsCommand(BasePlayer player, string command, string[] args)\n        {\n            if (!IsAdmin(player))\n                return;\n\n            var removedDungeons = RemoveInactiveDungeons();\n            NotifyPlayerOnRemoval(player, removedDungeons);\n        }\n\n        [ChatCommand(\"RemoveAllDungeons\")]\n        private void RemoveAllDungeonsCommand(BasePlayer player, string command, string[] args)\n        {\n            if (!IsAdmin(player))\n                return;\n\n            var removedDungeons = RemoveAllDungeons();\n            NotifyPlayerOnRemoval(player, removedDungeons);\n        }\n\n        [ChatCommand(\"ForceRemoveAllDungeons\")]\n        private void ForceRemoveAllDungeonsCommand(BasePlayer player, string command, string[] args)\n        {\n            if (!IsAdmin(player))\n                return;\n\n            CleanupExistingEntities();\n            player.ChatMessage(\"All entities related to this plugin have been cleaned up.\");\n        }\n\n        #endregion\n\n        #region Dungeon Management\n\n        private void StartTimerAutoSpawnDungeons()\n        {\n            if (_configData.DungeonSpawn.EnableAutoSpawn)\n            {\n                _autoSpawnTimer = timer.Every(\n                    _configData.DungeonSpawn.AutoSpawnCycleInterval,\n                    () =>\n                    {\n                        AutoSpawnDungeon();\n                    }\n                );\n            }\n        }\n\n        private void StartTimerRemoveInactiveDungeons()\n        {\n            _dungeonCheckTimer = timer.Every(\n                60f,\n                () =>\n                {\n                    var removedDungeons = RemoveInactiveDungeons();\n                    if (removedDungeons.Count > 0)\n                    {\n                        foreach (var dungeon in removedDungeons)\n                        {\n                            LogDebug($\"Removed inactive dungeon of tier {dungeon.TierName} at grid {dungeon.Grid}.\");\n                        }\n                    }\n                }\n            );\n        }\n\n        private void StartTimerUpdateMarkers()\n        {\n            _updateMarkersTimer = timer.Every(30f, UpdateMarkers);\n        }\n\n        private void UpdateMarkers()\n        {\n            var mapMarkers = UnityEngine.Object.FindObjectsOfType<MapMarkerGenericRadius>();\n            foreach (var marker in mapMarkers.Where(marker => marker.IsValid()))\n            {\n                marker.SendUpdate();\n            }\n        }\n\n        private void AutoSpawnDungeon(BasePlayer player = null)\n        {\n            if (_dungeonData.ActiveDungeons.Count >= _configData.DungeonSpawn.MaxTotalActiveDungeons)\n            {\n                LogDebug(lang.GetMessage(\"MaxActiveDungeonsReached\", this));\n                player?.ChatMessage(Msg(player.UserIDString, \"MaxActiveDungeonsReached\"));\n            }\n            else if (TryFindDungeonSpawnPoint(out var position, out var rotation))\n            {\n                LogDebug(lang.GetMessage(\"AttemptSpawnDungeons\", this));\n                player?.ChatMessage(Msg(player.UserIDString, \"AttemptSpawnDungeons\"));\n                CreateDungeon(position, rotation, player);\n            }\n            else\n            {\n                LogDebug(lang.GetMessage(\"DungeonSpawnFailed\", this));\n                player?.ChatMessage(Msg(player.UserIDString, \"DungeonSpawnFailed\"));\n            }\n        }\n\n        private void CreateDungeon(Vector3 position, Quaternion rotation, BasePlayer player = null)\n        {\n            string prefabPath = GetRandomDungeonPrefab();\n            if (!ValidatePrefabPath(prefabPath))\n                return;\n\n            if (!(GameManager.server.CreateEntity(prefabPath, position, rotation) is BasePortal dungeonPortal))\n            {\n                LogDebug(\"Failed to create dungeon portal.\");\n                return;\n            }\n\n            var grid = PhoneController.PositionToGridCoord(position);\n\n            InitializeDungeonPortal(dungeonPortal, position, grid);\n\n            var proceduralDungeon = GetProceduralDungeon(dungeonPortal);\n            if (!ValidateProceduralDungeon(proceduralDungeon, dungeonPortal, grid))\n                return;\n\n            var selectedTier = GetDungeonTier(proceduralDungeon.spawnedCells.Count);\n            LogDebug($\"Selected dungeon tier: {selectedTier} at grid: {grid}.\");\n\n            var activeDungeon = RegisterActiveDungeon(dungeonPortal, proceduralDungeon, position, grid, selectedTier);\n\n            LogDebug($\"Creating dungeon with ID: {activeDungeon.PortalId} at grid {grid}.\");\n\n            ServerMgr.Instance.StartCoroutine(PopulateDungeonCoroutine(proceduralDungeon, activeDungeon, player));\n        }\n\n        private bool ValidatePrefabPath(string prefabPath)\n        {\n            if (!string.IsNullOrEmpty(prefabPath))\n                return true;\n\n            LogDebug(\"No prefab path available for dungeon spawning.\");\n            return false;\n        }\n\n        private void InitializeDungeonPortal(BasePortal dungeonPortal, Vector3 position, string grid)\n        {\n            dungeonPortal.OwnerID = OwnerID;\n            dungeonPortal.Spawn();\n            LogDebug($\"Trying to spawn Dungeon at grid: {grid}.\");\n        }\n\n        private bool ValidateProceduralDungeon(ProceduralDynamicDungeon proceduralDungeon, BasePortal dungeonPortal, string grid)\n        {\n            if (proceduralDungeon == null)\n            {\n                LogDebug($\"ProceduralDynamicDungeon not found, destroying the Dungeon at grid: {grid}.\");\n                dungeonPortal.Kill(BaseNetworkable.DestroyMode.None);\n                return false;\n            }\n\n            if (proceduralDungeon.spawnedCells.Count < 1)\n            {\n                LogDebug($\"No cells found, destroying the Dungeon at grid: {grid}.\");\n                dungeonPortal.Kill(BaseNetworkable.DestroyMode.None);\n                return false;\n            }\n\n            return true;\n        }\n\n        private ActiveDungeon RegisterActiveDungeon(BasePortal dungeonPortal, ProceduralDynamicDungeon proceduralDungeon, Vector3 position, string grid, DungeonTierConfig selectedTier)\n        {\n            var activeDungeon = new ActiveDungeon\n            {\n                PortalId = dungeonPortal.net.ID.Value,\n                DynamicDungeonId = proceduralDungeon.net.ID.Value,\n                Position = position,\n                Grid = grid,\n                TierName = _tierNameMap[selectedTier],\n                TierConfig = selectedTier,\n                EntityIds = new List<ulong>(),\n                Spawned = false,\n            };\n\n            _dungeonData.ActiveDungeons.Add(activeDungeon);\n\n            return activeDungeon;\n        }\n\n        private void LogDebug(string message)\n        {\n            if (_configData.EnableDebug)\n                Puts(message);\n        }\n\n        private IEnumerator PopulateDungeonCoroutine(ProceduralDynamicDungeon proceduralDungeon, ActiveDungeon activeDungeon, BasePlayer player = null)\n        {\n            yield return new WaitForSeconds(3f);\n\n            LogDebug($\"Starting to populate dungeon ID: {activeDungeon.PortalId}, Tier: {activeDungeon.TierName} at grid: {activeDungeon.Grid}.\");\n\n            RemoveOriginalEntities(proceduralDungeon);\n\n            var allSpawnEntries = GenerateSpawnEntries(activeDungeon.TierConfig);\n\n            LogDebug($\"Generated {allSpawnEntries.Count} spawn entries.\");\n\n            Dictionary<Vector3, List<string>> occupiedPositions = new Dictionary<Vector3, List<string>>();\n\n            bool validSpawnLocationsExist = true;\n\n            foreach (var entry in allSpawnEntries)\n            {\n                var validLocations = GetAvailableSpawnLocations(proceduralDungeon, entry.prefab.resourcePath);\n                if (validLocations.Count == 0)\n                {\n                    LogDebug($\"No valid spawn locations found for prefab: {entry.prefab.resourcePath}\");\n                    validSpawnLocationsExist = false;\n                    break;\n                }\n            }\n\n            if (!validSpawnLocationsExist)\n            {\n                player?.ChatMessage(\"No valid spawn locations available for some or all prefabs. Cancelling spawn.\");\n                LogDebug(\"No valid spawn locations available for some or all prefabs. Cancelling spawn.\");\n                yield break;\n            }\n\n            foreach (var entry in allSpawnEntries)\n            {\n                var validLocations = GetAvailableSpawnLocations(proceduralDungeon, entry.prefab.resourcePath);\n                string entityType =\n                    entry.prefab.resourcePath.Contains(\"autoturret\") ? \"AutoTurret\"\n                    : entry.prefab.resourcePath.Contains(\"woodenbox\") ? \"StorageContainer\"\n                    : entry.prefab.resourcePath.Contains(\"scientist\") ? \"NPC\"\n                    : \"Other\";\n\n                bool placed = false;\n\n                var freeLocations = validLocations.Where(loc => !occupiedPositions.ContainsKey(loc.Item1)).ToList();\n                var locationsToTry = freeLocations.Any() ? freeLocations : validLocations;\n\n                foreach (var (position, rotation) in locationsToTry)\n                {\n                    if (occupiedPositions.TryGetValue(position, out var existingTypes))\n                    {\n                        if (existingTypes.Contains(entityType))\n                        {\n                            LogDebug($\"Conflict: Cannot place another {entityType} at {position}. Trying another position...\");\n                            continue;\n                        }\n\n                        if ((entityType == \"AutoTurret\" && existingTypes.Contains(\"StorageContainer\")) || (entityType == \"StorageContainer\" && existingTypes.Contains(\"AutoTurret\")))\n                        {\n                            LogDebug($\"Conflict: Cannot place {entityType} at {position} because {string.Join(\", \", existingTypes)} already present. Trying another position...\");\n                            continue;\n                        }\n                    }\n\n                    var entity = GameManager.server.CreateEntity(entry.prefab.resourcePath, position, rotation);\n                    if (entity != null)\n                    {\n                        entity.OwnerID = OwnerID;\n                        entity.Spawn();\n                        InitializeEntity(entity, activeDungeon);\n\n                        if (!occupiedPositions.ContainsKey(position))\n                        {\n                            occupiedPositions[position] = new List<string>();\n                        }\n                        occupiedPositions[position].Add(entityType);\n\n                        yield return new WaitForSeconds(0.5f);\n\n                        if (entity.IsDestroyed || !entity.isSpawned)\n                        {\n                            LogDebug($\"Entity {entry.prefab.resourcePath} was destroyed after spawn at {position}.\");\n                        }\n                        else\n                        {\n                            LogDebug($\"Placed entity {entity.ShortPrefabName} at {position}.\");\n                        }\n\n                        placed = true;\n                        break;\n                    }\n                }\n\n                if (!placed)\n                {\n                    var (fallbackPosition, fallbackRotation) = validLocations[Random.Range(0, validLocations.Count)];\n                    LogDebug($\"Fallback: Placing {entityType} at {fallbackPosition} despite conflicts.\");\n\n                    var entity = GameManager.server.CreateEntity(entry.prefab.resourcePath, fallbackPosition, fallbackRotation);\n                    if (entity != null)\n                    {\n                        entity.OwnerID = OwnerID;\n                        entity.Spawn();\n                        InitializeEntity(entity, activeDungeon);\n\n                        if (!occupiedPositions.ContainsKey(fallbackPosition))\n                        {\n                            occupiedPositions[fallbackPosition] = new List<string>();\n                        }\n                        occupiedPositions[fallbackPosition].Add(entityType);\n\n                        yield return new WaitForSeconds(0.5f);\n\n                        if (entity.IsDestroyed || !entity.isSpawned)\n                        {\n                            LogDebug($\"Entity {entry.prefab.resourcePath} was destroyed after spawn at {fallbackPosition}.\");\n                        }\n                        else\n                        {\n                            LogDebug($\"Placed entity {entity.ShortPrefabName} at {fallbackPosition} as a fallback.\");\n                        }\n                    }\n                }\n            }\n\n            LogDebug($\"Finished placing entities. Total placed: {activeDungeon.EntityIds.Count}/{allSpawnEntries.Count}.\");\n\n            CreateDungeonMarkers(activeDungeon);\n            NotifyPlayersOfNewDungeon(activeDungeon);\n\n            LogDebug($\"Dungeon spawned successfully at grid: {activeDungeon.Grid}.\");\n\n            activeDungeon.Spawned = true;\n\n            player?.ChatMessage(Msg(player.UserIDString, \"DungeonSpawnedSuccess\", activeDungeon.Grid));\n        }\n\n        private List<(Vector3 Position, Quaternion Rotation)> GetAvailableSpawnLocations(ProceduralDynamicDungeon proceduralDungeon, string prefabPath)\n        {\n            GameObject prefab = GameManager.server.FindPrefab(prefabPath);\n            if (prefab == null)\n            {\n                Puts($\"Prefab not found: {prefabPath}\");\n                return new List<(Vector3, Quaternion)>();\n            }\n\n            BaseEntity prefabEntity = prefab.GetComponent<BaseEntity>();\n            if (prefabEntity == null)\n            {\n                Puts($\"Prefab does not have a BaseEntity: {prefabPath}\");\n                return new List<(Vector3, Quaternion)>();\n            }\n\n            return proceduralDungeon\n                .spawnedCells.Where(cell => cell != null)\n                .SelectMany(cell => cell.spawnGroups)\n                .Where(group => group != null)\n                .SelectMany(group => group.spawnPoints)\n                .Where(spawnPoint => spawnPoint != null && spawnPoint.IsAvailableTo(prefab))\n                .Select(spawnPoint =>\n                {\n                    spawnPoint.GetLocation(out var position, out var rotation);\n                    return (position, rotation);\n                })\n                .ToList();\n        }\n\n        private void InitializeEntity(BaseEntity entity, ActiveDungeon activeDungeon)\n        {\n            if (entity != null)\n            {\n                activeDungeon.EntityIds.Add(entity.net.ID.Value);\n\n                if (entity is NPCPlayer)\n                {\n                    activeDungeon.NpcIds.Add(entity.net.ID.Value);\n                }\n                else if (entity is AutoTurret turret)\n                {\n                    ConfigureTurret(turret, activeDungeon.TierConfig.AutoTurretConfig);\n                }\n                else if (entity is StorageContainer storage)\n                {\n                    ConfigureStorage(storage);\n                }\n            }\n        }\n\n        private void RemoveOriginalEntities(ProceduralDynamicDungeon proceduralDungeon)\n        {\n            foreach (var cell in proceduralDungeon.spawnedCells)\n            {\n                foreach (var group in cell.spawnGroups)\n                {\n                    for (int i = group.spawnInstances.Count - 1; i >= 0; i--)\n                    {\n                        SpawnPointInstance spawnPointInstance = group.spawnInstances[i];\n                        BaseEntity entity = spawnPointInstance?.gameObject?.ToBaseEntity();\n\n                        if (entity != null && !IsDungeonEntity(entity) && (entity is NPCDwelling || entity is ScarecrowNPC || entity is LootContainer))\n                        {\n                            LogDebug($\"Removing original entity: {entity.ShortPrefabName} at {entity.transform.position}\");\n\n                            entity.Kill();\n                        }\n                    }\n                }\n            }\n        }\n\n        private List<SpawnGroup.SpawnEntry> GenerateSpawnEntries(DungeonTierConfig tierConfig)\n        {\n            var allSpawnEntries = new List<SpawnGroup.SpawnEntry>();\n            AddNpcEntries(tierConfig, allSpawnEntries);\n            AddTurretEntries(tierConfig, allSpawnEntries);\n            AddLootEntries(tierConfig, allSpawnEntries);\n            return allSpawnEntries.OrderBy(_ => Random.value).ToList();\n        }\n\n        private void AddNpcEntries(DungeonTierConfig tierConfig, List<SpawnGroup.SpawnEntry> spawnEntries)\n        {\n            foreach (var config in tierConfig.NpcSpawnConfigs)\n            {\n                if (GameManifest.pathToGuid.TryGetValue(config.PrefabName, out var guid))\n                {\n                    spawnEntries.AddRange(\n                        Enumerable.Repeat(\n                            new SpawnGroup.SpawnEntry\n                            {\n                                prefab = new GameObjectRef { guid = guid },\n                                weight = 1,\n                                mobile = true,\n                            },\n                            config.Total\n                        )\n                    );\n                }\n            }\n        }\n\n        private void AddTurretEntries(DungeonTierConfig tierConfig, List<SpawnGroup.SpawnEntry> spawnEntries)\n        {\n            var prefabName = \"assets/prefabs/npc/autoturret/autoturret_deployed.prefab\";\n            if (GameManifest.pathToGuid.TryGetValue(prefabName, out var turretGuid))\n            {\n                spawnEntries.AddRange(\n                    Enumerable.Repeat(\n                        new SpawnGroup.SpawnEntry\n                        {\n                            prefab = new GameObjectRef { guid = turretGuid },\n                            weight = 1,\n                            mobile = false,\n                        },\n                        tierConfig.AutoTurretConfig.Total\n                    )\n                );\n            }\n        }\n\n        private void AddLootEntries(DungeonTierConfig tierConfig, List<SpawnGroup.SpawnEntry> spawnEntries)\n        {\n            var prefabName = \"assets/prefabs/deployable/woodenbox/woodbox_deployed.prefab\";\n            if (GameManifest.pathToGuid.TryGetValue(prefabName, out var boxGuid))\n            {\n                spawnEntries.AddRange(\n                    Enumerable.Repeat(\n                        new SpawnGroup.SpawnEntry\n                        {\n                            prefab = new GameObjectRef { guid = boxGuid },\n                            weight = 1,\n                            mobile = false,\n                        },\n                        tierConfig.TotalLootBoxes\n                    )\n                );\n            }\n        }\n\n        private void ConfigureTurret(AutoTurret turret, TurretConfig turretConfig)\n        {\n            turret.InitializeHealth(turretConfig.Health, turretConfig.Health);\n\n            var weapon = ItemManager.CreateByName(turretConfig.WeaponShortName);\n            weapon?.MoveToContainer(turret.inventory, 0);\n\n            var laserSight = ItemManager.CreateByName(\"weapon.mod.lasersight\");\n            laserSight?.MoveToContainer(weapon.contents);\n\n            turret.UpdateAttachedWeapon();\n            turret.gameObject.AddComponent<TurretMonoBehaviour>();\n        }\n\n        public class TurretMonoBehaviour : MonoBehaviour\n        {\n            private AutoTurret _turret;\n\n            private void Awake()\n            {\n                _turret = GetComponent<AutoTurret>();\n\n                _turret.SetPeacekeepermode(false);\n                _turret.InitiateStartup();\n                _turret.isLootable = false;\n                _turret.dropFloats = false;\n                _turret.dropsLoot = false;\n\n                InvokeRepeating(nameof(RefillAmmo), 2f, 30f);\n            }\n\n            private void RefillAmmo()\n            {\n                int maxReserveAmmo = 1000;\n\n                if (_turret.AttachedWeapon is not BaseProjectile baseProjectile || baseProjectile.primaryMagazine?.ammoType == null)\n                    return;\n\n                var ammoType = baseProjectile.primaryMagazine.ammoType;\n                int currentAmmoCount = _turret.inventory.itemList.Where(item => item.info == ammoType).Sum(item => item.amount);\n\n                if (currentAmmoCount < maxReserveAmmo)\n                {\n                    int ammoNeeded = maxReserveAmmo - currentAmmoCount;\n                    Item ammoItem = ItemManager.Create(ammoType, ammoNeeded);\n                    ammoItem?.MoveToContainer(_turret.inventory);\n\n                    _turret.UpdateTotalAmmo();\n                    _turret.EnsureReloaded();\n                    _turret.SendNetworkUpdateImmediate();\n                }\n            }\n\n            private void OnDestroy()\n            {\n                CancelInvoke(nameof(RefillAmmo));\n            }\n        }\n\n        private void ConfigureStorage(StorageContainer storage)\n        {\n            storage.skinID = _configData.LootBoxConfig.SmallWoodBoxSkinID;\n            AddCodeLock(storage);\n            PopulateStorage(storage.inventory, _configData.LootBoxConfig.LootItems);\n        }\n\n        private void AddCodeLock(StorageContainer storage)\n        {\n            var prefabName = \"assets/prefabs/locks/keypad/lock.code.prefab\";\n            var codeLock = GameManager.server.CreateEntity(prefabName) as CodeLock;\n            if (codeLock == null)\n                return;\n\n            codeLock.SetParent(storage, storage.GetSlotAnchorName(BaseEntity.Slot.Lock));\n            codeLock.Spawn();\n            codeLock.code = Random.Range(1000, 9999).ToString();\n            codeLock.hasCode = true;\n            codeLock.SetFlag(BaseEntity.Flags.Locked, true);\n        }\n\n        private void PopulateStorage(ItemContainer container, List<ItemConfig> lootItems)\n        {\n            var shuffledItems = lootItems.OrderBy(_ => Random.value).ToList();\n            var differentItemsCount = 0;\n\n            foreach (var itemConfig in shuffledItems)\n            {\n                if (differentItemsCount >= _configData.LootBoxConfig.MaxDifferentItemsPerBox)\n                {\n                    break;\n                }\n\n                if (Random.value * 100f <= itemConfig.InclusionChancePercentage)\n                {\n                    var itemDefinition = ItemManager.FindItemDefinition(itemConfig.ShortName);\n                    if (itemDefinition != null)\n                    {\n                        var amount = Random.Range(itemConfig.MinimumAmount, itemConfig.MaximumAmount + 1);\n                        if (container.itemList.Count < container.capacity)\n                        {\n                            var item = ItemManager.Create(itemDefinition, amount);\n                            item.MoveToContainer(container);\n                            differentItemsCount++;\n                        }\n                    }\n                }\n            }\n        }\n\n        private List<ActiveDungeon> RemoveInactiveDungeons()\n        {\n            var removedDungeons = new List<ActiveDungeon>();\n\n            foreach (var dungeon in _dungeonData.ActiveDungeons.ToList())\n            {\n                if (CanBeRemoved(dungeon))\n                {\n                    removedDungeons.Add(dungeon);\n                    DestroyDungeon(dungeon);\n                }\n            }\n\n            SaveData();\n\n            return removedDungeons;\n        }\n\n        private void DestroyDungeon(ActiveDungeon dungeon)\n        {\n            var dungeonEntity = BaseNetworkable.serverEntities.Find(new NetworkableId(dungeon.PortalId)) as HalloweenDungeon;\n            if (dungeonEntity != null)\n            {\n                dungeonEntity?.Kill(BaseNetworkable.DestroyMode.None);\n            }\n\n            var proceduralDynamicDungeon = BaseNetworkable.serverEntities.Find(new NetworkableId(dungeon.DynamicDungeonId)) as ProceduralDynamicDungeon;\n            if (proceduralDynamicDungeon != null)\n            {\n                RemoveLootableCorpse(proceduralDynamicDungeon);\n                RemoveItemDrop(proceduralDynamicDungeon);\n                RemoveDroppedItemContainer(proceduralDynamicDungeon);\n            }\n\n            DestroyEntities(dungeon);\n            RemoveDungeonMarkers(dungeon);\n            _dungeonData.ActiveDungeons.Remove(dungeon);\n        }\n\n        private void RemoveDroppedItemContainer(ProceduralDynamicDungeon dungeon)\n        {\n            List<DroppedItemContainer> obj = Pool.Get<List<DroppedItemContainer>>();\n            Vis.Entities(dungeon.transform.position, 80f, obj);\n            foreach (DroppedItemContainer item in obj)\n            {\n                if (item.IsValid() && !item.IsDestroyed)\n                {\n                    item?.Kill();\n                }\n            }\n\n            Pool.FreeUnmanaged(ref obj);\n        }\n\n        private void RemoveItemDrop(ProceduralDynamicDungeon dungeon)\n        {\n            List<DroppedItem> obj = Pool.Get<List<DroppedItem>>();\n            Vis.Entities(dungeon.transform.position, 80f, obj);\n            foreach (DroppedItem item in obj)\n            {\n                if (item.IsValid() && !item.IsDestroyed)\n                {\n                    item?.Kill();\n                }\n            }\n\n            Pool.FreeUnmanaged(ref obj);\n        }\n\n        private void RemoveLootableCorpse(ProceduralDynamicDungeon dungeon)\n        {\n            List<LootableCorpse> obj = Pool.Get<List<LootableCorpse>>();\n            Vis.Entities(dungeon.transform.position, 80f, obj);\n            foreach (LootableCorpse item in obj)\n            {\n                if (item.IsValid() && !item.IsDestroyed)\n                {\n                    item?.Kill();\n                }\n            }\n\n            Pool.FreeUnmanaged(ref obj);\n        }\n\n        private void DestroyEntities(ActiveDungeon dungeon)\n        {\n            foreach (var entityId in dungeon.EntityIds)\n            {\n                var entity = BaseNetworkable.serverEntities.Find(new NetworkableId(entityId)) as BaseEntity;\n                entity?.Kill(BaseNetworkable.DestroyMode.None);\n            }\n\n            dungeon.EntityIds.Clear();\n        }\n\n        private void RemoveDungeonMarkers(ActiveDungeon dungeon)\n        {\n            foreach (var marker in _dungeonData.ActiveDungeonMarkers.Where(m => m.Position == dungeon.Position).ToList())\n            {\n                var vendingMarker = BaseNetworkable.serverEntities.Find(new NetworkableId(marker.VendingMarker)) as BaseEntity;\n                var radiusMarker = BaseNetworkable.serverEntities.Find(new NetworkableId(marker.RadiusMarker)) as BaseEntity;\n\n                vendingMarker?.Kill(BaseNetworkable.DestroyMode.None);\n                radiusMarker?.Kill(BaseNetworkable.DestroyMode.None);\n\n                _dungeonData.ActiveDungeonMarkers.Remove(marker);\n            }\n        }\n\n        private IEnumerable<ActiveDungeon> RemoveAllDungeons()\n        {\n            var removedDungeons = new List<ActiveDungeon>(_dungeonData.ActiveDungeons);\n            foreach (var dungeon in removedDungeons)\n            {\n                DestroyDungeon(dungeon);\n            }\n            _dungeonData = new DungeonData();\n            SaveData();\n            return removedDungeons;\n        }\n\n        #endregion\n\n        #region Utility Methods\n\n        private ProceduralDynamicDungeon GetProceduralDungeon(BasePortal dungeonPortal)\n        {\n            return (dungeonPortal as XmasDungeon)?.dungeonInstance.Get(true) ?? (dungeonPortal as HalloweenDungeon)?.dungeonInstance.Get(true);\n        }\n\n        private void CleanupExistingEntities()\n        {\n            foreach (\n                var entityType in new Type[]\n                {\n                    typeof(VendingMachineMapMarker),\n                    typeof(MapMarkerGenericRadius),\n                    typeof(BasePortal),\n                    typeof(ProceduralDynamicDungeon),\n                    typeof(AutoTurret),\n                    typeof(NPCPlayer),\n                    typeof(StorageContainer),\n                }\n            )\n            {\n                foreach (var obj in UnityEngine.Object.FindObjectsOfType(entityType))\n                {\n                    if (obj is BaseEntity baseEntity && baseEntity.OwnerID == OwnerID)\n                    {\n                        baseEntity.Kill(BaseNetworkable.DestroyMode.None);\n                    }\n                }\n            }\n\n            _dungeonData = new DungeonData();\n        }\n\n        private void InitializeTierNameMap()\n        {\n            _tierNameMap = new Dictionary<DungeonTierConfig, string>\n            {\n                { _configData.Tiers.Easy, \"Easy\" },\n                { _configData.Tiers.Normal, \"Normal\" },\n                { _configData.Tiers.Medium, \"Medium\" },\n                { _configData.Tiers.Hard, \"Hard\" },\n                { _configData.Tiers.Nightmare, \"Nightmare\" },\n            };\n        }\n\n        private void LoadData()\n        {\n            _dataFile = Interface.Oxide.DataFileSystem.GetFile(\"Dungeons_Data\");\n            _dungeonData = _dataFile.ReadObject<DungeonData>() ?? new DungeonData();\n        }\n\n        private void SaveData()\n        {\n            _dataFile.WriteObject(_dungeonData);\n        }\n\n        private static bool IsPlayer(BasePlayer targetPlayer) => targetPlayer != null && targetPlayer.userID.IsSteamId();\n\n        private void NotifyPlayersOfNewDungeon(ActiveDungeon activeDungeon)\n        {\n            foreach (var player in BasePlayer.activePlayerList)\n            {\n                var message = Msg(player.UserIDString, \"DungeonAppeared\", activeDungeon.TierName, activeDungeon.Grid);\n                player.ChatMessage(message);\n                player.ShowToast(GameTip.Styles.Blue_Normal, message);\n            }\n        }\n\n        private void NotifyPlayerOnRemoval(BasePlayer player, IEnumerable<ActiveDungeon> removedDungeons)\n        {\n            if (!removedDungeons.Any())\n            {\n                player.ChatMessage(Msg(player.UserIDString, \"NoInactiveDungeonsToRemove\"));\n                return;\n            }\n\n            foreach (var dungeon in removedDungeons)\n            {\n                player.ChatMessage(Msg(player.UserIDString, \"DungeonRemovedDetail\", dungeon.TierName, dungeon.Grid));\n            }\n        }\n\n        private bool IsAdmin(BasePlayer player) => player != null && player.IsAdmin;\n\n        private bool IsDungeonEntity(BaseEntity entity) => entity != null && _dungeonData.ActiveDungeons.Any(d => d.EntityIds.Contains(entity.net.ID.Value));\n\n        private string GetRandomDungeonPrefab()\n        {\n            var prefabs = new List<string>();\n            if (_configData.DungeonSpawn.EnableXmasDungeon)\n                prefabs.Add(\"assets/prefabs/missions/portal/xmasportalentry.prefab\");\n            if (_configData.DungeonSpawn.EnableHalloweenDungeon)\n                prefabs.Add(\"assets/prefabs/missions/portal/halloweenportalentry.prefab\");\n            return prefabs.Count > 0 ? prefabs[Random.Range(0, prefabs.Count)] : null;\n        }\n\n        private static bool IsValidPosition(Vector3 position, out Vector3 suitablePosition, out Quaternion suitableRotation)\n        {\n            suitablePosition = Vector3.zero;\n            suitableRotation = Quaternion.identity;\n\n            if (!LocationCheck.GetTerrainInfo(position, out var hitInfo))\n                return false;\n            if (LocationCheck.InsideRock(position, 10f))\n                return false;\n            if (LocationCheck.InWater(position))\n                return false;\n            if (LocationCheck.OnRoadOrRail(position))\n                return false;\n            if (LocationCheck.InNoBuildZone(position, 10f))\n                return false;\n\n            return SetSuitablePositionAndRotation(position, hitInfo, out suitablePosition, out suitableRotation);\n        }\n\n        private static bool SetSuitablePositionAndRotation(Vector3 position, RaycastHit hitInfo, out Vector3 suitablePosition, out Quaternion suitableRotation)\n        {\n            suitablePosition = hitInfo.point;\n            suitableRotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);\n            return true;\n        }\n\n        private void CreateDungeonMarkers(ActiveDungeon activeDungeon)\n        {\n            var prefabVendingMarker = \"assets/prefabs/deployable/vendingmachine/vending_mapmarker.prefab\";\n            var vendingMarker = CreateMapMarker<VendingMachineMapMarker>(prefabVendingMarker, activeDungeon.Position);\n            vendingMarker.OwnerID = OwnerID;\n            vendingMarker.markerShopName = $\"Dungeon: {activeDungeon.TierName}\";\n            vendingMarker.SendNetworkUpdate();\n\n            var prefabRadiusMarker = \"assets/prefabs/tools/map/genericradiusmarker.prefab\";\n            var radiusMarker = CreateMapMarker<MapMarkerGenericRadius>(prefabRadiusMarker, activeDungeon.Position);\n            radiusMarker.OwnerID = OwnerID;\n            radiusMarker.alpha = 0.75f;\n            radiusMarker.radius = 0.5f;\n            radiusMarker.color2 = GetMarkerColorByTier(activeDungeon.TierName);\n            radiusMarker.SendUpdate();\n            radiusMarker.SendNetworkUpdate();\n\n            _dungeonData.ActiveDungeonMarkers.Add(\n                new DungeonMarker\n                {\n                    VendingMarker = vendingMarker.net.ID.Value,\n                    RadiusMarker = radiusMarker.net.ID.Value,\n                    Position = activeDungeon.Position,\n                    Tier = activeDungeon.TierName,\n                }\n            );\n        }\n\n        private T CreateMapMarker<T>(string prefab, Vector3 position)\n            where T : BaseEntity\n        {\n            var entity = GameManager.server.CreateEntity(prefab, position) as T;\n            entity?.Spawn();\n            return entity;\n        }\n\n        private static Color GetMarkerColorByTier(string tierName)\n        {\n            return tierName switch\n            {\n                \"Easy\" => Color.green,\n                \"Normal\" or \"Medium\" => Color.yellow,\n                \"Hard\" => Color.red,\n                \"Nightmare\" => Color.black,\n                _ => Color.white,\n            };\n        }\n\n        private bool CanBeRemoved(ActiveDungeon dungeon)\n        {\n            return AreAllNpcsGone(dungeon) && NoPlayersInside(dungeon) && dungeon.Spawned;\n        }\n\n        private bool AreAllNpcsGone(ActiveDungeon dungeon)\n        {\n            return dungeon.NpcIds.All(npcId =>\n            {\n                var npc = BaseNetworkable.serverEntities.Find(new NetworkableId(npcId)) as BaseEntity;\n                return npc == null || npc.IsDestroyed;\n            });\n        }\n\n        private bool NoPlayersInside(ActiveDungeon dungeon)\n        {\n            var dynamicDungeon = BaseNetworkable.serverEntities.Find(new NetworkableId(dungeon.DynamicDungeonId)) as ProceduralDynamicDungeon;\n            return dynamicDungeon == null || !dynamicDungeon.ContainsAnyPlayers();\n        }\n\n        private bool TryFindDungeonSpawnPoint(out Vector3 position, out Quaternion rotation)\n        {\n            var mapSize = World.Size;\n            for (var attempt = 0; attempt < 1000; attempt++)\n            {\n                var candidatePosition = new Vector3(Random.Range(-mapSize / 2, mapSize / 2), 0, Random.Range(-mapSize / 2, mapSize / 2));\n\n                if (IsValidPosition(candidatePosition, out position, out rotation) && IsSafeFromOtherDungeons(position) && !IsCloseToMonuments(position))\n                {\n                    return true;\n                }\n            }\n\n            position = Vector3.zero;\n            rotation = Quaternion.identity;\n            return false;\n        }\n\n        private bool IsSafeFromOtherDungeons(Vector3 position)\n        {\n            return _dungeonData.ActiveDungeons.All(dungeon => Vector3.Distance(position, dungeon.Position) >= _configData.DungeonSpawn.MinDistanceBetweenDungeons);\n        }\n\n        private bool IsCloseToMonuments(Vector3 position)\n        {\n            return TerrainMeta.Path.Monuments.Any(mon => Vector3.Distance(position, mon.transform.position) < _configData.DungeonSpawn.MinDistanceFromMonuments);\n        }\n\n        private DungeonTierConfig GetDungeonTier(int cellCount)\n        {\n            return cellCount switch\n            {\n                < 5 => _configData.Tiers.Easy,\n                < 8 => _configData.Tiers.Normal,\n                < 12 => _configData.Tiers.Medium,\n                < 16 => _configData.Tiers.Hard,\n                _ => _configData.Tiers.Nightmare,\n            };\n        }\n\n        #endregion\n\n        #region Configuration\n\n        private class ConfigData\n        {\n            [JsonProperty(PropertyName = \"Dungeon Spawn Settings\")]\n            public DungeonSpawnSettings DungeonSpawn { get; set; } = new DungeonSpawnSettings();\n\n            [JsonProperty(PropertyName = \"Tiers\")]\n            public DungeonTiers Tiers { get; set; } = new DungeonTiers();\n\n            [JsonProperty(PropertyName = \"Loot Box Config\")]\n            public LootBoxConfig LootBoxConfig { get; set; } = new LootBoxConfig();\n\n            [JsonProperty(\"Enable Debug\")]\n            public bool EnableDebug { get; set; } = true;\n\n            [JsonProperty(PropertyName = \"Version\")]\n            public VersionNumber Version { get; set; }\n        }\n\n        private class DungeonTiers\n        {\n            [JsonProperty(PropertyName = \"Easy\")]\n            public DungeonTierConfig Easy { get; set; } =\n                new DungeonTierConfig\n                {\n                    TotalLootBoxes = 1,\n                    NpcSpawnConfigs = new List<NpcSpawnConfig>\n                    {\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 1 },\n                    },\n                    AutoTurretConfig = new TurretConfig\n                    {\n                        Total = 1,\n                        Health = 300,\n                        WeaponShortName = \"pistol.revolver\",\n                    },\n                };\n\n            [JsonProperty(PropertyName = \"Normal\")]\n            public DungeonTierConfig Normal { get; set; } =\n                new DungeonTierConfig\n                {\n                    TotalLootBoxes = 2,\n                    NpcSpawnConfigs = new List<NpcSpawnConfig>\n                    {\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 3 },\n                    },\n                    AutoTurretConfig = new TurretConfig\n                    {\n                        Total = 2,\n                        Health = 600,\n                        WeaponShortName = \"smg.2\",\n                    },\n                };\n\n            [JsonProperty(PropertyName = \"Medium\")]\n            public DungeonTierConfig Medium { get; set; } =\n                new DungeonTierConfig\n                {\n                    TotalLootBoxes = 4,\n                    NpcSpawnConfigs = new List<NpcSpawnConfig>\n                    {\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 4 },\n                    },\n                    AutoTurretConfig = new TurretConfig\n                    {\n                        Total = 3,\n                        Health = 1000,\n                        WeaponShortName = \"smg.mp5\",\n                    },\n                };\n\n            [JsonProperty(PropertyName = \"Hard\")]\n            public DungeonTierConfig Hard { get; set; } =\n                new DungeonTierConfig\n                {\n                    TotalLootBoxes = 5,\n                    NpcSpawnConfigs = new List<NpcSpawnConfig>\n                    {\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 4 },\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 3 },\n                    },\n                    AutoTurretConfig = new TurretConfig\n                    {\n                        Total = 4,\n                        Health = 1500,\n                        WeaponShortName = \"rifle.ak\",\n                    },\n                };\n\n            [JsonProperty(PropertyName = \"Nightmare\")]\n            public DungeonTierConfig Nightmare { get; set; } =\n                new DungeonTierConfig\n                {\n                    TotalLootBoxes = 6,\n                    NpcSpawnConfigs = new List<NpcSpawnConfig>\n                    {\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 5 },\n                        new NpcSpawnConfig { PrefabName = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab\", Total = 5 },\n                    },\n                    AutoTurretConfig = new TurretConfig\n                    {\n                        Total = 6,\n                        Health = 2000,\n                        WeaponShortName = \"rifle.ak\",\n                    },\n                };\n        }\n\n        private class DungeonTierConfig\n        {\n            [JsonProperty(PropertyName = \"Maximum Loot Boxes\")]\n            public int TotalLootBoxes { get; set; }\n\n            [JsonProperty(PropertyName = \"NPC Spawn Configs\", ObjectCreationHandling = ObjectCreationHandling.Replace)]\n            public List<NpcSpawnConfig> NpcSpawnConfigs { get; set; }\n\n            [JsonProperty(PropertyName = \"Auto Turret Config\")]\n            public TurretConfig AutoTurretConfig { get; set; } = new TurretConfig();\n        }\n\n        public class LootBoxConfig\n        {\n            [JsonProperty(PropertyName = \"Small Wood Box Skin ID\")]\n            public ulong SmallWoodBoxSkinID { get; set; } = 2998755525;\n\n            [JsonProperty(PropertyName = \"Max Different Items Per Box\")]\n            public int MaxDifferentItemsPerBox { get; set; } = 6;\n\n            [JsonProperty(PropertyName = \"Loot Items\", ObjectCreationHandling = ObjectCreationHandling.Replace)]\n            public List<ItemConfig> LootItems { get; set; } =\n                new List<ItemConfig>\n                {\n                    new ItemConfig\n                    {\n                        ShortName = \"ammo.rifle\",\n                        InclusionChancePercentage = 15,\n                        MinimumAmount = 100,\n                        MaximumAmount = 300,\n                    },\n                };\n        }\n\n        private class NpcSpawnConfig\n        {\n            [JsonProperty(PropertyName = \"Prefab\")]\n            public string PrefabName { get; set; }\n\n            [JsonProperty(PropertyName = \"Maximum\")]\n            public int Total { get; set; }\n        }\n\n        private class TurretConfig\n        {\n            [JsonProperty(PropertyName = \"Maximum\")]\n            public int Total { get; set; } = 3;\n\n            [JsonProperty(PropertyName = \"Health\")]\n            public float Health { get; set; } = 1000f;\n\n            [JsonProperty(PropertyName = \"Weapon Short Name\")]\n            public string WeaponShortName { get; set; } = \"rifle.ak\";\n        }\n\n        private class DungeonSpawnSettings\n        {\n            [JsonProperty(PropertyName = \"Enable Auto Spawn\")]\n            public bool EnableAutoSpawn { get; set; } = true;\n\n            [JsonProperty(PropertyName = \"Auto Spawn Cycle Interval\")]\n            public float AutoSpawnCycleInterval { get; set; } = 60f;\n\n            [JsonProperty(PropertyName = \"Enable Xmas Dungeon\")]\n            public bool EnableXmasDungeon { get; set; } = true;\n\n            [JsonProperty(PropertyName = \"Enable Halloween Dungeon\")]\n            public bool EnableHalloweenDungeon { get; set; } = true;\n\n            [JsonProperty(PropertyName = \"Max Total Active Dungeons\")]\n            public int MaxTotalActiveDungeons { get; set; } = 4;\n\n            [JsonProperty(PropertyName = \"Min Distance From Monuments\")]\n            public float MinDistanceFromMonuments { get; set; } = 100f;\n\n            [JsonProperty(PropertyName = \"Min Distance Between Dungeons\")]\n            public float MinDistanceBetweenDungeons { get; set; } = 100f;\n        }\n\n        public class ItemConfig\n        {\n            [JsonProperty(PropertyName = \"ShortName\")]\n            public string ShortName { get; set; }\n\n            [JsonProperty(PropertyName = \"Inclusion Chance Percentage\")]\n            public float InclusionChancePercentage { get; set; }\n\n            [JsonProperty(PropertyName = \"Minimum Amount\")]\n            public int MinimumAmount { get; set; }\n\n            [JsonProperty(PropertyName = \"Maximum Amount\")]\n            public int MaximumAmount { get; set; }\n        }\n\n        protected override void LoadConfig()\n        {\n            base.LoadConfig();\n            try\n            {\n                _configData = Config.ReadObject<ConfigData>() ?? new ConfigData();\n            }\n            catch (Exception ex)\n            {\n                PrintError($\"The configuration file is corrupt: {ex}\");\n                LoadDefaultConfig();\n            }\n            SaveConfig();\n        }\n\n        protected override void LoadDefaultConfig()\n        {\n            PrintWarning(\"Creating a new configuration file.\");\n            _configData = new ConfigData { Version = Version };\n        }\n\n        protected override void SaveConfig()\n        {\n            Config.WriteObject(_configData, true);\n        }\n\n        #endregion\n\n        #region Localization\n\n        protected override void LoadDefaultMessages()\n        {\n            lang.RegisterMessages(\n                new Dictionary<string, string>\n                {\n                    [\"NoInactiveDungeonsToRemove\"] = \"There are no inactive dungeons to remove.\",\n                    [\"NoDungeonsToRemove\"] = \"There are no dungeons to remove.\",\n                    [\"DungeonRemovedDetail\"] = \"Removed dungeon of tier {0} at grid {1}.\",\n                    [\"AttemptSpawnDungeons\"] = \"Attempting to spawn dungeons.\",\n                    [\"DungeonAppeared\"] = \"A {0} Dungeon has appeared at grid {1}!\",\n                    [\"DungeonSpawnFailed\"] = \"Could not find a valid location to spawn a new dungeon.\",\n                    [\"DungeonSpawnedSuccess\"] = \"Dungeon spawned successfully at grid {0}!\",\n                    [\"MaxActiveDungeonsReached\"] = \"Cannot spawn: Maximum number of active dungeons reached.\",\n                },\n                this\n            );\n        }\n\n        private string Msg(string userId, string key, params object[] args)\n        {\n            return string.Format(lang.GetMessage(key, this, userId), args);\n        }\n\n        #endregion\n\n        #region Data Classes\n\n        private class DungeonData\n        {\n            public List<ActiveDungeon> ActiveDungeons { get; set; } = new List<ActiveDungeon>();\n            public List<DungeonMarker> ActiveDungeonMarkers { get; set; } = new List<DungeonMarker>();\n        }\n\n        private class ActiveDungeon\n        {\n            public ulong PortalId { get; set; }\n            public ulong DynamicDungeonId { get; set; }\n            public Vector3 Position { get; set; }\n            public string Grid { get; set; }\n            public string TierName { get; set; }\n            public DungeonTierConfig TierConfig { get; set; }\n            public List<ulong> EntityIds { get; set; } = new List<ulong>();\n            public List<ulong> NpcIds { get; set; } = new List<ulong>();\n            public bool Spawned { get; set; } = false;\n        }\n\n        private class DungeonMarker\n        {\n            public ulong VendingMarker { get; set; }\n            public ulong RadiusMarker { get; set; }\n            public Vector3 Position { get; set; }\n            public string Tier { get; set; }\n        }\n\n        #endregion\n\n        #region Collider Checks\n\n        public static class LocationCheck\n        {\n            public static bool InsideRock(Vector3 position, float radius)\n            {\n                List<Collider> colliders = Pool.GetList<Collider>();\n\n                Vis.Colliders(position, radius, colliders, Layers.Mask.World, QueryTriggerInteraction.Ignore);\n\n                bool isInsideRock = colliders.Any(collider =>\n                    collider.name.Contains(\"rock\", StringComparison.OrdinalIgnoreCase)\n                    || collider.name.Contains(\"cliff\", StringComparison.OrdinalIgnoreCase)\n                    || collider.name.Contains(\"formation\", StringComparison.OrdinalIgnoreCase)\n                );\n\n                Pool.FreeList(ref colliders);\n                return isInsideRock;\n            }\n\n            public static bool GetTerrainInfo(Vector3 position, out RaycastHit hitInfo)\n            {\n                return Physics.Linecast(position + Vector3.up, position - Vector3.up, out hitInfo, Layers.Mask.Terrain);\n            }\n\n            public static bool InWater(Vector3 position) => WaterLevel.Test(position, false, false);\n\n            public static bool OnRoadOrRail(Vector3 position) => (TerrainMeta.TopologyMap.GetTopology(position) & (int)TerrainTopology.Enum.Road) != 0;\n\n            public static bool InNoBuildZone(Vector3 position, float radius) => Physics.CheckSphere(position, radius, Layers.Mask.Prevent_Building, QueryTriggerInteraction.Ignore);\n        }\n\n        #endregion\n    }\n}\n"},{"assistant_initiates":false,"asst_text":"```json\n{\n  \"excerpt\": \"Experience risk-free entertainment with our Free Test IPTV For 14 Days, starting from 23/11/2024.\",\n  \"introduction\": \"Discover endless entertainment with our Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free. Enjoy the best streaming content available without any obligations.\",\n  \"head1\": \"14-Day IPTV Trial\",\n  \"body\": \"<div style='font-family: Arial, sans-serif; line-height: 1.6; color: #333; padding: 20px; border: 1px solid #ccc; border-radius: 8px; background-color: #f9f9f9;'>\"+\n  \"<p>Embark on an unparalleled streaming experience with our <b style='text-decoration: underline;'>Free Test IPTV For 14 Days</b> - starting from 23/11/2024 risk-free. This exceptional offer allows you to explore premium content from the renowned IPTV provider <b style='text-decoration: underline;'>PROTV</b> without any financial risk, letting you test the platform's capabilities to meet your entertainment needs.</p>\"+\n\n  \"<h3 style='color: #007bff;'>Why Choose PROTV?</h3>\"+ \n  \"<p>With <b style='text-decoration: underline;'>PROTV</b>, you gain access to a staggering array of 5,599 live streaming TV channels, encompassing various categories like UK NEWS, UK GENERAL, and sports PPV events. The diversity of programming ensures there is something for everyone, allowing you to enjoy your favorite shows, movies, and sporting events all in one place.</p>\"+\n\n  \"<h4 style='color: #007bff;'>Key Features of the PROTV IPTV Subscription:</h4>\"+\n  \"<p><ul>\"+\n  \"<li>Comprehensive programming across <i>28266 VOD directories</i> including genres such as EN DRAMA, <i>NL VIDEOLAND</i>, and <i>NETFLIX</i> selections.</li>\"+\n  \"<li>Exclusive access to UK sporting events through channels like <i>UK SKY SPORTS RED BUTTON</i>, <i>UK UFC/BOXING PPV</i>, and more.</li>\"+\n  \"<li>High-definition streaming quality ensuring an immersive viewing experience.</li>\"+\n  \"<li>Access to special events including <i>UK PDC BOARD PPV</i> and <i>NL HBO MAX PPV</i>.</li>\"+\n  \"<li>Easy setup and user-friendly interface for a seamless streaming experience.</li>\"+\n  \"</ul></p>\"+\n\n  \"<p>Our IPTV subscriptions will expire on <b>08/12/2024</b>, so make sure to take advantage of this offer while it lasts! By signing up for the <b style='text-decoration: underline;'>Free Test IPTV For 14 Days</b>, you can explore the extensive library and streaming options PROTV offers without paying a dime.</p>\"+\n  \n  \"<p style='font-weight: bold; text-align: center;'>Don't miss out on this opportunity! Use the discount code <b style='text-decoration: underline;'>IPTV20SAVE</b> at checkout for 20% off when purchasing our premium membership at <a href='https://Iptv2live.com/premium-membership' style='color: #007bff;'>https://Iptv2live.com/premium-membership</a> and unlock all premium IPTV subscriptions simultaneously.</p>\"+\n  \"<p style='font-weight: bold; text-align: center;'>Join our Pinterest Page <a href='https://www.pinterest.com/IPTV_SMARTERS' style='color: #007bff;'>https://www.pinterest.com/IPTV_SMARTERS</a> to get the latest trial IPTV codes and updates!</p>\"+\n  \"</div>\"\n}\n```","behavior":"degenerate_repetition","conversation_hash":"b2e648e062989b82c2bc85119a2fd19e","conversation_redacted":false,"conversation_toxic":false,"country":"Australia","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4o-mini-2024-07-18","n_chars":7853,"n_turns_in_conversation":1,"n_words":1109,"source_row_offset":42686,"source_shard":"turns-00053.parquet","timestamp":"Sat, 23 Nov 2024 17:17:51 GMT","turn_id":"ac52afbef62ec24f6db9c124","turn_index":0,"user_text":"Context: making a product page in Iptv2live.com website! that sell IPTV subscriptions from differents IPTV Platforms.\nTask: Write a compelling product description for an IPTV offer with title: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free,  using best SEO practices for 2024. Follow the structure outlined below and ensure the description is optimized for search engines to help it rank highly on Google. The output must be in the following JSON format:\n{\n  \"excerpt\": \"A concise summary mentioning the main keywords of the post title: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\",\n  \"introduction\": \"Introduction (1-2 sentences): Provide a brief introduction to the product, highlighting its main benefit and mentioning the keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\",\n  \"head1\": \"Shorten my title:'Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free' using semantic keywords\".\n  \"body\": \"5 paragraphs <p></p>\"\n}\nStructure:\nexcerpt: A concise summary mentioning the main keywords of the post title: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\nintroduction: Provide a brief introduction to the product, highlighting its main benefit and mentioning the keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\nhead1: Shorten my title:'Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free' to 3 words max using semantic keywords.\nbody:\nensure to make the output in 5 paragraphs <p></p> with one h3 and one h4 that includes concise Description of the Key Features of  the IPTV subscription from the famous IPTV provider platform named: <b>PROTV</b>. which Includes: 5599 live streaming TV categories, like: UK NEWS, UK GENERAL, BE DOCUMENTAIRE, UK LIGUE 1 PPV, UK PDC BOARD PPV, All, UK NOW SPORT \u1d34\u1d30, BE BELGIUM DAZN EXCLUSIVE \u1d3f\u1d2c\u1d42, NL HBO MAX PPV, NL FEYENOORD ONE PPV, UK ENTERTAINMENT HEVC, USA, UK DOCUMENTARY, UK NATIONAL LEAGUE, UK ESPN PPV, UK ENTERTAINMENT, UK WORLD SPORTS, UK UFC/BOXING PPV, NL ODIDO VERMAAK \u1d34\u1d30 \u1d33\u1d3c\u1d38\u1d30, UK SKY SPORTS RED BUTTON,  and 28266 VOD Directories, VOD exemple: EN 4K MAFIA & GANGSTER, EN SCHOOLING KIDS, EN WAR, EN DRAMA, NL OVERIGE, NETFLIX KIDS, EN GANGSTER & MAFIA, NL VIDEOLAND, EN RATED R, NL NETFLIX, , IPTV subscription Expire on : 08/12/2024.\nSEO Tips:\nExplain the product in detail, focusing on its benefits, the IPTV provider platform name: PROTV, usability, and the available streaming content. Include the keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free, naturally and use LSI/NLP related keywords to the post title.\nEnsure to include in the end of the body the first Call to Action NATURALLY in 1 paragraph, Encourage potential customers to take action, by using the discount code IPTV20SAVE at checkout for 20% off when purchasing our premium membership at https://Iptv2live.com/premium-membership and unlock all premium IPTV subscriptions simultaneously..\nEnsure to include after the end of the body the Second Call to Action NATURALLY in 1 paragraph, Encourage visitors to take action, by joining our Pintrest Page https://www.pinterest.com/IPTV_SMARTERS to get the latest trial IPTV codes.\nIncorporate the primary keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free, and related keywords naturally throughout the excerpt, introduction and body.\nUse HTML tags for better formatting and readability, such as <div>, <b>, <i>, <ul>, <li><table>, and <p> in body.\nEnsure the use of a modern and stylish HTML design in the body display by using inline style = '', \nHighlight the body into a stylish and modern <div>, \nClearly Mention and Highlight the platform name: PROTV with stylish text decoration using inline style.\nHighlight the platform name: IPTV20SAVE at checkout for 20% off with stylish text decoration using inline style.\nHighlight the first CTA: by using the discount code IPTV20SAVE at checkout for 20% off when purchasing our premium membership at https://Iptv2live.com/premium-membership and unlock all premium IPTV subscriptions simultaneously. with a proper anchor texts into a new line centered HTML button tag. \nHighlight the second CTA: by joining our Pintrest Page https://www.pinterest.com/IPTV_SMARTERS to get the latest trial IPTV codes with a proper anchor text into a new line centered HTML button tag. \nAvoid keyword stuffing; focus on creating valuable, informative content for the reader.\nMake sure the product description is engaging, informative, and optimized for search engines while providing value to the reader.\nMake sure to never mention the word \"Call to Action\" in your response.\nFinally make sure that the output overall pass all AI test detection by using Humanized  and natural Text writing style."},{"assistant_initiates":false,"asst_text":"```json\n{\n  \"excerpt\": \"Experience a risk-free 14-day trial of our premium IPTV service, starting from 23/11/2024, with access to thousands of live streaming channels and VOD directories.\",\n  \"introduction\": \"Discover unparalleled entertainment with our <b>Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free</b>. This exclusive offer allows you to explore a vast selection of live channels and on-demand content without any financial risk.\",\n  \"head1\": \"Free 14-Day IPTV Trial\",\n  \"body\": \"<div style='font-family: Arial, sans-serif; line-height: 1.6; padding: 15px; background-color: #f9f9f9; border-radius: 5px;'>\\n  <h3 style='color: #333;'>Why Choose Our IPTV Service?</h3>\\n  <p style='color: #555;'>With our <b style='text-decoration: underline;'>PROTV</b> subscription, enjoy a rich diversity of entertainment options. Our IPTV platform is designed to cater to every viewer's tastes with over 5599 live streaming categories and an extensive VOD library. Experience everything from UK national sports to blockbuster movies in stunning HD quality.</p>\\n  <h4 style='color: #333;'>Key Features of PROTV IPTV Subscription</h4>\\n  <p style='color: #555;'>Our IPTV offerings include: \\n  <ul>\\n    <li>UK NEWS, UK GENERAL, BE DOCUMENTAIRE</li>\\n    <li>UK LIGUE 1 PPV, UK PDC BOARD PPV</li>\\n    <li>UK ENTERTAINMENT HEVC, USA, UK DOCUMENTARY</li>\\n    <li>UK WORLD SPORTS, UK UFC/BOXING PPV</li>\\n    <li>28266 VOD Directories including EN 4K MAFIA & GANGSTER</li>\\n  </ul>\\n  More categories include exclusive content like NL HBO MAX, Netflix Kids, and a selection of critically acclaimed films to cater to all preferences.</p>\\n  <p style='color: #555;'>Your <b style='text-decoration: underline;'>Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free</b> trial ends on 08/12/2024. This is the perfect opportunity to experience <b style='text-decoration: underline;'>PROTV</b> without any financial commitment. Examine our user-friendly interface that guarantees seamless navigation to your favorite programs.</p>\\n  <p style='color: #555;'>Join our platform and witness why IPTV is the future of entertainment. Offering remarkable picture quality, extensive channel options, and a diverse selection of VOD content, you will find something to enjoy for everyone in the family!</p>\\n  <p style='color: #555;'>Unlock even more benefits by using the discount code <b style='text-decoration: underline;'>IPTV20SAVE</b> at checkout for 20% off when purchasing our premium membership at <a href='https://Iptv2live.com/premium-membership' style='color: #007BFF; text-decoration: none;'>https://Iptv2live.com/premium-membership</a> and unlock all premium IPTV subscriptions simultaneously.</p>\\n  <div style='text-align: center;'>\\n    <a href='https://Iptv2live.com/premium-membership' style='display: inline-block; padding: 10px 20px; background-color: #28a745; color: white; text-decoration: none; border-radius: 5px;'>Get Premium Membership Now!</a>\\n  </div>\\n  <p style='color: #555;'>Stay updated with the latest offers by following us on Pinterest. Join us at <a href='https://www.pinterest.com/IPTV_SMARTERS' style='color: #007BFF; text-decoration: none;'>https://www.pinterest.com/IPTV_SMARTERS</a> to get the latest trial IPTV codes and never miss out on a great deal!</p>\\n  <div style='text-align: center;'>\\n    <a href='https://www.pinterest.com/IPTV_SMARTERS' style='display: inline-block; padding: 10px 20px; background-color: #007BFF; color: white; text-decoration: none; border-radius: 5px;'>Follow Us on Pinterest</a>\\n  </div>\\n</div>\"\n}\n```","behavior":"degenerate_repetition","conversation_hash":"b32f0747897e9b11e517ee5eb65cf448","conversation_redacted":false,"conversation_toxic":false,"country":"South Korea","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4o-mini-2024-07-18","n_chars":8341,"n_turns_in_conversation":1,"n_words":1162,"source_row_offset":42687,"source_shard":"turns-00053.parquet","timestamp":"Sat, 23 Nov 2024 17:18:11 GMT","turn_id":"7d08001644a3d16133c18791","turn_index":0,"user_text":"Context: making a product page in Iptv2live.com website! that sell IPTV subscriptions from differents IPTV Platforms.\nTask: Write a compelling product description for an IPTV offer with title: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free,  using best SEO practices for 2024. Follow the structure outlined below and ensure the description is optimized for search engines to help it rank highly on Google. The output must be in the following JSON format:\n{\n  \"excerpt\": \"A concise summary mentioning the main keywords of the post title: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\",\n  \"introduction\": \"Introduction (1-2 sentences): Provide a brief introduction to the product, highlighting its main benefit and mentioning the keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\",\n  \"head1\": \"Shorten my title:'Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free' using semantic keywords\".\n  \"body\": \"5 paragraphs <p></p>\"\n}\nStructure:\nexcerpt: A concise summary mentioning the main keywords of the post title: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\nintroduction: Provide a brief introduction to the product, highlighting its main benefit and mentioning the keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free.\nhead1: Shorten my title:'Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free' to 3 words max using semantic keywords.\nbody:\nensure to make the output in 5 paragraphs <p></p> with one h3 and one h4 that includes concise Description of the Key Features of  the IPTV subscription from the famous IPTV provider platform named: <b>PROTV</b>. which Includes: 5599 live streaming TV categories, like: UK NEWS, UK GENERAL, BE DOCUMENTAIRE, UK LIGUE 1 PPV, UK PDC BOARD PPV, All, UK NOW SPORT \u1d34\u1d30, BE BELGIUM DAZN EXCLUSIVE \u1d3f\u1d2c\u1d42, NL HBO MAX PPV, NL FEYENOORD ONE PPV, UK ENTERTAINMENT HEVC, USA, UK DOCUMENTARY, UK NATIONAL LEAGUE, UK ESPN PPV, UK ENTERTAINMENT, UK WORLD SPORTS, UK UFC/BOXING PPV, NL ODIDO VERMAAK \u1d34\u1d30 \u1d33\u1d3c\u1d38\u1d30, UK SKY SPORTS RED BUTTON,  and 28266 VOD Directories, VOD exemple: EN 4K MAFIA & GANGSTER, EN SCHOOLING KIDS, EN WAR, EN DRAMA, NL OVERIGE, NETFLIX KIDS, EN GANGSTER & MAFIA, NL VIDEOLAND, EN RATED R, NL NETFLIX, , IPTV subscription Expire on : 08/12/2024.\nSEO Tips:\nExplain the product in detail, focusing on its benefits, the IPTV provider platform name: PROTV, usability, and the available streaming content. Include the keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free, naturally and use LSI/NLP related keywords to the post title.\nEnsure to include in the end of the body the first Call to Action NATURALLY in 1 paragraph, Encourage potential customers to take action, by using the discount code IPTV20SAVE at checkout for 20% off when purchasing our premium membership at https://Iptv2live.com/premium-membership and unlock all premium IPTV subscriptions simultaneously..\nEnsure to include after the end of the body the Second Call to Action NATURALLY in 1 paragraph, Encourage visitors to take action, by joining our Pintrest Page https://www.pinterest.com/IPTV_SMARTERS to get the latest trial IPTV codes.\nIncorporate the primary keyword: Free Test IPTV For 14 Days - starting from 23/11/2024 risk-free, and related keywords naturally throughout the excerpt, introduction and body.\nUse HTML tags for better formatting and readability, such as <div>, <b>, <i>, <ul>, <li><table>, and <p> in body.\nEnsure the use of a modern and stylish HTML design in the body display by using inline style = '', \nHighlight the body into a stylish and modern <div>, \nClearly Mention and Highlight the platform name: PROTV with stylish text decoration using inline style.\nHighlight the platform name: IPTV20SAVE at checkout for 20% off with stylish text decoration using inline style.\nHighlight the first CTA: by using the discount code IPTV20SAVE at checkout for 20% off when purchasing our premium membership at https://Iptv2live.com/premium-membership and unlock all premium IPTV subscriptions simultaneously. with a proper anchor texts into a new line centered HTML button tag. \nHighlight the second CTA: by joining our Pintrest Page https://www.pinterest.com/IPTV_SMARTERS to get the latest trial IPTV codes with a proper anchor text into a new line centered HTML button tag. \nAvoid keyword stuffing; focus on creating valuable, informative content for the reader.\nMake sure the product description is engaging, informative, and optimized for search engines while providing value to the reader.\nMake sure to never mention the word \"Call to Action\" in your response.\nFinally make sure that the output overall pass all AI test detection by using Humanized  and natural Text writing style."}],"shard":{"index":53,"name":"turns-00053.parquet","rows":69386}}
