def solve()

in geneve/solver/type_ip.py [0:0]


    def solve(self, left_attempts, environment):
        value = self.value
        history_addrs = self.get_history(environment)
        exclude_addrs = self.exclude_addrs | set(history_addrs)
        while left_attempts and (
            value in (None, [])
            or set(value if self.is_array else [value]) & exclude_addrs  # noqa: W503
            or match_nets(value, self.exclude_nets)
        ):  # noqa: W503
            if self.include_nets:
                net = random.choice(self.include_nets)
                v = net[random.randrange(net.num_addresses)]
            else:
                bits = 128 if random.choice(self.ip_versions) == 6 else 32
                v = ipaddress.ip_address(random.randrange(1, 2**bits))
            value = [v] if self.is_array else v
            left_attempts -= 1
        value = [v.compressed for v in value] if self.is_array else value.compressed
        return {"value": value, "left_attempts": left_attempts}