{ lib, ... } @ args:

with builtins; with lib; rec {
  games = (import ./2-1.nix args).games;

  getMaxRGB = { maxRGB ? { red = 0; green = 0; blue = 0; }, rgbs }: if length rgbs == 0 then
    maxRGB
  else getMaxRGB {
    maxRGB = mapAttrs (name: max (head rgbs).${name} or 0) maxRGB;
    rgbs = tail rgbs;
  };

  makeOneIfZero = number: if number == 0 then 1 else number;

  getPower = rgb: foldl' (accum: next: accum * makeOneIfZero next) 1 (attrValues rgb);

  gamesMaxRGBs = map (game: getMaxRGB { rgbs = game.snd; }) games;

  gamesPowers = map getPower gamesMaxRGBs;

  result = foldl' add 0 gamesPowers;
}
