{ w[r] = in[offset++] << 24 | (in[offset++] & 0xFF) << 16 | (in[offset++] & 0xFF) << 8 | (in[offset++] & 0xFF); }
w[r] =  in[offset++]         << 24 | (in[offset++] & 0xFF) << 16 | (in[offset++] & 0xFF) << 8 | (in[offset++] & 0xFF);
  sha(int hh0, int hh1, int hh2, int hh3, int hh4, byte[] in, int offset)  {    int A = hh0;    int B = hh1;    int C = hh2;    int D = hh3;    int E = hh4;    int r, T;    for (r = 0; r < 16; r++)      {        w[r] = in[offset++] << 24 | (in[offset++] & 0xFF) << 16               | (in[offset++] & 0xFF) << 8 | (in[offset++] & 0xFF);      }    for (r = 16; r < 80; r++)      {        T = w[r - 3] ^ w[r - 8] ^ w[r - 14] ^ w[r - 16];        w[r] = T << 1 | T >>> 31;      }    // rounds 0-19    for (r = 0; r < 20; r++)      {        T = (A << 5 | A >>> 27) + ((B & C) | (~B & D)) + E + w[r] + 0x5A827999;        E = D;        D = C;        C = B << 30 | B >>> 2;        B = A;        A = T;      }    // rounds 20-39    for (r = 20; r < 40; r++)      {        T = (A << 5 | A >>> 27) + (B ^ C ^ D) + E + w[r] + 0x6ED9EBA1;        E = D;        D = C;        C = B << 30 | B >>> 2;        B = A;        A = T;      }    // rounds 40-59    for (r = 40; r < 60; r++)      {        T = (A << 5 | A >>> 27) + (B & C | B & D | C & D) + E + w[r]            + 0x8F1BBCDC;        E = D;        D = C;        C = B << 30 | B >>> 2;        B = A;        A = T;      }    // rounds 60-79    for (r = 60; r < 80; r++)      {        T = (A << 5 | A >>> 27) + (B ^ C ^ D) + E + w[r] + 0xCA62C1D6;        E = D;        D = C;        C = B << 30 | B >>> 2;        B = A;        A = T;      }    return new int[] { hh0 + A, hh1 + B, hh2 + C, hh3 + D, hh4 + E };  }