code: protected ScriptBuilder bigNum(int index, long num) {
          final byte[] data;
  
          if (num == 0) {
              data = new byte[0];
          } else {
              Stack<Byte> result = new Stack<>();
              final boolean neg = num < 0;
              long absvalue = Math.abs(num);
  
              while (absvalue != 0) {
                  result.push((byte) (absvalue & 0xff));
                  absvalue >>= 8;
              }
  
              if ((result.peek() & 0x80) != 0) {
                  // The most significant byte is >= 0x80, so push an extra byte that
                  // contains just the sign of the value.
                  result.push((byte) (neg ? 0x80 : 0));
              } else if (neg) {
                  // The most significant byte is < 0x80 and the value is negative,
                  // set the sign bit so it is subtracted and interpreted as a
                  // negative when converting back to an integral.
                  result.push((byte) (result.pop() | 0x80));
              }
  
              data = new byte[result.size()];
              for (int byteIdx = 0; byteIdx < data.length; byteIdx++) {
                  data[byteIdx] = result.get(byteIdx);
              }
          }
  
          // At most the encoded value could take up to 8 bytes, so we don't need
          // to use OP_PUSHDATA opcodes
          return addChunk(index, new ScriptChunk(data.length, data));
      }
docs: Adds the given number as a push data chunk to the given index in the program.
  This is intended to use for negative numbers or values greater than 16, and although
  it will accept numbers in the range 0-16 inclusive, the encoding would be
  considered non-standard.
  
  @see #number(long)