code: def make_context(headers: Headers) -> Optional[TraceContext]:
      
      # TODO: add validation for trace_id/span_id/parent_id
  
      # normalize header names just in case someone passed regular dict
      # instead dict with case insensitive keys
      headers = {k.lower(): v for k, v in headers.items()}
  
      required = (TRACE_ID_HEADER.lower(), SPAN_ID_HEADER.lower())
      has_b3 = all(h in headers for h in required)
      has_b3_single = SINGLE_HEADER in headers
  
      if not(has_b3_single or has_b3):
          return None
  
      if has_b3:
          debug = parse_debug_header(headers)
          sampled = debug if debug else parse_sampled_header(headers)
          context = TraceContext(
              trace_id=headers[TRACE_ID_HEADER.lower()],
              parent_id=headers.get(PARENT_ID_HEADER.lower()),
              span_id=headers[SPAN_ID_HEADER.lower()],
              sampled=sampled,
              debug=debug,
              shared=False,
          )
          return context
      return _parse_single_header(headers)
docs: Converts available headers to TraceContext, if headers mapping does
      not contain zipkin headers, function returns None.