void abort() { };

                                                                       
                                                  
                                                                             
                                                                   
                                                  
                                                                             
                                                                              
                                                                             

                                                                                                                                                                 
extern unsigned __VERIFIER_nondet_uint();
                        
void assume_abort_if_not(int cond) {
  if(!cond) {abort();}
}
/*@ 
    requires (((1 <= counter) && (1 <= \old(cond)))) && (cond != 0);
    ensures (((1 <= counter) && (1 <= \old(cond)))) && (1);
@*/
void __VERIFIER_assert(int cond) {
    if (!(cond)) {
    ERROR:
        {/*@ assert(0); */;}
    }
    return;
}
int counter = 0;
/*@ 
    requires ((counter == 0));
    ensures ((\old(counter) == 0));
@*/
int main() {
  unsigned A, B;
  unsigned q, r, b;
    A = __VERIFIER_nondet_uint();
    B = 1;
    q = 0;
    r = A;
    b = B;
/*@
loop invariant (((\old(counter) == 0) && ((((A == r) && (counter == 0)) && (q == 0)) || (((A == r) && (1 <= counter)) && (q == 0)))));
@*/
    while (counter++<1) {
        if (!(r >= b)) break;
        b = 2 * b;
    }
/*@
loop invariant (((((A == r) && (1 <= counter)) && (\old(counter) == 0)) && (q == 0)));
@*/
    while (counter++<1) {
        __VERIFIER_assert(A == q * b + r);
        if (!(b != B)) break;
        q = 2 * q;
        b = b / 2;
        if (r >= b) {
            q = q + 1;
            r = r - b;
        }
    }
    __VERIFIER_assert(A == q * b + r);
    return 0;
}