docs: def get_target(cls, path, index, chain=None):
          """
          Calculate the target difficulty at a particular difficulty interval (index).
          Return (bits, target) on success
          """
          if chain is None:
              chain = []  # Do not use mutables as default values!
  
          max_target = 0x00000000FFFF0000000000000000000000000000000000000000000000000000
          if index == 0:
              return 0x1d00ffff, max_target
  
          first = SPVClient.read_header( path, (index-1)*BLOCK_DIFFICULTY_CHUNK_SIZE)
          last = SPVClient.read_header( path, index*BLOCK_DIFFICULTY_CHUNK_SIZE - 1, allow_none=True)
          if last is None:
              for h in chain:
                  if h.get('block_height') == index*BLOCK_DIFFICULTY_CHUNK_SIZE - 1:
                      last = h
  
          nActualTimespan = last.get('timestamp') - first.get('timestamp')
          nTargetTimespan = BLOCK_DIFFICULTY_INTERVAL
          nActualTimespan = max(nActualTimespan, nTargetTimespan/4)
          nActualTimespan = min(nActualTimespan, nTargetTimespan*4)
  
          bits = last.get('bits')
          # convert to bignum
          MM = 256*256*256
          a = bits%MM
          if a < 0x8000:
              a *= 256
          target = (a) * pow(2, 8 * (bits/MM - 3))
  
          # new target
          new_target = min( max_target, (target * nActualTimespan)/nTargetTimespan )
  
          # convert it to bits
          c = ("%064X"%new_target)[2:]
          i = 31
          while c[0:2]=="00":
              c = c[2:]
              i -= 1
  
          c = int('0x'+c[0:6],16)
          if c >= 0x800000:
              c /= 256
              i += 1
  
          new_bits = c + MM * i
          return new_bits, new_target