docs: function (state, move) {
              var point = this,
                plotX = point.plotX,
                plotY = point.plotY,
                series = point.series,
                stateOptions = series.options.states,
                markerOptions = defaultPlotOptions[series.type].marker && series.options.marker,
                normalDisabled = markerOptions && !markerOptions.enabled,
                markerStateOptions = markerOptions && markerOptions.states[state],
                stateDisabled = markerStateOptions && markerStateOptions.enabled === false,
                stateMarkerGraphic = series.stateMarkerGraphic,
                pointMarker = point.marker || {},
                chart = series.chart,
                radius,
                halo = series.halo,
                haloOptions,
                newSymbol,
                pointAttr;
  
              state = state || NORMAL_STATE; // empty string
              pointAttr = point.pointAttr[state] || series.pointAttr[state];
  
              if (
                // already has this state
              (state === point.state && !move) ||
                  // selected points don't respond to hover
              (point.selected && state !== SELECT_STATE) ||
                  // series' state options is disabled
              (stateOptions[state] && stateOptions[state].enabled === false) ||
                  // general point marker's state options is disabled
              (state && (stateDisabled || (normalDisabled && markerStateOptions.enabled === false))) ||
                  // individual point marker's state options is disabled
              (state && pointMarker.states && pointMarker.states[state] && pointMarker.states[state].enabled === false) // #1610
  
              ) {
                  return;
              }
  
              // apply hover styles to the existing point
              if (point.graphic) {
                  radius = markerOptions && point.graphic.symbolName && pointAttr.r;
                  point.graphic.attr(merge(
                    pointAttr,
                    radius ? { // new symbol attributes (#507, #612)
                        x: plotX - radius,
                        y: plotY - radius,
                        width: 2 * radius,
                        height: 2 * radius
                    } : {}
                  ));
  
                  // Zooming in from a range with no markers to a range with markers
                  if (stateMarkerGraphic) {
                      stateMarkerGraphic.hide();
                  }
              } else {
                  // if a graphic is not applied to each point in the normal state, create a shared
                  // graphic for the hover state
                  if (state && markerStateOptions) {
                      radius = markerStateOptions.radius;
                      newSymbol = pointMarker.symbol || series.symbol;
  
                      // If the point has another symbol than the previous one, throw away the
                      // state marker graphic and force a new one (#1459)
                      if (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {
                          stateMarkerGraphic = stateMarkerGraphic.destroy();
                      }
  
                      // Add a new state marker graphic
                      if (!stateMarkerGraphic) {
                          if (newSymbol) {
                              series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(
                                newSymbol,
                                  plotX - radius,
                                  plotY - radius,
                                  2 * radius,
                                  2 * radius
                                )
                                .attr(pointAttr)
                                .add(series.markerGroup);
                              stateMarkerGraphic.currentSymbol = newSymbol;
                          }
  
                          // Move the existing graphic
                      } else {
                          stateMarkerGraphic[move ? 'animate' : 'attr']({ // #1054
                              x: plotX - radius,
                              y: plotY - radius
                          });
                      }
                  }
  
                  if (stateMarkerGraphic) {
                      stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY, chart.inverted) ? 'show' : 'hide'](); // #2450
                  }
              }
  
              // Show me your halo
              haloOptions = stateOptions[state] && stateOptions[state].halo;
              if (haloOptions && haloOptions.size) {
                  if (!halo) {
                      series.halo = halo = chart.renderer.path()
                        .add(series.seriesGroup);
                  }
                  halo.attr(extend({
                      fill: Color(point.color || series.color).setOpacity(haloOptions.opacity).get()
                  }, haloOptions.attributes))[move ? 'animate' : 'attr']({
                      d: point.haloPath(haloOptions.size)
                  });
              } else if (halo) {
                  halo.attr({ d: [] });
              }
  
              point.state = state;
          }