#include <stdlib.h>

#define N 10
#define I 1
#define L 20

typedef enum { one, two, winner } Mtype;

typedef struct Chan
{
  Mtype type;
  int par;
  struct Chan *next;
} Chan;

Chan *challoc(Mtype type, int par)
{
  Chan *ch = (Chan *) malloc(sizeof(Chan));
  ch->type = type;
  ch->par = par;
  ch->next = NULL;
  return ch;
}

int send_ok(Chan *ch)
{
  int len;

  for (len = 0; ch; len++, ch = ch->next);
  return (len < L);
}

void send(Chan **chan, Mtype type, int par)
{
  Chan *ch;

  if (!*chan) *chan = challoc(type, par);
  else
    {
      for (ch = *chan; ch->next; ch = ch->next);
      ch->next = challoc(type, par);
    }
}

int recv_ok(Chan *ch, Mtype type)
{
  return (ch && ch->type == type);
}

void recv(Chan **chan, int *par)
{
  Chan *ch = *chan;

  *par = ch->par;
  *chan = (*chan)->next;
  free(ch);
  ch = NULL;
}

Chan *q[N];
int nr_leaders;
int election_started;

int atomic_ok(int active, Chan *out)
{
  return (!election_started && !active && send_ok(out));
}

void atomic(int *active, Chan **out, int mynumber, int *first_message)
{
  if (!election_started && !*active)
    {
       election_started = 1;
       send(out, one, mynumber);
       *first_message = 0;
       *active = 1;
    }
}

#define in1 q[0]
#define out1 q[1]
#define mynumber1 1
int first_message1, active1, know_winner1, nr1, maximum1, neighborR1;

#define in2 q[1]
#define out2 q[2]
#define mynumber2 10
int first_message2, active2, know_winner2, nr2, maximum2, neighborR2;

#define in3 q[2]
#define out3 q[3]
#define mynumber3 9
int first_message3, active3, know_winner3, nr3, maximum3, neighborR3;

#define in4 q[3]
#define out4 q[4]
#define mynumber4 8
int first_message4, active4, know_winner4, nr4, maximum4, neighborR4;

#define in5 q[4]
#define out5 q[5]
#define mynumber5 7
int first_message5, active5, know_winner5, nr5, maximum5, neighborR5;

#define in6 q[5]
#define out6 q[6]
#define mynumber6 6
int first_message6, active6, know_winner6, nr6, maximum6, neighborR6;

#define in7 q[6]
#define out7 q[7]
#define mynumber7 5
int first_message7, active7, know_winner7, nr7, maximum7, neighborR7;

#define in8 q[7]
#define out8 q[8]
#define mynumber8 4
int first_message8, active8, know_winner8, nr8, maximum8, neighborR8;

#define in9 q[8]
#define out9 q[9]
#define mynumber9 3
int first_message9, active9, know_winner9, nr9, maximum9, neighborR9;

#define in10 q[9]
#define out10 q[0]
#define mynumber10 2
int first_message10, active10, know_winner10, nr10, maximum10, neighborR10;

void _before_all(void)
{
  int i;

  for (i = 0; i < N; i++) q[i] = NULL;
}

void _before(void)
{
  int i;
  Chan *ch;

  for (i = 0; i < N; i++)
    while (q[i])
      {
        ch = q[i];
        q[i] = q[i]->next;
        free(ch);
        ch = NULL;
      }

  nr_leaders = 0;
  election_started = 0;


  first_message1 = 1;
  active1 = know_winner1 = nr1 = neighborR1 = 0;
  maximum1 = mynumber1;

  first_message2 = 1;
  active2 = know_winner2 = nr2 = neighborR2 = 0;
  maximum2 = mynumber2;

  first_message3 = 1;
  active3 = know_winner3 = nr3 = neighborR3 = 0;
  maximum3 = mynumber3;

  first_message4 = 1;
  active4 = know_winner4 = nr4 = neighborR4 = 0;
  maximum4 = mynumber4;

  first_message5 = 1;
  active5 = know_winner5 = nr5 = neighborR5 = 0;
  maximum5 = mynumber5;

  first_message6 = 1;
  active6 = know_winner6 = nr6 = neighborR6 = 0;
  maximum6 = mynumber6;

  first_message7 = 1;
  active7 = know_winner7 = nr7 = neighborR7 = 0;
  maximum7 = mynumber7;

  first_message8 = 1;
  active8 = know_winner8 = nr8 = neighborR8 = 0;
  maximum8 = mynumber8;

  first_message9 = 1;
  active9 = know_winner9 = nr9 = neighborR9 = 0;
  maximum9 = mynumber9;

  first_message10 = 1;
  active10 = know_winner10 = nr10 = neighborR10 = 0;
  maximum10 = mynumber10;
}

void _print(char *tmp)
{
  int i, j;
  Chan *ch;
  char c[8];

  *c = '\0';

  for (i = 0; i < N; i++)
    {
      j = 0;

    if (q[i])
      {
        j = 1;
        switch (q[i]->type)
          {
            case 0 : strcpy(c, "one"); break;
            case 1 : strcpy(c, "two"); break;
            case 2 : strcpy(c, "winner");
          }

        sprintf(&tmp[strlen(tmp)], "   q[%i]: %s(%i)", i, c, q[i]->par);

        for (ch = q[i]->next; ch; ch = ch->next)
          {
            switch (ch->type)
              {
                case 0 : strcpy(c, "one"); break;
                case 1 : strcpy(c, "two"); break;
                case 2 : strcpy(c, "winner");
              }

            sprintf(&tmp[strlen(tmp)], ", %s(%i)", c, ch->par);
          }
      }

      if (j) sprintf(&tmp[strlen(tmp)], "\n");
    }
}

void _hash(unsigned int *h)
{
  int i;
  Chan *ch;

  for (i = 0; i < N; i++)
    if (q[i])
      for (ch = q[i]; ch; ch = ch->next)
        {
          _hash_int(i, h);
          _hash_int(ch->type, h);
          _hash_int(ch->par, h);
        }
}

%%

a1_ok.
a1_violated.

a2_ok.
a2_violated.

1_1; -; -; 1_2.
1_2. (atomic_ok(active1, out1)); {atomic(&active1, &out1, mynumber1, &first_message1);}; 1_2.
1_2. (recv_ok(in1, one)); {recv(&in1, &nr1);}; 1_3;
1_2. (recv_ok(in1, two)); {recv(&in1, &nr1);}; 1_15;
1_2. (recv_ok(in1, winner)); {recv(&in1, &nr1);}; 1_25;
1_3; (first_message1 && !active1); -; 1_4;
1_3; (!first_message1 || active1); -; 1_6;
1_4; -; {active1 = 1;}; 1_5;
1_4; -; -; 1_6;
1_5; (send_ok(out1)); {send(&out1, one, mynumber1);}; 1_6;
1_6; -; {first_message1 = 0;}; 1_7;
1_7; (active1); -; 1_8;
1_7; (!active1); -; 1_14;
1_8; (nr1 != maximum1); -; 1_9;
1_8; (nr1 == maximum1); -; 1_11;
1_9; (send_ok(out1)); {send(&out1, two, nr1);}; 1_10;
1_10; -; {neighborR1 = nr1;}; 1_2.
1_11; (nr1 == N); a1_ok; 1_12;
1_11; (nr1 != N); a1_violated; 1_12;
1_12; -; {know_winner1 = 1;}; 1_13;
1_13; (send_ok(out1)); {send(&out1, winner, nr1);}; 1_2.
1_14; (send_ok(out1)); {send(&out1, one, nr1);}; 1_2.
1_15; (first_message1 && !active1); -; 1_16;
1_15; (!first_message1 || active1); -; 1_19;
1_16; -; {active1 = 1;}; 1_17;
1_16; -; -; 1_18;
1_17; (send_ok(out1)); {send(&out1, one, mynumber1);}; 1_18;
1_18; -; {first_message1 = 0;}; 1_19;
1_19; (active1); -; 1_20;
1_19; (!active1); -; 1_24;
1_20; (neighborR1 > nr1 && neighborR1 > maximum1); -; 1_21;
1_20; (neighborR1 <= nr1 || neighborR1 <= maximum1); -; 1_23;
1_21; -; {maximum1 = neighborR1;}; 1_22;
1_22; (send_ok(out1)); {send(&out1, one, neighborR1);}; 1_2.
1_23; -; {active1 = 0;}; 1_2.
1_24; (send_ok(out1)); {send(&out1, two, nr1);}; 1_2.
1_25; (nr1 != mynumber1); -; 1_26;
1_25; (nr1 == mynumber1); -; 1_27;
1_26; -; -; 1_30;
1_27; -; -; 1_28;
1_28; -; {nr_leaders++;}; 1_29;
1_29; (nr_leaders == 1); a2_ok; 1_30;
1_29; (nr_leaders != 1); a2_violated; 1_30;
1_30; (know_winner1); -; 1_32.
1_30; (!know_winner1); -; 1_31;
1_31; (send_ok(out1)); {send(&out1, winner, nr1);}; 1_32.

2_1; -; -; 2_2.
2_2. (atomic_ok(active2, out2)); {atomic(&active2, &out2, mynumber2, &first_message2);}; 2_2.
2_2. (recv_ok(in2, one)); {recv(&in2, &nr2);}; 2_3;
2_2. (recv_ok(in2, two)); {recv(&in2, &nr2);}; 2_15;
2_2. (recv_ok(in2, winner)); {recv(&in2, &nr2);}; 2_25;
2_3; (first_message2 && !active2); -; 2_4;
2_3; (!first_message2 || active2); -; 2_6;
2_4; -; {active2 = 1;}; 2_5;
2_4; -; -; 2_6;
2_5; (send_ok(out2)); {send(&out2, one, mynumber2);}; 2_6;
2_6; -; {first_message2 = 0;}; 2_7;
2_7; (active2); -; 2_8;
2_7; (!active2); -; 2_14;
2_8; (nr2 != maximum2); -; 2_9;
2_8; (nr2 == maximum2); -; 2_11;
2_9; (send_ok(out2)); {send(&out2, two, nr2);}; 2_10;
2_10; -; {neighborR2 = nr2;}; 2_2.
2_11; (nr2 == N); a1_ok; 2_12;
2_11; (nr2 != N); a1_violated; 2_12;
2_12; -; {know_winner2 = 1;}; 2_13;
2_13; (send_ok(out2)); {send(&out2, winner, nr2);}; 2_2.
2_14; (send_ok(out2)); {send(&out2, one, nr2);}; 2_2.
2_15; (first_message2 && !active2); -; 2_16;
2_15; (!first_message2 || active2); -; 2_19;
2_16; -; {active2 = 1;}; 2_17;
2_16; -; -; 2_18;
2_17; (send_ok(out2)); {send(&out2, one, mynumber2);}; 2_18;
2_18; -; {first_message2 = 0;}; 2_19;
2_19; (active2); -; 2_20;
2_19; (!active2); -; 2_24;
2_20; (neighborR2 > nr2 && neighborR2 > maximum2); -; 2_21;
2_20; (neighborR2 <= nr2 || neighborR2 <= maximum2); -; 2_23;
2_21; -; {maximum2 = neighborR2;}; 2_22;
2_22; (send_ok(out2)); {send(&out2, one, neighborR2);}; 2_2.
2_23; -; {active2 = 0;}; 2_2.
2_24; (send_ok(out2)); {send(&out2, two, nr2);}; 2_2.
2_25; (nr2 != mynumber2); -; 2_26;
2_25; (nr2 == mynumber2); -; 2_27;
2_26; -; -; 2_30;
2_27; -; -; 2_28;
2_28; -; {nr_leaders++;}; 2_29;
2_29; (nr_leaders == 1); a2_ok; 2_30;
2_29; (nr_leaders != 1); a2_violated; 2_30;
2_30; (know_winner2); -; 2_32.
2_30; (!know_winner2); -; 2_31;
2_31; (send_ok(out2)); {send(&out2, winner, nr2);}; 2_32.

3_1; -; -; 3_2.
3_2. (atomic_ok(active3, out3)); {atomic(&active3, &out3, mynumber3, &first_message3);}; 3_2.
3_2. (recv_ok(in3, one)); {recv(&in3, &nr3);}; 3_3;
3_2. (recv_ok(in3, two)); {recv(&in3, &nr3);}; 3_15;
3_2. (recv_ok(in3, winner)); {recv(&in3, &nr3);}; 3_25;
3_3; (first_message3 && !active3); -; 3_4;
3_3; (!first_message3 || active3); -; 3_6;
3_4; -; {active3 = 1;}; 3_5;
3_4; -; -; 3_6;
3_5; (send_ok(out3)); {send(&out3, one, mynumber3);}; 3_6;
3_6; -; {first_message3 = 0;}; 3_7;
3_7; (active3); -; 3_8;
3_7; (!active3); -; 3_14;
3_8; (nr3 != maximum3); -; 3_9;
3_8; (nr3 == maximum3); -; 3_11;
3_9; (send_ok(out3)); {send(&out3, two, nr3);}; 3_10;
3_10; -; {neighborR3 = nr3;}; 3_2.
3_11; (nr3 == N); a1_ok; 3_12;
3_11; (nr3 != N); a1_violated; 3_12;
3_12; -; {know_winner3 = 1;}; 3_13;
3_13; (send_ok(out3)); {send(&out3, winner, nr3);}; 3_2.
3_14; (send_ok(out3)); {send(&out3, one, nr3);}; 3_2.
3_15; (first_message3 && !active3); -; 3_16;
3_15; (!first_message3 || active3); -; 3_19;
3_16; -; {active3 = 1;}; 3_17;
3_16; -; -; 3_18;
3_17; (send_ok(out3)); {send(&out3, one, mynumber3);}; 3_18;
3_18; -; {first_message3 = 0;}; 3_19;
3_19; (active3); -; 3_20;
3_19; (!active3); -; 3_24;
3_20; (neighborR3 > nr3 && neighborR3 > maximum3); -; 3_21;
3_20; (neighborR3 <= nr3 || neighborR3 <= maximum3); -; 3_23;
3_21; -; {maximum3 = neighborR3;}; 3_22;
3_22; (send_ok(out3)); {send(&out3, one, neighborR3);}; 3_2.
3_23; -; {active3 = 0;}; 3_2.
3_24; (send_ok(out3)); {send(&out3, two, nr3);}; 3_2.
3_25; (nr3 != mynumber3); -; 3_26;
3_25; (nr3 == mynumber3); -; 3_27;
3_26; -; -; 3_30;
3_27; -; -; 3_28;
3_28; -; {nr_leaders++;}; 3_29;
3_29; (nr_leaders == 1); a2_ok; 3_30;
3_29; (nr_leaders != 1); a2_violated; 3_30;
3_30; (know_winner3); -; 3_32.
3_30; (!know_winner3); -; 3_31;
3_31; (send_ok(out3)); {send(&out3, winner, nr3);}; 3_32.

4_1; -; -; 4_2.
4_2. (atomic_ok(active4, out4)); {atomic(&active4, &out4, mynumber4, &first_message4);}; 4_2.
4_2. (recv_ok(in4, one)); {recv(&in4, &nr4);}; 4_3;
4_2. (recv_ok(in4, two)); {recv(&in4, &nr4);}; 4_15;
4_2. (recv_ok(in4, winner)); {recv(&in4, &nr4);}; 4_25;
4_3; (first_message4 && !active4); -; 4_4;
4_3; (!first_message4 || active4); -; 4_6;
4_4; -; {active4 = 1;}; 4_5;
4_4; -; -; 4_6;
4_5; (send_ok(out4)); {send(&out4, one, mynumber4);}; 4_6;
4_6; -; {first_message4 = 0;}; 4_7;
4_7; (active4); -; 4_8;
4_7; (!active4); -; 4_14;
4_8; (nr4 != maximum4); -; 4_9;
4_8; (nr4 == maximum4); -; 4_11;
4_9; (send_ok(out4)); {send(&out4, two, nr4);}; 4_10;
4_10; -; {neighborR4 = nr4;}; 4_2.
4_11; (nr4 == N); a1_ok; 4_12;
4_11; (nr4 != N); a1_violated; 4_12;
4_12; -; {know_winner4 = 1;}; 4_13;
4_13; (send_ok(out4)); {send(&out4, winner, nr4);}; 4_2.
4_14; (send_ok(out4)); {send(&out4, one, nr4);}; 4_2.
4_15; (first_message4 && !active4); -; 4_16;
4_15; (!first_message4 || active4); -; 4_19;
4_16; -; {active4 = 1;}; 4_17;
4_16; -; -; 4_18;
4_17; (send_ok(out4)); {send(&out4, one, mynumber4);}; 4_18;
4_18; -; {first_message4 = 0;}; 4_19;
4_19; (active4); -; 4_20;
4_19; (!active4); -; 4_24;
4_20; (neighborR4 > nr4 && neighborR4 > maximum4); -; 4_21;
4_20; (neighborR4 <= nr4 || neighborR4 <= maximum4); -; 4_23;
4_21; -; {maximum4 = neighborR4;}; 4_22;
4_22; (send_ok(out4)); {send(&out4, one, neighborR4);}; 4_2.
4_23; -; {active4 = 0;}; 4_2.
4_24; (send_ok(out4)); {send(&out4, two, nr4);}; 4_2.
4_25; (nr4 != mynumber4); -; 4_26;
4_25; (nr4 == mynumber4); -; 4_27;
4_26; -; -; 4_30;
4_27; -; -; 4_28;
4_28; -; {nr_leaders++;}; 4_29;
4_29; (nr_leaders == 1); a2_ok; 4_30;
4_29; (nr_leaders != 1); a2_violated; 4_30;
4_30; (know_winner4); -; 4_32.
4_30; (!know_winner4); -; 4_31;
4_31; (send_ok(out4)); {send(&out4, winner, nr4);}; 4_32.

5_1; -; -; 5_2.
5_2. (atomic_ok(active5, out5)); {atomic(&active5, &out5, mynumber5, &first_message5);}; 5_2.
5_2. (recv_ok(in5, one)); {recv(&in5, &nr5);}; 5_3;
5_2. (recv_ok(in5, two)); {recv(&in5, &nr5);}; 5_15;
5_2. (recv_ok(in5, winner)); {recv(&in5, &nr5);}; 5_25;
5_3; (first_message5 && !active5); -; 5_4;
5_3; (!first_message5 || active5); -; 5_6;
5_4; -; {active5 = 1;}; 5_5;
5_4; -; -; 5_6;
5_5; (send_ok(out5)); {send(&out5, one, mynumber5);}; 5_6;
5_6; -; {first_message5 = 0;}; 5_7;
5_7; (active5); -; 5_8;
5_7; (!active5); -; 5_14;
5_8; (nr5 != maximum5); -; 5_9;
5_8; (nr5 == maximum5); -; 5_11;
5_9; (send_ok(out5)); {send(&out5, two, nr5);}; 5_10;
5_10; -; {neighborR5 = nr5;}; 5_2.
5_11; (nr5 == N); a1_ok; 5_12;
5_11; (nr5 != N); a1_violated; 5_12;
5_12; -; {know_winner5 = 1;}; 5_13;
5_13; (send_ok(out5)); {send(&out5, winner, nr5);}; 5_2.
5_14; (send_ok(out5)); {send(&out5, one, nr5);}; 5_2.
5_15; (first_message5 && !active5); -; 5_16;
5_15; (!first_message5 || active5); -; 5_19;
5_16; -; {active5 = 1;}; 5_17;
5_16; -; -; 5_18;
5_17; (send_ok(out5)); {send(&out5, one, mynumber5);}; 5_18;
5_18; -; {first_message5 = 0;}; 5_19;
5_19; (active5); -; 5_20;
5_19; (!active5); -; 5_24;
5_20; (neighborR5 > nr5 && neighborR5 > maximum5); -; 5_21;
5_20; (neighborR5 <= nr5 || neighborR5 <= maximum5); -; 5_23;
5_21; -; {maximum5 = neighborR5;}; 5_22;
5_22; (send_ok(out5)); {send(&out5, one, neighborR5);}; 5_2.
5_23; -; {active5 = 0;}; 5_2.
5_24; (send_ok(out5)); {send(&out5, two, nr5);}; 5_2.
5_25; (nr5 != mynumber5); -; 5_26;
5_25; (nr5 == mynumber5); -; 5_27;
5_26; -; -; 5_30;
5_27; -; -; 5_28;
5_28; -; {nr_leaders++;}; 5_29;
5_29; (nr_leaders == 1); a2_ok; 5_30;
5_29; (nr_leaders != 1); a2_violated; 5_30;
5_30; (know_winner5); -; 5_32.
5_30; (!know_winner5); -; 5_31;
5_31; (send_ok(out5)); {send(&out5, winner, nr5);}; 5_32.

6_1; -; -; 6_2.
6_2. (atomic_ok(active6, out6)); {atomic(&active6, &out6, mynumber6, &first_message6);}; 6_2.
6_2. (recv_ok(in6, one)); {recv(&in6, &nr6);}; 6_3;
6_2. (recv_ok(in6, two)); {recv(&in6, &nr6);}; 6_15;
6_2. (recv_ok(in6, winner)); {recv(&in6, &nr6);}; 6_25;
6_3; (first_message6 && !active6); -; 6_4;
6_3; (!first_message6 || active6); -; 6_6;
6_4; -; {active6 = 1;}; 6_5;
6_4; -; -; 6_6;
6_5; (send_ok(out6)); {send(&out6, one, mynumber6);}; 6_6;
6_6; -; {first_message6 = 0;}; 6_7;
6_7; (active6); -; 6_8;
6_7; (!active6); -; 6_14;
6_8; (nr6 != maximum6); -; 6_9;
6_8; (nr6 == maximum6); -; 6_11;
6_9; (send_ok(out6)); {send(&out6, two, nr6);}; 6_10;
6_10; -; {neighborR6 = nr6;}; 6_2.
6_11; (nr6 == N); a1_ok; 6_12;
6_11; (nr6 != N); a1_violated; 6_12;
6_12; -; {know_winner6 = 1;}; 6_13;
6_13; (send_ok(out6)); {send(&out6, winner, nr6);}; 6_2.
6_14; (send_ok(out6)); {send(&out6, one, nr6);}; 6_2.
6_15; (first_message6 && !active6); -; 6_16;
6_15; (!first_message6 || active6); -; 6_19;
6_16; -; {active6 = 1;}; 6_17;
6_16; -; -; 6_18;
6_17; (send_ok(out6)); {send(&out6, one, mynumber6);}; 6_18;
6_18; -; {first_message6 = 0;}; 6_19;
6_19; (active6); -; 6_20;
6_19; (!active6); -; 6_24;
6_20; (neighborR6 > nr6 && neighborR6 > maximum6); -; 6_21;
6_20; (neighborR6 <= nr6 || neighborR6 <= maximum6); -; 6_23;
6_21; -; {maximum6 = neighborR6;}; 6_22;
6_22; (send_ok(out6)); {send(&out6, one, neighborR6);}; 6_2.
6_23; -; {active6 = 0;}; 6_2.
6_24; (send_ok(out6)); {send(&out6, two, nr6);}; 6_2.
6_25; (nr6 != mynumber6); -; 6_26;
6_25; (nr6 == mynumber6); -; 6_27;
6_26; -; -; 6_30;
6_27; -; -; 6_28;
6_28; -; {nr_leaders++;}; 6_29;
6_29; (nr_leaders == 1); a2_ok; 6_30;
6_29; (nr_leaders != 1); a2_violated; 6_30;
6_30; (know_winner6); -; 6_32.
6_30; (!know_winner6); -; 6_31;
6_31; (send_ok(out6)); {send(&out6, winner, nr6);}; 6_32.

7_1; -; -; 7_2.
7_2. (atomic_ok(active7, out7)); {atomic(&active7, &out7, mynumber7, &first_message7);}; 7_2.
7_2. (recv_ok(in7, one)); {recv(&in7, &nr7);}; 7_3;
7_2. (recv_ok(in7, two)); {recv(&in7, &nr7);}; 7_15;
7_2. (recv_ok(in7, winner)); {recv(&in7, &nr7);}; 7_25;
7_3; (first_message7 && !active7); -; 7_4;
7_3; (!first_message7 || active7); -; 7_6;
7_4; -; {active7 = 1;}; 7_5;
7_4; -; -; 7_6;
7_5; (send_ok(out7)); {send(&out7, one, mynumber7);}; 7_6;
7_6; -; {first_message7 = 0;}; 7_7;
7_7; (active7); -; 7_8;
7_7; (!active7); -; 7_14;
7_8; (nr7 != maximum7); -; 7_9;
7_8; (nr7 == maximum7); -; 7_11;
7_9; (send_ok(out7)); {send(&out7, two, nr7);}; 7_10;
7_10; -; {neighborR7 = nr7;}; 7_2.
7_11; (nr7 == N); a1_ok; 7_12;
7_11; (nr7 != N); a1_violated; 7_12;
7_12; -; {know_winner7 = 1;}; 7_13;
7_13; (send_ok(out7)); {send(&out7, winner, nr7);}; 7_2.
7_14; (send_ok(out7)); {send(&out7, one, nr7);}; 7_2.
7_15; (first_message7 && !active7); -; 7_16;
7_15; (!first_message7 || active7); -; 7_19;
7_16; -; {active7 = 1;}; 7_17;
7_16; -; -; 7_18;
7_17; (send_ok(out7)); {send(&out7, one, mynumber7);}; 7_18;
7_18; -; {first_message7 = 0;}; 7_19;
7_19; (active7); -; 7_20;
7_19; (!active7); -; 7_24;
7_20; (neighborR7 > nr7 && neighborR7 > maximum7); -; 7_21;
7_20; (neighborR7 <= nr7 || neighborR7 <= maximum7); -; 7_23;
7_21; -; {maximum7 = neighborR7;}; 7_22;
7_22; (send_ok(out7)); {send(&out7, one, neighborR7);}; 7_2.
7_23; -; {active7 = 0;}; 7_2.
7_24; (send_ok(out7)); {send(&out7, two, nr7);}; 7_2.
7_25; (nr7 != mynumber7); -; 7_26;
7_25; (nr7 == mynumber7); -; 7_27;
7_26; -; -; 7_30;
7_27; -; -; 7_28;
7_28; -; {nr_leaders++;}; 7_29;
7_29; (nr_leaders == 1); a2_ok; 7_30;
7_29; (nr_leaders != 1); a2_violated; 7_30;
7_30; (know_winner7); -; 7_32.
7_30; (!know_winner7); -; 7_31;
7_31; (send_ok(out7)); {send(&out7, winner, nr7);}; 7_32.

8_1; -; -; 8_2.
8_2. (atomic_ok(active8, out8)); {atomic(&active8, &out8, mynumber8, &first_message8);}; 8_2.
8_2. (recv_ok(in8, one)); {recv(&in8, &nr8);}; 8_3;
8_2. (recv_ok(in8, two)); {recv(&in8, &nr8);}; 8_15;
8_2. (recv_ok(in8, winner)); {recv(&in8, &nr8);}; 8_25;
8_3; (first_message8 && !active8); -; 8_4;
8_3; (!first_message8 || active8); -; 8_6;
8_4; -; {active8 = 1;}; 8_5;
8_4; -; -; 8_6;
8_5; (send_ok(out8)); {send(&out8, one, mynumber8);}; 8_6;
8_6; -; {first_message8 = 0;}; 8_7;
8_7; (active8); -; 8_8;
8_7; (!active8); -; 8_14;
8_8; (nr8 != maximum8); -; 8_9;
8_8; (nr8 == maximum8); -; 8_11;
8_9; (send_ok(out8)); {send(&out8, two, nr8);}; 8_10;
8_10; -; {neighborR8 = nr8;}; 8_2.
8_11; (nr8 == N); a1_ok; 8_12;
8_11; (nr8 != N); a1_violated; 8_12;
8_12; -; {know_winner8 = 1;}; 8_13;
8_13; (send_ok(out8)); {send(&out8, winner, nr8);}; 8_2.
8_14; (send_ok(out8)); {send(&out8, one, nr8);}; 8_2.
8_15; (first_message8 && !active8); -; 8_16;
8_15; (!first_message8 || active8); -; 8_19;
8_16; -; {active8 = 1;}; 8_17;
8_16; -; -; 8_18;
8_17; (send_ok(out8)); {send(&out8, one, mynumber8);}; 8_18;
8_18; -; {first_message8 = 0;}; 8_19;
8_19; (active8); -; 8_20;
8_19; (!active8); -; 8_24;
8_20; (neighborR8 > nr8 && neighborR8 > maximum8); -; 8_21;
8_20; (neighborR8 <= nr8 || neighborR8 <= maximum8); -; 8_23;
8_21; -; {maximum8 = neighborR8;}; 8_22;
8_22; (send_ok(out8)); {send(&out8, one, neighborR8);}; 8_2.
8_23; -; {active8 = 0;}; 8_2.
8_24; (send_ok(out8)); {send(&out8, two, nr8);}; 8_2.
8_25; (nr8 != mynumber8); -; 8_26;
8_25; (nr8 == mynumber8); -; 8_27;
8_26; -; -; 8_30;
8_27; -; -; 8_28;
8_28; -; {nr_leaders++;}; 8_29;
8_29; (nr_leaders == 1); a2_ok; 8_30;
8_29; (nr_leaders != 1); a2_violated; 8_30;
8_30; (know_winner8); -; 8_32.
8_30; (!know_winner8); -; 8_31;
8_31; (send_ok(out8)); {send(&out8, winner, nr8);}; 8_32.

9_1; -; -; 9_2.
9_2. (atomic_ok(active9, out9)); {atomic(&active9, &out9, mynumber9, &first_message9);}; 9_2.
9_2. (recv_ok(in9, one)); {recv(&in9, &nr9);}; 9_3;
9_2. (recv_ok(in9, two)); {recv(&in9, &nr9);}; 9_15;
9_2. (recv_ok(in9, winner)); {recv(&in9, &nr9);}; 9_25;
9_3; (first_message9 && !active9); -; 9_4;
9_3; (!first_message9 || active9); -; 9_6;
9_4; -; {active9 = 1;}; 9_5;
9_4; -; -; 9_6;
9_5; (send_ok(out9)); {send(&out9, one, mynumber9);}; 9_6;
9_6; -; {first_message9 = 0;}; 9_7;
9_7; (active9); -; 9_8;
9_7; (!active9); -; 9_14;
9_8; (nr9 != maximum9); -; 9_9;
9_8; (nr9 == maximum9); -; 9_11;
9_9; (send_ok(out9)); {send(&out9, two, nr9);}; 9_10;
9_10; -; {neighborR9 = nr9;}; 9_2.
9_11; (nr9 == N); a1_ok; 9_12;
9_11; (nr9 != N); a1_violated; 9_12;
9_12; -; {know_winner9 = 1;}; 9_13;
9_13; (send_ok(out9)); {send(&out9, winner, nr9);}; 9_2.
9_14; (send_ok(out9)); {send(&out9, one, nr9);}; 9_2.
9_15; (first_message9 && !active9); -; 9_16;
9_15; (!first_message9 || active9); -; 9_19;
9_16; -; {active9 = 1;}; 9_17;
9_16; -; -; 9_18;
9_17; (send_ok(out9)); {send(&out9, one, mynumber9);}; 9_18;
9_18; -; {first_message9 = 0;}; 9_19;
9_19; (active9); -; 9_20;
9_19; (!active9); -; 9_24;
9_20; (neighborR9 > nr9 && neighborR9 > maximum9); -; 9_21;
9_20; (neighborR9 <= nr9 || neighborR9 <= maximum9); -; 9_23;
9_21; -; {maximum9 = neighborR9;}; 9_22;
9_22; (send_ok(out9)); {send(&out9, one, neighborR9);}; 9_2.
9_23; -; {active9 = 0;}; 9_2.
9_24; (send_ok(out9)); {send(&out9, two, nr9);}; 9_2.
9_25; (nr9 != mynumber9); -; 9_26;
9_25; (nr9 == mynumber9); -; 9_27;
9_26; -; -; 9_30;
9_27; -; -; 9_28;
9_28; -; {nr_leaders++;}; 9_29;
9_29; (nr_leaders == 1); a2_ok; 9_30;
9_29; (nr_leaders != 1); a2_violated; 9_30;
9_30; (know_winner9); -; 9_32.
9_30; (!know_winner9); -; 9_31;
9_31; (send_ok(out9)); {send(&out9, winner, nr9);}; 9_32.

10_1; -; -; 10_2.
10_2. (atomic_ok(active10, out10)); {atomic(&active10, &out10, mynumber10, &first_message10);}; 10_2.
10_2. (recv_ok(in10, one)); {recv(&in10, &nr10);}; 10_3;
10_2. (recv_ok(in10, two)); {recv(&in10, &nr10);}; 10_15;
10_2. (recv_ok(in10, winner)); {recv(&in10, &nr10);}; 10_25;
10_3; (first_message10 && !active10); -; 10_4;
10_3; (!first_message10 || active10); -; 10_6;
10_4; -; {active10 = 1;}; 10_5;
10_4; -; -; 10_6;
10_5; (send_ok(out10)); {send(&out10, one, mynumber10);}; 10_6;
10_6; -; {first_message10 = 0;}; 10_7;
10_7; (active10); -; 10_8;
10_7; (!active10); -; 10_14;
10_8; (nr10 != maximum10); -; 10_9;
10_8; (nr10 == maximum10); -; 10_11;
10_9; (send_ok(out10)); {send(&out10, two, nr10);}; 10_10;
10_10; -; {neighborR10 = nr10;}; 10_2.
10_11; (nr10 == N); a1_ok; 10_12;
10_11; (nr10 != N); a1_violated; 10_12;
10_12; -; {know_winner10 = 1;}; 10_13;
10_13; (send_ok(out10)); {send(&out10, winner, nr10);}; 10_2.
10_14; (send_ok(out10)); {send(&out10, one, nr10);}; 10_2.
10_15; (first_message10 && !active10); -; 10_16;
10_15; (!first_message10 || active10); -; 10_19;
10_16; -; {active10 = 1;}; 10_17;
10_16; -; -; 10_18;
10_17; (send_ok(out10)); {send(&out10, one, mynumber10);}; 10_18;
10_18; -; {first_message10 = 0;}; 10_19;
10_19; (active10); -; 10_20;
10_19; (!active10); -; 10_24;
10_20; (neighborR10 > nr10 && neighborR10 > maximum10); -; 10_21;
10_20; (neighborR10 <= nr10 || neighborR10 <= maximum10); -; 10_23;
10_21; -; {maximum10 = neighborR10;}; 10_22;
10_22; (send_ok(out10)); {send(&out10, one, neighborR10);}; 10_2.
10_23; -; {active10 = 0;}; 10_2.
10_24; (send_ok(out10)); {send(&out10, two, nr10);}; 10_2.
10_25; (nr10 != mynumber10); -; 10_26;
10_25; (nr10 == mynumber10); -; 10_27;
10_26; -; -; 10_30;
10_27; -; -; 10_28;
10_28; -; {nr_leaders++;}; 10_29;
10_29; (nr_leaders == 1); a2_ok; 10_30;
10_29; (nr_leaders != 1); a2_violated; 10_30;
10_30; (know_winner10); -; 10_32.
10_30; (!know_winner10); -; 10_31;
10_31; (send_ok(out10)); {send(&out10, winner, nr10);}; 10_32.

n: T0_init. (! ((nr_leaders == 1))); -; =accept_S4.
n: T0_init. (1); -; T0_init.
n: =accept_S4. (! ((nr_leaders == 1))); -; =accept_S4.

