code: function (id) {
    var b = id.s
      , r = id.r
      , g = id.m
      , p = this.p;
  
    // cases where progression stops for winners
    var isFinalSe = (this.last === WB && r === p)
      , isFinalDe = (this.last === LB && b === LB && r === 2*p)
      , isBronze = (this.last === WB && b === LB)
      , isShortLbGf = (b === LB && r === 2*p - 1 && !this.isLong);
  
    if (isFinalSe || isFinalDe || isBronze || isShortLbGf) {
      return null;
    }
  
    // special case of WB winner moving to LB GF G1
    if (this.last >= LB && b === WB && r === p) {
      return [gId(LB, 2*p - 1, 1), 0];
    }
  
    // for LB positioning
    var ghalf = (b === LB && $.odd(r)) ? g : Math.floor((g + 1) / 2);
  
    var pos;
    if (b === WB) {
      pos = (g + 1) % 2; // normal WB progression
    }
    // LB progression
    else if (r >= 2*p - 2) {
      pos = (r + 1) % 2; // LB final winner -> bottom & GF(1) underdog winner -> top
    }
    else if (r === 1) {
      // unless downMix, LBR1 winners move inversely to normal progression
      pos = this.downMix ? 1 : g % 2;
    }
    else {
      // winner from LB always bottom in odd rounds, otherwise normal progression
      pos = $.odd(r) ? 1 : (g + 1) % 2;
    }
  
    // normal progression
    return [gId(b, r + 1, ghalf), pos];
  }
docs: ------------------------------------------------------------------ progression helpers - assume instance context ------------------------------------------------------------------ find the match and position a winner should move "right" to in the current bracket