code: def make_vjp(fun, x):
      start_node = VJPNode.new_root()
      end_value, end_node = trace(start_node, fun, x)
      if end_node is None:
  
          def vjp(g):
              return vspace(x).zeros()
  
      else:
  
          def vjp(g):
              return backward_pass(g, end_node)
  
      return vjp, end_value
  
imports: from itertools import count
  from functools import reduce
  from .tracer import trace, primitive, toposort, Node, Box, isbox, getval
  from .util import func, subval
  import warnings
label_desc: Use image node_id 1 for calling a global function with example usage: make_vjp(fun, x) and returns: vjp,  end_value, vspace, backward_pass