auto continue_read_length = [&]
        {
            unsigned s;
            do
            {
                s = *ip++;
                length += s;
            } while (unlikely(s == 255));
        };
        auto token = *ip++;
        length = token >> 4;
        if (length == 0x0F)
            continue_read_length();
        stat.literal(length);
        ip += length;
        op += length;
        if (op > output_end)
            return;
        size_t offset = unalignedLoad<UInt16>(ip);
        ip += 2;
        length = token & 0x0F;
        if (length == 0x0F)
            continue_read_length();
        length += 4;
        stat.match(length, offset);
        op += length;
    }
}
}