## Код:
```
MODULE PrivOdometer;

IMPORT Log;

CONST
   arrayRank = 6;
   maxTestValue = 999999; (* arrayRank девяток, для теста *)
VAR
   indices, upperBound, lowerBound: ARRAY arrayRank OF INTEGER;
   completed: BOOLEAN;

   PROCEDURE IncArray;
   VAR dim: INTEGER;
   BEGIN
      dim := arrayRank - 1;
      INC(indices[dim]);
      WHILE (dim > 0) & (indices[dim] > upperBound[dim]) DO
         DEC(dim);
         INC(indices[dim])
      END;
      IF (dim = 0) & (indices[dim] > upperBound[dim]) THEN
         completed := TRUE
      ELSE
         INC(dim);
         WHILE dim < arrayRank DO
            indices[dim] := lowerBound[dim];
            INC(dim)
         END
      END
   END IncArray;

   PROCEDURE LogIndices;
   VAR i: INTEGER;
   BEGIN
      FOR i := 0 TO arrayRank - 1 DO
         Log.Char(CHR(ORD('0') + indices[i]));
      END;
   END LogIndices;

   PROCEDURE DoTest (value: INTEGER; log: BOOLEAN);
   VAR i, v: INTEGER;
   BEGIN
      ASSERT(value >= 0, 20);
      ASSERT(~completed, 21);
      v := value;
      (* 'v' to 'indices' *)
      FOR i := arrayRank - 1 TO 0 BY -1 DO
         indices[i] := v MOD 10;
         v := v DIV 10;
      END;
      IF log THEN
         LogIndices;
         Log.String(" + 1 = ");
      END;
      IncArray;
      IF log THEN
         LogIndices;
         Log.Ln;
      END;
      (* 'indices' to 'v' *)
      v := 0;
      FOR i := 0 TO arrayRank - 1 DO
         v := 10 * v + indices[i];
      END;
      ASSERT((v = value + 1) OR (value = maxTestValue) & completed, 60);
   END DoTest;

   PROCEDURE Test*;
   VAR i: INTEGER;
   BEGIN
      completed := FALSE;
      FOR i := 0 TO arrayRank - 1 DO
         upperBound[i] := 9;
         lowerBound[i] := 0;
      END;
      FOR i := 0 TO maxTestValue DO
         DoTest (i, FALSE)
      END;
   END Test;

END ^Q PrivOdometer.Test
```
