from typing import List
import numpy as np
from axelrod.action import Action
from axelrod.interaction_utils import compute_final_score
from axelrod.player import Player
from axelrod.strategies.finite_state_machines import FSMPlayer
IIIllIllIIlllllIll, lllIIlIlllI = Action.C, Action.D
class IIllIIlIllllll(Player):
    lllIlIlIIIlIlll = "strategy"
    IllllIIlIIlIIlIIIl = {
        "memory_depth": float("inf"),
        "stochastic": False,
        "long_run_time": False,
        "inspects_source": False,
        "manipulates_source": False,
        "manipulates_state": False,
    }
    def __init__(IlIIIllIIIlIl):
        super().__init__()
        IlIIIllIIIlIl.IIlllIIIIlllIllIII, IlIIIllIIIlIl.lllllIllllIIlll = 0, 0
        IlIIIllIIIlIl.lIllIIIllI = 0
        IlIIIllIIIlIl.IlIlIIIIllII = 0
        IlIIIllIIIlIl.lIIllllIIIllIIlIII = False
        IlIIIllIIIlIl.lIlIlllIIlIIlllIIII = "Normal"
    def lIIIllIlllIIllIl(IlIIIllIIIlIl, IlllllIlllll):
        if IlllllIlllll == IIIllIllIIlllllIll:
            return IIIllIllIIlllllIll
        if IlIIIllIIIlIl.lIIllllIIIllIIlIII:
            IlIIIllIIIlIl.lIIllllIIIllIIlIII = False
            return IIIllIllIIlllllIll
        return lllIIlIlllI
    def lIlIllIllI(IlIIIllIIIlIl, IlllIlllIllIIII: Player) -> Action:
        llIIlIll = len(IlIIIllIIIlIl.history) + 1
        if llIIlIll == 1:
            return IIIllIllIIlllllIll
        if llIIlIll >= 3:
            if IlllIlllIllIIII.history[-1] == IIIllIllIIlllllIll:
                if IlIIIllIIIlIl.history[-2] == IIIllIllIIlllllIll:
                    IlIIIllIIIlIl.lllllIllllIIlll += 1
                else:
                    IlIIIllIIIlIl.IIlllIIIIlllIllIII += 1
        if llIIlIll > 2 and llIIlIll % 25 == 2:
            IlIlllIlIIlI = False
            if IlIIIllIIIlIl.lIlIlllIIlIIlllIIII == "Defect":
                IlIlllIlIIlI = True
            IlIIIllIIIlIl.lIlIlllIIlIIlllIIII = "Normal"
            IIIIlIIlIlIIl = IlIIIllIIIlIl.IIlllIIIIlllIllIII + IlIIIllIIIlIl.lllllIllllIIlll
            if IIIIlIIlIlIIl < 3:
                IlIIIllIIIlIl.lIlIlllIIlIIlllIIII = "Defect"
            if (8 <= IIIIlIIlIlIIl <= 17) and IlIIIllIIIlIl.lllllIllllIIlll / IIIIlIIlIlIIl < 0.7:
                IlIIIllIIIlIl.lIlIlllIIlIIlllIIII = "Defect"
            IlIIIllIIIlIl.IIlllIIIIlllIllIII, IlIIIllIIIlIl.lllllIllllIIlll = 0, 0
            if IlIIIllIIIlIl.lIlIlllIIlIIlllIIII == "Defect":
                IlIIIllIIIlIl.lIllIIIllI = 0
                IlIIIllIIIlIl.IlIlIIIIllII = 0
                IlIIIllIIIlIl.lIIllllIIIllIIlIII = False
            if IlIIIllIIIlIl.lIlIlllIIlIIlllIIII == "Normal" and IlIlllIlIIlI:
                return lllIIlIlllI
        if IlIIIllIIIlIl.lIlIlllIIlIIlllIIII == "Defect":
            return lllIIlIlllI
        else:
            assert IlIIIllIIIlIl.lIlIlllIIlIIlllIIII == "Normal"
            if IlIIIllIIIlIl.history[-1] == lllIIlIlllI and IlllIlllIllIIII.history[-1] == lllIIlIlllI:
                IlIIIllIIIlIl.lIllIIIllI += 1
            else:
                IlIIIllIIIlIl.lIllIIIllI = 0
            if IlIIIllIIIlIl.lIllIIIllI >= 3:
                IlIIIllIIIlIl.lIllIIIllI = 0
                IlIIIllIIIlIl.IlIlIIIIllII = 0  
                return IlIIIllIIIlIl.lIIIllIlllIIllIl(IIIllIllIIlllllIll)
            IIllllllIIIllI, llIlIIlIIIIIl = IIIllIllIIlllllIll, IIIllIllIIlllllIll
            if llIIlIll >= 3:
                IIllllllIIIllI = IlIIIllIIIlIl.history[-2]
                llIlIIlIIIIIl = IlllIlllIllIIII.history[-2]
            if (
                IlIIIllIIIlIl.history[-1] != IlllIlllIllIIII.history[-1]
                and IlIIIllIIIlIl.history[-1] == llIlIIlIIIIIl
                and IlllIlllIllIIII.history[-1] == IIllllllIIIllI
            ):
                IlIIIllIIIlIl.IlIlIIIIllII += 1
            else:
                IlIIIllIIIlIl.IlIlIIIIllII = 0
            if IlIIIllIIIlIl.IlIlIIIIllII >= 3:
                IlIIIllIIIlIl.lIllIIIllI = 0  
                IlIIIllIIIlIl.IlIlIIIIllII = 0
                IlIIIllIIIlIl.lIIllllIIIllIIlIII = True
            return IlIIIllIIIlIl.lIIIllIlllIIllIl(IlllIlllIllIIII.history[-1])