docs: function elementProperty(index, propName, value, sanitizer) {
      if (value === NO_CHANGE)
          return;
      var node = loadElement(index);
      var tNode = node.tNode;
      // if tNode.inputs is undefined, a listener has created outputs, but inputs haven't
      // yet been checked
      if (tNode && tNode.inputs === undefined) {
          // mark inputs as checked
          tNode.inputs = generatePropertyAliases(node.tNode.flags, 0 /* Input */);
      }
      var inputData = tNode && tNode.inputs;
      var dataValue;
      if (inputData && (dataValue = inputData[propName])) {
          setInputsForProperty(dataValue, value);
          markDirtyIfOnPush(node);
      }
      else {
          // It is assumed that the sanitizer is only added when the compiler determines that the property
          // is risky, so sanitization can be done without further checks.
          value = sanitizer != null ? sanitizer(value) : value;
          var native = node.native;
          ngDevMode && ngDevMode.rendererSetProperty++;
          isProceduralRenderer(renderer) ? renderer.setProperty(native, propName, value) :
              (native.setProperty ? native.setProperty(propName, value) :
                  native[propName] = value);
      }
  }