Oddities of Sudoku Explainer

Programs which generate, solve, and analyze Sudoku puzzles

Postby Pat » Wed Apr 22, 2009 1:36 pm

ronk wrote:I think the 'naked' is due to there being no candidates other than the unplaced single ... and the 'hidden' because there are other candidates. These 'other candidates' are a product of pencilmarking.

yes, that's probably what angusj meant when he coined those terms
User avatar
Pat
 
Posts: 4056
Joined: 18 July 2005

Postby 999_Springs » Sun May 03, 2009 3:28 pm

Here's another "oddity":
Code: Select all
#2 from the top1465

7.8|...|3..
...|2.1|...
5..|...|...
---+---+---
.4.|...|.26
3..|.8.|...
...|1..|.9.
---+---+---
.9.|6..|..4
...|.7.|5..
...|...|...

Put it into SE and click "solve step" until you get to "Contradiction Forcing Chain: R6C6.5 off". This step is rated 9.5. Now click "Get next hint". The "next" hint is rated lower than the main hint - it's only 9.3.
999_Springs
 
Posts: 591
Joined: 27 January 2007
Location: In the toilet, flushing down springs, one by one.

Re: Oddities of Sudoku Explainer

Postby ronk » Thu Aug 26, 2010 6:45 pm

Under the name of Bidirectional Y-Cycle, Sudoku Explainer makes mostly the standard exclusions of a continuous loop, but also makes some eliminations based on a sub-chain of the continuous loop, i.e., a discontinuous loop. The only example I've seen so far is below. Posting of other such examples would be helpful.

Code: Select all
An ER=6.8 puzzle from the Patterns Game:
..........98..7..6.54..3..2....1..4....5..9...16..9..8....9.3.....7...8..21..6..4

After singles, locked candidates and pairs:
 1      367   237   |  69    24-5  45    |  8     3579  59
c23     9     8     |  1    b25    7     |  4     35    6
 67     5     4     |  69    8     3     |  1     79    2
--------------------+--------------------+-------------------
 59     378   59    | f23    1     28    |  6     4     37
 2478-3 3478  237   |  5     6     48    |  9     1     37
d34     1     6     | e34    7     9     |  5     2     8
--------------------+--------------------+-------------------
 478    478   57    | g24    9     125-4 |  3     6     15
 6-34   346   359   |  7    a45    15-4  |  2     8     159
 59     2     1     |  8     3     6     |  7     59    4

In nice loop notation:
 a        b        c        d        e        f        g
r8c5 -5- r2c5 -2- r2c1 -3- r6c1 -4- r6c4 -3- r4c4 -2- r7c4 -4- r8c5 - continuous loop  =>  r58c1<>3, r78c6<>4, r1c5<>5

          a        b        c        d
r8c1 -4- r8c5 -5- r2c5 -2- r2c1 -3- r6c1 -4-r8c1 => r8c1<>4

In AIC notation:
(4=5)r8c5 - (5=2)r2c5 - (2=3)r2c1 - (3=4)r6c1 - (4=3)r6c4 - (3=2)r4c4 - (2=4)r7c4 - loop  =>  r58c1<>3, r78c6<>4, r1c5<>5

(4=5)r8c5 - (5=2)r2c5 - (2=3)r2c1 - (3=4)r6c1 => r8c1<>4

This oddity was uncovered while working with daj95376 to find suitable puzzles for testing an SE-like puzzle rating program.

[edit: r8c1<>4 was r8c1<>3; thanks Danny]
Last edited by ronk on Thu Aug 26, 2010 8:35 pm, edited 1 time in total.
ronk
2012 Supporter
 
Posts: 4764
Joined: 02 November 2005
Location: Southeastern USA

Re: Oddities of Sudoku Explainer

Postby David P Bird » Thu Aug 26, 2010 8:03 pm

Ronk, I don't see this as an oddity. In a closed or conjugate loop either all the odd numbered nodes are true or all the even numbered one are, and any candidate that sees a sister in each set is false. This allows eliminations to be made using odd & even assassin nodes picked from anywhere along the loop.

It might however be helpful to label the assasin nodes used in the chain:
(4a=5b)r8c5 - (5c=2)r2c5 - (2=3d)r2c1 - (3e=4f)r6c1 - (4=3)r6c4 - (3=2)r4c4 - (2=4g)r7c4 - loop
=> [bc]r1c5 <> 1, [de] r58c1 <> 3, [fg]r8c1 <> 4, [ag] r78c6 <> 4
David P Bird
2010 Supporter
 
Posts: 1043
Joined: 16 September 2008
Location: Middle England

Re: Oddities of Sudoku Explainer

Postby ronk » Thu Aug 26, 2010 9:45 pm

David P Bird wrote:I don't see this as an oddity. In a closed or conjugate loop either all the odd numbered nodes are true or all the even numbered one are, and any candidate that sees a sister in each set is false. This allows eliminations to be made using odd & even assassin nodes picked from anywhere along the loop.

I know that rule is true, and in the interest of minimizing the number of solution steps, I've seen it used on Eureka. But can you show me one programmed solver other than Sudoku Explainer (and maybe Xsudo) that apply this rule? IOW why complicate the code for an N strong inference deduction ... to make an exclusion that would have been found with N-1 or N-2 or, as in this case, N-3 strong inferences?

BTW in sudoku, what's an assassin and a sister? Are assassins running around assassinating their sisters now? :(
ronk
2012 Supporter
 
Posts: 4764
Joined: 02 November 2005
Location: Southeastern USA

Re: Oddities of Sudoku Explainer

Postby David P Bird » Fri Aug 27, 2010 12:00 am

Ronk wrote:But can you show me one programmed solver other than Sudoku Explainer (and maybe Xsudo) that apply this rule? IOW why complicate the code for an N strong inference deduction ... to make an exclusion that would have been found with N-1 or N-2 or, as in this case, N-3 strong inferences?

I don't run any solvers so I can't answer your question. However I believe that when an elegant step such as a conjugate loop exists a good solver should highlight it rather than hide it under a bushel. As I once pointed out to Myth, the eliminations for a Sue de Coq pattern are achievable using individual ALS chains for each of the excluded digits, but I doubt if any solvers show them like that, and nor should we want them to.
David P Bird
2010 Supporter
 
Posts: 1043
Joined: 16 September 2008
Location: Middle England

Re: Oddities of Sudoku Explainer

Postby daj95376 » Fri Aug 27, 2010 9:37 am

It took me awhile to visualize the implications of David's perspective. Surprising, it would (probably) take little effort to update my solver to implement it.

For me, everything hinges on the fact that I perceive loops as concurrent AICs using the same cells in equivalent cycles. All of the eliminations are gathered together and attributed to the loop. Take ronk's loop for example:

Code: Select all
        a           b           c           d           e           f           g
Loop: (4=5)r8c5 - (5=2)r2c5 - (2=3)r2c1 - (3=4)r6c1 - (4=3)r6c4 - (3=2)r4c4 - (2=4)r7c4 - loop
_____________________________________________________________________________________________________

The traditional eliminations are derived through three AICs:

Code: Select all
        a           b           c           d           e           f           g
AIC_: (4=5)r8c5 - (5=2)r2c5 - (2=3)r2c1 - (3=4)r6c1 - (4=3)r6c4 - (3=2)r4c4 - (2=4)r7c4  =>  r78c6<>4

        b           c           d           e           f           g           a
AIC_: (5=2)r2c5 - (2=3)r2c1 - (3=4)r6c1 - (4=3)r6c4 - (3=2)r4c4 - (2=4)r7c4 - (4=5)r8c5  =>  r1c5<>5

        d           e           f           g           a           b           c
AIC_: (3=4)r6c1 - (4=3)r6c4 - (3=2)r4c4 - (2=4)r7c4 - (4=5)r8c5 - (5=2)r2c5 - (2=3)r2c1  =>  r58c1<>3
_____________________________________________________________________________________________________

Now, if I ease off on the constraint of equivalent cycles and allow subset chains, then I can include:

Code: Select all
        a           b           c           d
AIC_: (4=5)r8c5 - (5=2)r2c5 - (2=3)r2c1 - (3=4)r6c1                                      =>  r8c1<>4
_____________________________________________________________________________________________________

However, I believe that David's position can easily be taken too far. Consider the following grid (from Mike Barker's zoo examples).

Code: Select all
 +-----------------------------------------------------+
 |  279  279  6    |  5    3   C19   |  4   B12   8    |
 |  1    8    3    |  6    4    2    |  9    7    5    |
 |  259  249  45   |  179  179  8    |  3   A12   6    |
 |-----------------+-----------------+-----------------|
 | F37  E17   8    |  4    6   D19   |  5    39   2    |
 | G36   16   2    |  179  179  5    |  8    39   4    |
 |  4    5    9    |  2    8    3    |  7    6    1    |
 |-----------------+-----------------+-----------------|
 |  8   K29  I57   |  3    25   6    |  1    4   J79   |
 | L29   3   N17   |  8    12   4    |  6    5   M79   |
 | H56   46   145  |  19   159  7    |  2    8    3    |
 +-----------------------------------------------------+
 # 42 eliminations remain

I can construct a 14-cell XY-Chain from r3c8 to r8c3 and determine eliminations when I stop. Using a purely analytical perspective, I can claim the following:

Code: Select all
(1=2)r3c8-
(2=1)r1c8-(1=9)r1c6-(9=1)r4c6-(1=7)r4c2-(7=3)r4c1-(3=6)r5c1-(6=5)r9c1-(5=7)r7c3-(7=9)r7c9-(9=2)r7c2-
(2=9)r8c1-(9=7)r8c9-(7=1)r8c3

=>  r1c2<>2
_____________________________________________________________________________________________________

However, is it reasonable for me to expect someone else to realize that the first and last three cells of the XY-Chain contribute nothing to the elimination? This is akin to only four cells of seven cells in ronk's loop being used in the last AIC.

This leads to the ultimate question: What is a reasonable burden to place on someone who is trying to reconstruct eliminations from your chain/loop?

From some of the steps that I've seen posted, it seems there's a contest to derive an elimination that no one else can possibly understand.
daj95376
2014 Supporter
 
Posts: 2624
Joined: 15 May 2006

Re: Oddities of Sudoku Explainer

Postby David P Bird » Fri Aug 27, 2010 4:09 pm

daj95376 wrote:However, is it reasonable for me to expect someone else to realize that the first and last three cells of the XY-Chain contribute nothing to the elimination?

Your solver must already track inconclusive chains but never report them, and the situation is no different in your example. The extended chain fails to complete a conjugate loop – the only time a pick-and-mix of odd and even numbered nodes can be utilised – and therefore the extensions shouldn't be reported.

This leads to the ultimate question: What is a reasonable burden to place on someone who is trying to reconstruct eliminations from your chain/loop?

From some of the steps that I've seen posted, it seems there's a contest to derive an elimination that no one else can possibly understand.

Here I absolutely agree with you, which is why I advocate labelling the nodes that contribute to multiple exclusions. I could go on for hours about similar notation issues, but won't.

Re your "contest" comment, in the past Carcul actually admitted that he enjoyed setting such challenges to his readers.
David P Bird
2010 Supporter
 
Posts: 1043
Joined: 16 September 2008
Location: Middle England

Re: Oddities of Sudoku Explainer

Postby ronk » Mon Aug 30, 2010 2:07 pm

Here are four odder examples of Bidirectional Y-Cycles, Sudoku Explainer's term for continuous xy-chains. In all four cases, 100% of the exclusions could have been made with a shorter discontinuous xy-chain. Obviously, Explainer does not have a dedicated technique for discontinuous xy-chains.

As before, thanks to daj95376 for a major assist in finding these examples.

Code: Select all
ER6.9 #2
...273......9.4.....2...4..36.....545.......778.....69..8...1.....7.9......531...

 4    1    5    |  2    7     3    |  9    8    6
 8    3    7    |  9    6     4    |  5    2    1
 6    9    2    | c18   15   d58   |  4    7    3
----------------+------------------+----------------
 3    6    19   | b18   19-2  7    | a28   5    4
 5    2    49   |  36   49    68   |  38   1    7
 7    8    14   | h34   1245 e25   | i23   6    9
----------------+------------------+----------------
 9    7    8    | g46   24   f26   |  1    3    5
 1    5    3    |  7    8     9    |  6    4    2
 2    4    6    |  5    3     1    |  7    9    8

r4c7 -8- r4c4 -1- r3c4 -8- r3c6 -5- r6c6 -2- r7c6 -6- r7c4 -4- r6c4 -3- r6c7 -2- r4c7 - continuous loop ==> no "conjugate exclusions"

BUT ...

r4c5 -2- r4c7 -8- r4c4 -1- r3c4 -8- r3c6 -5- r6c6 -2- r4c5 ==> r4c5<>2

In AIC notation:
(2=8)r4c7 - (8=1)r4c4 - (1=8)r3c4 - (8=5)r3c6 - (5=2)r6c6 - (2=6)r7c6 - (6=4)r7c4 - (4=3)r6c4 - (3=2)r6c7 - loop ==> no "conjugate exclusions"
(2=8)r4c7 - (8=1)r4c4 - (1=8)r3c4 - (8=5)r3c6 - (5=2)r6c6 ==> r4c5<>2

Code: Select all
ER6.9 #4
.7.....2.23.....45...2.9.....56728.....1.5.....69845.....4.1...46.....91.5.....3.

 6    7    8    |  5    4    3    |  1    2    9
 2    3    9    |  8    1    7    |  6    4    5
 5   b14  c14   |  2    6    9    |  3    8    7
----------------+-----------------+---------------
 39   49   5    |  6    7    2    |  8    1    34
 78   248  47-2 |  1    3    5    |  9    6    24
g13  a12   6    |  9    8    4    |  5    7   h23
----------------+-----------------+---------------
 78   89-2 3    |  4    29   1    |  27   5    6
 4    6    27   |  3    5    8    |  27   9    1
f19   5   d12   |  7   e29   6    |  4    3    8

r6c2 -1- r3c2 -4- r3c3 -1- r9c3 -2- r9c5 -9- r9c1 -1- r6c1 -3- r6c9 -2- r6c2 - continuous loop ==> no "conjugate exclusions"

BUT ... BUT ...

r5c3,r7c2 -2- r6c2 -1- r3c2 -4- r3c3 -1- r9c3 -2- r5c3,r7c2 ==> r5c3,r7c2<>2

In AIC notation:
(2=1)r6c2 - (1=4)r3c2 - (4=1)r3c3 - (1=2)r9c3 - (2=9)r9c5 - (9=1)r9c1 - (1=3)r6c1 - (3=2)r6c9 - loop ==> no "conjugate exclusions"
(2=1)r6c2 -  (1=4)r3c2 -  (4=1)r3c3 -  (1=2)r9c3 ==> r5c3,r7c2<>2

Code: Select all
ER6.9 #9
1...7...5.7.....2...6.5.9.....1.4...9.1...8.3...7.3.....5.2.6...2.....4.6...4...8

 1   e89   24   |  2369 7    26-9 |  34   68   5
 5    7    49   |  69   13   8    |  13   2    46
c23  d38   6    |  4    5   b12   |  9    18   7
----------------+-----------------+---------------
 7    6    3    |  1    8    4    |  5    9    2
 9    4    1    |  25   6    25   |  8    7    3
 28   5    28   |  7    9    3    |  14   16   46
----------------+-----------------+---------------
 4   f19   5    |  8    2    7    |  6    3    19
 38   2    89   |  56   13   56   |  7    4    19
 6   g13   7    | h39   4   a19   |  2    5    8

r9c6 -1- r3c6 -2- r3c1 -3- r3c2 -8- r1c2 -9- r7c2 -1- r9c2 -3- r9c4 -9- r9c6 - continuous loop ==> no "conjugate exclusions"

BUT ... BUT ... BUT ...

r1c6 -9- r9c6 -1- r3c6 -2- r3c1 -3- r3c2 -8- r1c2 -9- r1c6 ==> r1c6<>9

In AIC notation:
(9=1)r9c6 - (1=2)r3c6 - (2=3)r3c1 - (3=8)r3c2 - (8=9)r1c2 - (9=1)r7c2 - (1=3)r9c2 - (3=9)r9c4 - loop ==> no "conjugate exclusions"
(9=1)r9c6 - (1=2)r3c6 - (2=3)r3c1 - (3=8)r3c2 - (8=9)r1c2 ==> r1c6<>9

Code: Select all
ER6.9 #11
1...2...3.4.....5....6.5.....7...8..9...8...1..6...5.....7.9....3.....6.2...4...8

 1   79  5   | b48  2   47  |  6   c89  3
 6   4  e28  |  13  39 f18  | d29   5   7
 3   79  28  |  6   79  5   |  12   128 4
-------------+--------------+--------------
 4   12  7   |  9   5  g12  |  8    3   6
 9   5   3   | a24  8   6   |  47-2 247 1
 8   12  6   |  13  37  47  |  5    24  9
-------------+--------------+--------------
 5   8   14  |  7   6   9   |  3    14  2
 7   3   49  |  28  1   28  |  49   6   5
 2   6   19  |  5   4   3   |  179  179 8

r5c4 -4- r1c4 -8- r1c8 -9- r2c7 -2- r2c3 -8- r2c6 -1- r4c6 -2- r5c4 - continuous loop ==> no "conjugate exclusions"

BUT ... BUT ... BUT ... BUT ...

r5c7 -2- r5c4 -4- r1c4 -8- r1c8 -9- r2c7 -2- r5c7 ==> r5c7<>2

In AIC notation:
(2=4)r5c4 - (4=8)r1c4 - (8=9)r1c8 - (9=2)r2c7 - (2=8)r2c3 - (8=1)r2c6 - (1=2)r4c6 - loop ==> no "conjugate exclusions"
(2=4)r5c4 - (4=8)r1c4 - (8=9)r1c8 - (9=2)r2c7 ==> r5c7<>2

The chain notations were made manually. Hopefully there aren't too many typos.
ronk
2012 Supporter
 
Posts: 4764
Joined: 02 November 2005
Location: Southeastern USA

Re: Oddities of Sudoku Explainer

Postby ronk » Thu Dec 09, 2010 5:16 pm

Here are two puzzles, one with ER=8.3 and the other with ER=8.4. Since each uses four strong inference sets, the relative ratings are hard to justify and may be difficult to duplicate with an Explainer rating clone.

Code: Select all
An ER=8.3 with a "kraken cell" at r5c5:
...1.......2..3..4.5..6..2.2..4..6....7..8..3.9..5..4....7.......4..9..1.3..8..9.

At the start:
 346789  4678    3689    | 1      *2479   *245-7   | 35789   35678   56789
 16789   1678    2       | 589    *79      3       | 15789   15678   4
 134789  5       1389    | 89      6       47      | 13789   2       789
-------------------------+-------------------------+-----------------------
 2       18      1358    | 4       1379   *17      | 6       1578    5789
 1456    146     7       | 269    *129     8       | 1259    15      3
 1368    9       1368    | 236     5       1267    | 1278    4       278
-------------------------+-------------------------+-----------------------
 15689   1268    15689   | 7       1234    12456   | 23458   3568    2568
 5678    2678    4       | 2356    23      9       | 23578   35678   1
 1567    3       156     | 256     8       12456   | 2457    9       2567

NL notation:
     -7- r2c5 -9-
   /              \
r1c6 -7- r4c6 -1- r5c5 -2- r1c5 =2= r1c6   ==> r1c6<>7

AIC notation:
(1)r5c5 - (1=7)r4c6 - (7)r1c6
 ||
(2)r5c5 - (2)r1c5 = (2-7)r1c6
 ||
(9)r5c5 - (9=7)r2c5 - (7)r1c6   ==> r1c6<>7


Code: Select all
An ER=8.4 with a "kraken cell" at r5c9:
...1.2....2..3..4.5.......1..6...7...3.6.1.8.9.......54.......7.1..8..3...2...9..

At the start:
 3678    46789   34789   | 1       45679   2       | 3568    5679    3689
 1678    2       1789    | 5789    3       56789   | 568     4       689
 5       46789   34789   | 4789    4679    46789   | 2368    2679    1
-------------------------+-------------------------+----------------------
*128     458     6       | 234589  2459    34589   | 7      *12-9    2349
*27      3       457     | 6       24579   1       |*24      8      *249
 9       478     1478    | 23478   247     3478    | 12346   126     5
-------------------------+-------------------------+----------------------
 4       5689    3589    | 2359    12569   3569    | 12568   1256    7
 67      1       579     | 24579   8       45679   | 2456    3       246
 3678    5678    2       | 3457    14567   34567   | 9       156     468

NL notation:
               -----2----
             /            \
r4c8 -9- r5c9 -4- r5c7 -2- r5c1 =2= r4c1 =1= r4c8   ==> r4c8<>9

NL notation using the ALS:
r4c8 -9- als: r5c79 -2- r5c1 =2= r4c1 =1= r4c8   ==> r4c8<>9

AIC notation:
(2)r5c9 - (2)r5c1 = (2-1)r4c1 = (1-9)r4c8
 ||
(4)r5c9 - (4=2)r5c7 - (2)r5c1 = (2-1)r4c1 = (1-9)r4c8
 ||
(9)r5c9 - (9)r4c8                                      ==> r4c8<>9

[edit: add AIC notations]
Last edited by ronk on Fri Dec 10, 2010 12:09 am, edited 1 time in total.
ronk
2012 Supporter
 
Posts: 4764
Joined: 02 November 2005
Location: Southeastern USA

Re: Oddities of Sudoku Explainer

Postby daj95376 » Thu Dec 09, 2010 10:34 pm

Quasi-Related: In the second puzzle, there's a UR-based elimination for r5c9<>4. After that, the puzzle crumbles with a lot less trouble than the first puzzle. Does/should SE find the UR elimination?
daj95376
2014 Supporter
 
Posts: 2624
Joined: 15 May 2006

Re: Oddities of Sudoku Explainer

Postby ronk » Thu Dec 09, 2010 11:02 pm

daj95376 wrote:Quasi-Related: In the second puzzle, there's a UR-based elimination for r5c9<>4. After that, the puzzle crumbles with a lot less trouble than the first puzzle. Does/should SE find the UR elimination?

The only thing I see is a UR with two chains and Explainer doesn't approach that level of sophistication. It only knows Type 1, 2, 3 and 4 uniqueness tests for uniqueness loops (which includes URs) and BUGs.
ronk
2012 Supporter
 
Posts: 4764
Joined: 02 November 2005
Location: Southeastern USA

Re: Oddities of Sudoku Explainer

Postby ronk » Mon Dec 27, 2010 4:05 pm

I was a bit surprised to find that relabeling clues ... v(23486795) ... could change the ER/EP/ED rating.

Code: Select all
..1.9.4...7...4.1.3.......8.......7.4...6.2...9......56...8...2.5.9...3...2..51.. # ED=9.5/9.5/9.4
..1.5.8...9...8.1.4.......6.......9.8...7.3...5......27...6...3.2.5...4...3..21.. # ED=9.5/9.5/9.3
ronk
2012 Supporter
 
Posts: 4764
Joined: 02 November 2005
Location: Southeastern USA

Re: Oddities of Sudoku Explainer

Postby ronk » Mon Feb 07, 2011 12:46 pm

This is another example where "relabeling" clues ... v(192634) ... changes Explainer's ER/EP/ED rating.

Code: Select all
....1.......237.....15.82....5.7.8...6.....9.4.......3..7.2.5...3.....6.9.......4 # ED=9.8/9.8/9.8
....9.......647.....95.86....5.7.8...3.....2.1.......4..7.6.5...4.....3.2.......1 # ED=9.7/9.7/9.7
ronk
2012 Supporter
 
Posts: 4764
Joined: 02 November 2005
Location: Southeastern USA

Postby ronk » Fri Mar 18, 2011 3:37 pm

From Pattern Games 0134, a case where swapping clue labels <1> and <9> affects the Sudoku Explainer ratings.

Code: Select all
 5 . . | . . . | 2 . .
 . 9 . | 3 . . | . . .
 8 . 6 | . . . | . . 1
-------+-------+-------
 7 . . | 2 . . | . . .
 . 8 . | . 9 . | . . .
 . . 4 | . . 1 | . 6 .
-------+-------+-------
 . 7 . | 5 . . | 3 . .
 . . 2 | . 8 . | . 4 .
 4 . . | . . 2 | 7 . 9  # ED=9.3/9.3/9.2

Code: Select all
 5 . . | . . . | 2 . .
 . 1 . | 3 . . | . . .
 8 . 6 | . . . | . . 9
-------+-------+-------
 7 . . | 2 . . | . . .
 . 8 . | . 1 . | . . .
 . . 4 | . . 9 | . 6 .
-------+-------+-------
 . 7 . | 5 . . | 3 . .
 . . 2 | . 8 . | . 4 .
 4 . . | . . 2 | 7 . 1  # ED=9.2/9.2/9.2
ronk
2012 Supporter
 
Posts: 4764
Joined: 02 November 2005
Location: Southeastern USA

PreviousNext

Return to Software