use std::io::Result;
use async_compression::tokio::{bufread::ZstdDecoder, write::GzipEncoder};
use tokio::io::{stderr, stdin, stdout, BufReader};
use tokio::io::{
AsyncReadExt as _, AsyncWriteExt as _, };
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<()> {
let mut reader = ZstdDecoder::new(BufReader::new(stdin()));
let mut x: Vec<u8> = vec![];
reader.read_to_end(&mut x).await?;
let mut error = stderr();
error.write_all(x.len().to_string().as_bytes()).await?;
error.shutdown().await?;
let mut writer = GzipEncoder::new(stdout());
writer.write_all(&x).await?;
writer.shutdown().await?;
let mut res = writer.into_inner();
res.flush().await?;
Ok(())
}