anchor.diff:  
       whens.forEach((k, v) {
         if (['zero', 'one', 'two', 'few', 'many', 'other'].contains(k)) {
  -        this.whensOffset[new Symbol(k.toString())] = v;
  +        this.categoryRules[new Symbol(k.toString())] = v;
         } else {
  -        this.whens[k.toString()] = v;
  +        this.discreteRules[k.toString()] = v;
         }
       });
     }
  
positive.code:     offset = attributes['offset'] == null ? 0 : int.parse(attributes['offset']);
  
      element.attributes.keys.where((k) => IS_WHEN.hasMatch(k)).forEach((k) {
        var rule = k.replaceFirst('when-', '').replaceFirst('minus-', '-');
        whens[rule] = element.attributes[k];
      });
  
      if (whens['other'] == null) {
  
negative.code:     String stringValue = value.toString();
      int intValue = value is double ? value.round() : value;
  
      if (discreteRules[stringValue] != null) {
        _setAndWatch(discreteRules[stringValue]);
      } else {
        intValue -= offset;
        var exp = Function.apply(Intl.plural, [intValue], categoryRules);
        if (exp != null) {
          exp = exp.replaceAll(r'{}', (value - offset).toString());
          _setAndWatch(exp);
  