code: def identify_triggers(
      cfg,
      sources,
      sinks,
      lattice,
      nosec_lines
  ):
      
      assignment_nodes = filter_cfg_nodes(cfg, AssignmentNode)
      tainted_nodes = filter_cfg_nodes(cfg, TaintedNode)
      tainted_trigger_nodes = [
          TriggerNode(
              Source('Framework function URL parameter'),
              cfg_node=node
          ) for node in tainted_nodes
      ]
      sources_in_file = find_triggers(assignment_nodes, sources, nosec_lines)
      sources_in_file.extend(tainted_trigger_nodes)
  
      find_secondary_sources(assignment_nodes, sources_in_file, lattice)
  
      sinks_in_file = find_triggers(cfg.nodes, sinks, nosec_lines)
  
      sanitiser_node_dict = build_sanitiser_node_dict(cfg, sinks_in_file)
  
      return Triggers(sources_in_file, sinks_in_file, sanitiser_node_dict)
docs: Identify sources, sinks and sanitisers in a CFG.
  
      Args:
          cfg(CFG): CFG to find sources, sinks and sanitisers in.
          sources(tuple): list of sources, a source is a (source, sanitiser) tuple.
          sinks(tuple): list of sources, a sink is a (sink, sanitiser) tuple.
          nosec_lines(set): lines with # nosec whitelisting
  
      Returns:
          Triggers tuple with sink and source nodes and a sanitiser node dict.