// codesnip-guard: double_double #[cfg_attr(any(),rustfmt::skip)]pub use self::double_double::{DoubleDouble,QuadDouble};#[cfg_attr(any(),rustfmt::skip)]mod double_double{#![doc=" Floating-point expansions for computations within the normal f64 exponent range."]#![doc=" Intermediate overflow and underflow are not compensated."]#![doc=" Display prints the exact component sum; a precision rounds decimal places."]use super::{Bounded,Decimal,Float,One,Scan,ScanSource,Zero};use std::{cmp::Ordering,fmt::{self,Display},num::ParseFloatError,ops::{Add,Div,Index,Mul,Neg,Rem,Sub}};#[doc=" A nonoverlapping expansion of two f64 components."]#[doc=" Nominal precision decreases when trailing components become subnormal."]#[derive(Clone,Copy,Debug,Default,PartialEq)]pub struct DoubleDouble(f64,f64);#[doc=" A nonoverlapping expansion of four f64 components."]#[doc=" Nominal precision decreases when trailing components become subnormal."]#[derive(Clone,Copy,Debug,Default,PartialEq)]pub struct QuadDouble(f64,f64,f64,f64);const LN_2_REDUCTION:[f64;6]=[0.6931471805599453,2.3190468138462996e-17,5.707708438416212e-34,-3.5824322106018114e-50,-1.352169675798863e-66,6.080638740240814e-83];const PI:[f64;4]=[3.141592653589793,1.2246467991473532e-16,-2.9947698097183397e-33,1.1124542208633653e-49];const TAU:[f64;4]=[6.283185307179586,2.4492935982947064e-16,-5.989539619436679e-33,2.2249084417267306e-49];const FRAC_PI_2:[f64;4]=[1.5707963267948966,6.123233995736766e-17,-1.4973849048591698e-33,5.562271104316826e-50];const FRAC_PI_3:[f64;4]=[1.0471975511965979,-1.072081766451091e-16,-9.982566032394464e-34,-7.6956153601821505e-50];const FRAC_PI_4:[f64;4]=[0.7853981633974483,3.061616997868383e-17,-7.486924524295849e-34,2.781135552158413e-50];const FRAC_PI_6:[f64;4]=[0.5235987755982989,-5.360408832255455e-17,-4.991283016197232e-34,-3.8478076800910752e-50];const FRAC_PI_8:[f64;4]=[0.39269908169872414,1.5308084989341915e-17,-3.7434622621479246e-34,1.3905677760792066e-50];const FRAC_1_PI:[f64;4]=[0.3183098861837907,-1.9678676675182486e-17,-1.0721436282893004e-33,8.053563926594112e-50];const FRAC_2_PI:[f64;4]=[0.6366197723675814,-3.935735335036497e-17,-2.1442872565786008e-33,1.6107127853188224e-49];const FRAC_2_SQRT_PI:[f64;4]=[1.1283791670955126,1.533545961316588e-17,-4.765684596693686e-34,-2.007794661655263e-50];const SQRT_2:[f64;4]=[1.4142135623730951,-9.667293313452913e-17,4.1386753086994136e-33,4.935546991468351e-50];const FRAC_1_SQRT_2:[f64;4]=[0.7071067811865476,-4.833646656726457e-17,2.0693376543497068e-33,2.4677734957341755e-50];const E:[f64;4]=[2.718281828459045,1.4456468917292502e-16,-2.1277171080381768e-33,1.5156301598412191e-49];const LOG2_E:[f64;4]=[1.4426950408889634,2.0355273740931033e-17,-1.0614659956117258e-33,-1.3836716780181402e-50];const LOG10_E:[f64;4]=[0.4342944819032518,1.098319650216765e-17,3.717181233110959e-34,7.734484346504299e-51];const LN_2:[f64;4]=[0.6931471805599453,2.3190468138462996e-17,5.707708438416212e-34,-3.5824322106018114e-50];const LN_10:[f64;4]=[2.302585092994046,-2.1707562233822494e-16,-9.984262454465777e-33,-4.023357454450206e-49];const PI_2_REDUCTION:[f64;6]=[1.5707963267948966,6.123233995736766e-17,-1.4973849048591698e-33,5.562271104316826e-50,2.836115989820158e-66,8.724931080676243e-84];const fn scalar(value:f64)->[f64;N]{let mut result=[0.0;N];result[0]=value;result}const fn constant(values:[f64;4])->[f64;N]{let mut result=[0.0;N];let mut i=0;while i()->[f64;N]{scalar(f64::from_bits(((1023-if N==2{104}else{209})as u64)<<52))}fn two_sum(a:f64,b:f64)->(f64,f64){let sum=a+b;let v=sum-a;(sum,(a-(sum-v))+(b-v))}fn quick_two_sum(a:f64,b:f64)->(f64,f64){let sum=a+b;(sum,b-(sum-a))}fn two_prod(a:f64,b:f64)->(f64,f64){let product=a*b;let error=if cfg!(any(target_arch="aarch64",target_feature="fma")){a.mul_add(b,-product)}else{let split=|value|{let scaled=134217729.0*value;let high=scaled-(scaled-value);(high,value-high)};let(ah,al)=split(a);let(bh,bl)=split(b);((ah*bh-product)+ah*bl+al*bh)+al*bl};(product,error)}fn renormalize(mut values:[f64;M])->[f64;N]{if N==2&&M==3{let(s,e)=two_sum(values[1],values[2]);let(s,t)=two_sum(values[0],s);let(high,low)=two_sum(s,t+e);let mut result=scalar(high);result[1]=low;return result;}if N==4&&M==5{let(s,e3)=quick_two_sum(values[3],values[4]);let(s,e2)=quick_two_sum(values[2],s);let(s,e1)=quick_two_sum(values[1],s);let(mut r0,mut r1)=quick_two_sum(values[0],s);let(mut r2,mut r3)=(0.0,0.0);if r1!=0.0{(r1,r2)=quick_two_sum(r1,e1);if r2!=0.0{(r2,r3)=quick_two_sum(r2,e2);}else{(r1,r2)=quick_two_sum(r1,e2);}}else{(r0,r1)=quick_two_sum(r0,e1);if r1!=0.0{(r1,r2)=quick_two_sum(r1,e2);}else{(r0,r1)=quick_two_sum(r0,e2);}}if r3!=0.0{r3+=e3;}else if r2!=0.0{(r2,r3)=quick_two_sum(r2,e3);}else if r1!=0.0{(r1,r2)=quick_two_sum(r1,e3);}else{(r0,r1)=quick_two_sum(r0,e3);}let mut result=[0.0;N];result[..4].copy_from_slice(&[r0,r1,r2,r3]);return result;}let mut sum=values[M-1];for i in(0..M-1).rev(){(sum,values[i+1])=two_sum(values[i],sum);}let mut result=scalar(sum);let mut index=0;for value in values.into_iter().skip(1){let(sum,error)=two_sum(result[index],value);result[index]=sum;if error!=0.0&&index+1(values:[f64;M])->[f64;N]{let mut expansion=[0.0;M];let mut len=0;for mut value in values{if value==0.0{continue;}let mut end=0;for i in 0..len{let error;(value,error)=two_sum(value,expansion[i]);if error!=0.0{expansion[end]=error;end+=1;}}expansion[end]=value;len=end+1;}expansion[..len].reverse();expansion[len..].fill(0.0);renormalize(expansion)}fn float_exponent(value:f64)->i32{let bits=value.abs().to_bits();let biased=(bits>>52)as i32;if biased==0{63-bits.leading_zeros()as i32-1074}else{biased-1023}}fn scale(mut values:[f64;N],mut shift:i32)->[f64;N]{while shift!=0{let step=shift.clamp(-1022,1023);let factor=f64::from_bits(((step+1023)as u64)<<52);values=values.map(|x|x*factor);if!values[0].is_finite()||values[0]==0.0{return scalar(values[0]);}shift-=step;}values}fn parse(text:&str)->Result<[f64;N],ParseFloatError>{let first:f64=text.parse()?;let mut result=[0.0;N];result[0]=first;if!first.is_finite()||first==0.0{return Ok(result);}let(mantissa,exponent)=text.split_once(['e','E']).map_or((text,0),|(m,e)|(m,e.parse::().unwrap()));let negative=mantissa.starts_with('-');let mantissa=mantissa.trim_start_matches(['+','-']);let point=mantissa.find('.').unwrap_or(mantissa.len())as i64+exponent;let mut digits=mantissa.replace('.',"");if point<=0{digits="0.".to_owned()+&"0".repeat((-point)as usize)+&digits;}else if point as usize>=digits.len(){digits.push_str(&"0".repeat(point as usize-digits.len()));}else{digits.insert(point as usize,'.');}if negative{digits.insert(0,'-');}let mut remainder:Decimal=digits.parse().unwrap();for component in&mut result{*component=remainder.to_string().parse()?;remainder-=Decimal::from(*component);}Ok(renormalize(result))}fn decimal(values:&[f64])->Decimal{values.iter().fold(Decimal::zero(),|sum,&value|sum+Decimal::from(value))}fn format(values:&[f64],f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{if!values[0].is_finite()||values[0]==0.0{return std::fmt::Display::fmt(&values[0],f);}let value=decimal(values).to_string();let mut digits=value.trim_start_matches('-').to_owned();if let Some(precision)=f.precision(){let point=digits.find('.').unwrap_or(digits.len());if pointb'5'||bytes[end]==b'5'&&(bytes[end+1..].iter().any(|&x|x!=b'0')||!(bytes[end-1]-b'0').is_multiple_of(2));digits.truncate(end);if increment{let mut bytes=digits.into_bytes();let mut carry=true;for digit in bytes.iter_mut().rev(){if*digit!=b'9'{*digit+=1;carry=false;break;}*digit=b'0';}if carry{bytes.insert(0,b'1');}digits=String::from_utf8(bytes).unwrap();}}else{digits.push_str(&"0".repeat(end-digits.len()));}if precision!=0{digits.insert(digits.len()-precision,'.');}}f.pad_integral(!values[0].is_sign_negative(),"",&digits)}macro_rules!impl_float_expansion{($name:ident,$n:literal,$($field:tt),+)=>{impl$name{const fn components(self)->[f64;$n]{[$(self.$field),+]}const fn from_components(values:[f64;$n])->Self{Self($(values[$field]),+)}fn scale(self,exponent:i32)->Self{Self::from_components(scale(self.components(),exponent))}fn integral(self,ceil:bool)->Self{if!self.0 .is_finite()||self.0==0.0{return self;}let mut values=self.components();for i in 0..$n{let rounded=if ceil{values[i].ceil()}else{values[i].floor()};if rounded!=values[i]{values[i]=rounded;values[i+1..].fill(0.0);break;}}let mut result=Self::from_components(renormalize(values));if result.is_zero(){result.0=0.0f64 .copysign(self.0);}result}}impl Fromfor$name{fn from(value:f64)->Self{let mut values=[0.0;$n];values[0]=value;Self::from_components(values)}}impl From<$name>for f64{fn from(value:$name)->Self{value.0}}impl From<$name>for i64{fn from(value:$name)->Self{if value.is_nan(){return 0;}let value=value.trunc();if value>=$name::from(9223372036854775808.0){return i64::MAX;}if value<=$name::from(-9223372036854775808.0){return i64::MIN;}value.components().into_iter().map(|x|x as i128).sum::()as i64}}impl Display for$name{fn fmt(&self,f:&mut fmt::Formatter<'_>)->fmt::Result{format(&self.components(),f)}}impl std::str::FromStr for$name{type Err=std::num::ParseFloatError;fn from_str(text:&str)->Result{parse(text).map(Self::from_components)}}impl PartialOrd for$name{fn partial_cmp(&self,other:&Self)->Option{for(a,b)in self.components().into_iter().zip(other.components()){match a.partial_cmp(&b)?{Ordering::Equal=>{}order=>return Some(order),}}Some(Ordering::Equal)}}impl Bounded for$name{fn maximum()->Self{Self::MAX}fn minimum()->Self{Self::MIN}}impl Zero for$name{fn zero()->Self{Self::from(0.0)}fn is_zero(&self)->bool{self.0==0.0}}impl One for$name{fn one()->Self{Self::from(1.0)}fn is_one(&self)->bool{*self==Self::one()}}impl Scan for$name{type Output=Self;fn scan(iter:&mut I)->Option{iter.next_token()?.parse().ok()}}impl Div for$name{type Output=Self;fn div(self,rhs:Self)->Self{let mut quotient=[0.0;$n+1];quotient[0]=self.0/rhs.0;if!quotient[0].is_finite()||quotient[0]==0.0{return Self::from(quotient[0]);}let mut remainder=self;for i in 0..$n{remainder=remainder-rhs*quotient[i];quotient[i+1]=remainder.0/rhs.0;}Self::from_components(renormalize(quotient))}}impl Rem for$name{type Output=Self;#[doc=" Large quotients can lose low remainder bits during reduction."]fn rem(self,rhs:Self)->Self{if!self.is_finite()||rhs.is_nan()||rhs.is_zero(){return Self::NAN;}if rhs.is_infinite()||self.is_zero()||self.abs()=divisor{let mut quotient=(remainder/divisor).trunc();if!quotient.is_finite(){return Self::from(self.0%rhs.0);}if quotient.is_zero(){quotient=Self::one().copysign(remainder);}remainder=(-quotient).mul_add(divisor,remainder);}if remainder.0<0.0{remainder=remainder+divisor;}remainder.copysign(self)}}impl Float for$name{type Bits=[u64;$n];fn floor(self)->Self{self.integral(false)}fn ceil(self)->Self{self.integral(true)}fn round(self)->Self{if self.is_sign_negative(){(self+-0.5).ceil()}else{(self+0.5).floor()}}fn trunc(self)->Self{self.integral(self.is_sign_negative())}fn fract(self)->Self{self-self.trunc()}fn abs(self)->Self{if self.0 .is_sign_negative(){-self}else{self}}fn signum(self)->Self{Self::from(self.0 .signum())}fn copysign(self,sign:Self)->Self{if self.0 .is_sign_negative()==sign.0 .is_sign_negative(){self}else{-self}}#[doc=" Retains product components until after adding `b`."]#[doc=" Intermediate products must remain in the normal f64 range."]fn mul_add(self,a:Self,b:Self)->Self{if!self.is_finite()||!a.is_finite()||!b.is_finite(){return Self::from(self.0 .mul_add(a.0,b.0));}let mut terms=[0.0;2*$n*$n+$n];let mut index=0;for x in self.components(){for y in a.components(){let(product,error)=two_prod(x,y);terms[index]=product;terms[index+1]=error;index+=2;}}terms[index..].copy_from_slice(&b.components());Self::from_components(sum_terms(terms))}fn div_euclid(self,rhs:Self)->Self{let quotient=(self/rhs).trunc();if(self%rhs).0<0.0{quotient-Self::from(rhs.0 .signum())}else{quotient}}fn rem_euclid(self,rhs:Self)->Self{let remainder=self%rhs;if remainder.0<0.0{remainder+rhs.abs()}else{remainder}}#[doc=" Uses repeated squaring; rounding error can grow with `n.unsigned_abs()`."]fn powi(self,n:i32)->Self{if n==0{return Self::one();}if n==1{return self;}if!self.is_finite()||self.is_zero(){return Self::from(self.0 .powi(n));}let mut factor=if n<0{self.recip()}else{self};let mut result=Self::one();let mut power=n.unsigned_abs();while power!=0{if power&1!=0{result=result*factor;}power>>=1;if power!=0{factor=factor*factor;}}result}fn powf(self,n:Self)->Self{if n.is_zero()||self.is_one(){return Self::one();}if n.is_one(){return self;}if self.is_nan()||n.is_nan(){return Self::NAN;}if n.is_infinite(){return match self.abs().partial_cmp(&Self::one()).unwrap(){Ordering::Equal=>Self::one(),Ordering::Greater if n.is_sign_positive()=>Self::INFINITY,Ordering::Less if n.is_sign_negative()=>Self::INFINITY,_=>Self::zero(),};}let integer=n==n.trunc();let odd=integer&&!(n%Self::from(2.0)).is_zero();if self.is_zero()||self.is_infinite(){let result=Self::from(self.0 .abs().powf(n.0));return if self.is_sign_negative()&&odd{-result}else{result};}if self.is_sign_negative()&&!integer{return Self::NAN;}let result=(self.abs().ln()*n).exp();if self.is_sign_negative()&&odd{-result}else{result}}fn sqrt(self)->Self{if self.is_zero()||!self.is_finite()||self.0<0.0{return Self::from(self.0 .sqrt());}let exponent=float_exponent(self.0).div_euclid(2);let value=self.scale(-2*exponent);let mut root=Self::from(value.0 .sqrt());let half_reciprocal=0.5/root.0;for _ in 0..$n{root=root+(value-root*root)*half_reciprocal;}root.scale(exponent)}fn exp(self)->Self{if self.is_nan(){return self;}if self.0>710.0{return Self::INFINITY;}if self.0< -746.0{return Self::zero();}let exponent=(self.0/std::f64::consts::LN_2).round()as i32;let mut terms=[0.0;$n+12];terms[..$n].copy_from_slice(&self.components());for(i,value)in LN_2_REDUCTION.into_iter().enumerate(){let(product,error)=two_prod(-(exponent as f64),value);terms[$n+2*i]=product;terms[$n+2*i+1]=error;}let reduced=Self::from_components(sum_terms(terms)).scale(-8);let mut value=reduced.exp_m1();for _ in 0..8{value=value*(value+2.0);}(value+1.0).scale(exponent)}fn exp2(self)->Self{if self.is_nan(){return self;}if self.0>1024.0{return Self::INFINITY;}if self.0< -1075.0{return Self::zero();}let exponent=self.round().0 as i32;((self-Self::from(exponent as f64))*Self::LN_2).exp().scale(exponent)}fn ln(self)->Self{if!self.is_finite()||self.0<=0.0{return Self::from(self.0 .ln());}if self>=Self::from(0.5)&&self<=Self::from(1.5){return(self-Self::one()).ln_1p();}let exponent=float_exponent(self.0);let value=self.scale(-exponent);let mut logarithm=Self::from(value.0 .ln());for _ in 0..$n/2+1{logarithm=logarithm+(value*(-logarithm).exp()-Self::one());}logarithm+Self::LN_2*exponent as f64}fn log(self,base:Self)->Self{self.ln()/base.ln()}fn log2(self)->Self{self.ln()/Self::LN_2}fn log10(self)->Self{self.ln()/Self::LN_10}fn cbrt(self)->Self{if!self.is_finite()||self.is_zero(){return Self::from(self.0 .cbrt());}let exponent=float_exponent(self.0).div_euclid(3);let value=self.scale(-3*exponent);let mut root=Self::from(value.0 .cbrt());for _ in 0..$n/2+1{root=(root*2.0+value/(root*root))/Self::from(3.0);}root.scale(exponent)}fn hypot(self,other:Self)->Self{if self.is_infinite()||other.is_infinite(){return Self::INFINITY;}if self.is_nan()||other.is_nan(){return Self::NAN;}if self.is_zero(){return other.abs();}if other.is_zero(){return self.abs();}let maximum=self.0 .abs().max(other.0 .abs());let exponent=float_exponent(maximum);let a=self.scale(-exponent);let b=other.scale(-exponent);(a*a+b*b).sqrt().scale(exponent)}fn sin(self)->Self{self.sin_cos().0}fn cos(self)->Self{self.sin_cos().1}fn tan(self)->Self{let(sin,cos)=self.sin_cos();sin/cos}fn asin(self)->Self{if self.abs()>Self::one(){return Self::NAN;}self.atan2(((Self::one()-self.abs())*(Self::one()+self.abs())).sqrt())}fn acos(self)->Self{if self.abs()>Self::one(){return Self::NAN;}((Self::one()-self.abs())*(Self::one()+self.abs())).sqrt().atan2(self)}fn atan(self)->Self{if self.is_nan()||self.is_zero(){return self;}if self.is_infinite(){return Self::FRAC_PI_2.copysign(self);}let reciprocal=self.abs()>Self::one();let value=if reciprocal{self.abs().recip()}else{self.abs()};let mut angle=Self::from(value.0 .atan());for _ in 0..$n/2+1{let(sin,cos)=angle.sin_cos();angle=angle+(value*cos-sin)*cos;}if reciprocal{angle=Self::FRAC_PI_2-angle;}angle.copysign(self)}fn atan2(self,other:Self)->Self{if self.is_nan()||other.is_nan(){return Self::NAN;}let y=self.abs();let x=other.abs();let mut angle=if y.is_infinite()&&x.is_infinite(){Self::FRAC_PI_4}else if y.is_infinite(){Self::FRAC_PI_2}else if x.is_infinite()||y.is_zero(){Self::zero()}else if x.is_zero(){Self::FRAC_PI_2}else if y>x{Self::FRAC_PI_2-(x/y).atan()}else{(y/x).atan()};if other.is_sign_negative(){angle=Self::PI-angle;}angle.copysign(self)}#[doc=" Argument reduction uses expansion precision for `abs(self) < 2^52`."]#[doc=" Larger arguments use the leading component's f64 approximation."]fn sin_cos(self)->(Self,Self){if!self.is_finite(){return(Self::NAN,Self::NAN);}if self.is_zero(){return(self,Self::one());}let(quadrant,reduced)=if self.abs()<=Self::FRAC_PI_4{(0,self)}else{if self.0 .abs()>=4503599627370496.0{let(sin,cos)=self.0 .sin_cos();return(Self::from(sin),Self::from(cos));}let multiple=(self/Self::FRAC_PI_2).round().0;let mut terms=[0.0;$n+12];terms[..$n].copy_from_slice(&self.components());for(i,value)in PI_2_REDUCTION.into_iter().enumerate(){let(product,error)=two_prod(-multiple,value);terms[$n+2*i]=product;terms[$n+2*i+1]=error;}((multiple as i64).rem_euclid(4),Self::from_components(sum_terms(terms)))};let square=-(reduced*reduced);let mut sin=reduced;let mut cos=Self::one();let mut sin_term=reduced;let mut cos_term=Self::one();let mut k=2u32;loop{sin_term=sin_term*square/Self::from((k*(k+1))as f64);cos_term=cos_term*square/Self::from((k*(k-1))as f64);sin=sin+sin_term;cos=cos+cos_term;if cos_term.0 .abs()<=Self::EPSILON.0*0.015625{break;}k+=2;}match quadrant{0=>(sin,cos),1=>(cos,-sin),2=>(-sin,-cos),_=>(-cos,sin),}}fn exp_m1(self)->Self{if self.is_zero()||self.is_nan(){return self;}if self.0 .abs()>0.5{return self.exp()-Self::one();}let mut term=self;let mut sum=self;let mut k=2u32;loop{term=term*self/Self::from(k as f64);sum=sum+term;if term.0 .abs()<=sum.0 .abs()*Self::EPSILON.0*0.015625{break;}k+=1;}sum}fn ln_1p(self)->Self{if self.is_zero()||self.is_nan(){return self;}if self.0 .abs()0.5{return(self+1.0).ln();}let z=self/(self+2.0);let square=z*z;let mut power=z;let mut sum=z;let mut k=3u32;loop{power=power*square;let term=power/Self::from(k as f64);sum=sum+term;if term.0 .abs()<=sum.0 .abs()*Self::EPSILON.0*0.015625{break;}k+=2;}sum.scale(1)}fn sinh(self)->Self{if self.0 .abs()700.0{(value-Self::LN_2).exp()}else{let t=value.exp_m1();(t+t/(t+1.0)).scale(-1)};result.copysign(self)}fn cosh(self)->Self{let value=self.abs();if value.0>700.0{return(value-Self::LN_2).exp();}let t=value.exp();(t+t.recip()).scale(-1)}fn tanh(self)->Self{let t=(self.abs()*-2.0).exp_m1();(-t/(t+2.0)).copysign(self)}fn asinh(self)->Self{let value=self.abs();let result=if value.0>1e150{value.ln()+Self::LN_2}else{let square=value*value;(value+square/((square+1.0).sqrt()+1.0)).ln_1p()};result.copysign(self)}fn acosh(self)->Self{if self1e150{return self.ln()+Self::LN_2;}let t=self-Self::one();(t+(t*(self+1.0)).sqrt()).ln_1p()}fn atanh(self)->Self{let value=self.abs();if value>Self::one(){return Self::NAN;}(value.ln_1p()-(-value).ln_1p()).scale(-1).copysign(self)}fn is_nan(self)->bool{self.0 .is_nan()}fn is_infinite(self)->bool{self.0 .is_infinite()}fn is_finite(self)->bool{self.0 .is_finite()}fn is_normal(self)->bool{self.0 .is_normal()}fn classify(self)->std::num::FpCategory{self.0 .classify()}fn is_sign_positive(self)->bool{self.0 .is_sign_positive()}fn is_sign_negative(self)->bool{self.0 .is_sign_negative()}fn recip(self)->Self{Self::one()/self}fn to_degrees(self)->Self{self*(Self::from(180.0)/Self::PI)}fn to_radians(self)->Self{self*(Self::PI/Self::from(180.0))}fn max(self,other:Self)->Self{if self>other||other.is_nan(){self}else{other}}fn min(self,other:Self)->Self{if selfSelf{if!self.is_finite()||!other.is_finite(){return Self::from(self.0+other.0);}(self+other)*0.5}fn to_bits(self)->Self::Bits{self.components().map(f64::to_bits)}#[doc=" Components must be nonoverlapping and ordered by decreasing magnitude."]fn from_bits(bits:Self::Bits)->Self{Self::from_components(bits.map(f64::from_bits))}fn total_cmp(&self,other:&Self)->Ordering{for(a,b)in self.components().into_iter().zip(other.components()){let order=a.total_cmp(&b);if!order.is_eq(){return order;}}Ordering::Equal}fn clamp(self,min:Self,max:Self)->Self{assert!(min<=max);if selfmax{max}else{self}}const RADIX:u32=2;const MANTISSA_DIGITS:u32=if$n==2{104}else{209};const DIGITS:u32=if$n==2{31}else{62};#[doc=" Conservative nominal precision, not the gap to the successor of 1."]const EPSILON:Self=Self::from_components(epsilon());const MIN:Self=Self::from_components(scalar(f64::MIN));const MAX:Self=Self::from_components(scalar(f64::MAX));const MIN_POSITIVE:Self=Self::from_components(scalar(f64::MIN_POSITIVE));const MIN_EXP:i32=f64::MIN_EXP;const MAX_EXP:i32=f64::MAX_EXP;const MIN_10_EXP:i32=f64::MIN_10_EXP;const MAX_10_EXP:i32=f64::MAX_10_EXP;const NAN:Self=Self::from_components(scalar(f64::NAN));const INFINITY:Self=Self::from_components(scalar(f64::INFINITY));const NEG_INFINITY:Self=Self::from_components(scalar(f64::NEG_INFINITY));const PI:Self=Self::from_components(constant(PI));const TAU:Self=Self::from_components(constant(TAU));const FRAC_PI_2:Self=Self::from_components(constant(FRAC_PI_2));const FRAC_PI_3:Self=Self::from_components(constant(FRAC_PI_3));const FRAC_PI_4:Self=Self::from_components(constant(FRAC_PI_4));const FRAC_PI_6:Self=Self::from_components(constant(FRAC_PI_6));const FRAC_PI_8:Self=Self::from_components(constant(FRAC_PI_8));const FRAC_1_PI:Self=Self::from_components(constant(FRAC_1_PI));const FRAC_2_PI:Self=Self::from_components(constant(FRAC_2_PI));const FRAC_2_SQRT_PI:Self=Self::from_components(constant(FRAC_2_SQRT_PI));const SQRT_2:Self=Self::from_components(constant(SQRT_2));const FRAC_1_SQRT_2:Self=Self::from_components(constant(FRAC_1_SQRT_2));const E:Self=Self::from_components(constant(E));const LOG2_E:Self=Self::from_components(constant(LOG2_E));const LOG10_E:Self=Self::from_components(constant(LOG10_E));const LN_2:Self=Self::from_components(constant(LN_2));const LN_10:Self=Self::from_components(constant(LN_10));}};}impl Addfor DoubleDouble{type Output=Self;fn add(self,rhs:f64)->Self::Output{let sum=self.0+rhs;if!sum.is_finite()||self.0==0.0&&rhs==0.0{return Self::from(sum);}let(sum,error)=two_sum(self.0,rhs);let(high,low)=quick_two_sum(sum,error+self.1);Self(high,low)}}impl Addfor DoubleDouble{type Output=Self;fn add(self,rhs:Self)->Self::Output{let sum=self.0+rhs.0;if!sum.is_finite()||self.0==0.0&&rhs.0==0.0{return Self::from(sum);}let(sum,error)=two_sum(self.0,rhs.0);let(tail,tail_error)=two_sum(self.1,rhs.1);let(sum,error)=quick_two_sum(sum,error+tail);let(high,low)=quick_two_sum(sum,error+tail_error);Self(high,low)}}impl Sub for DoubleDouble{type Output=Self;fn sub(self,rhs:Self)->Self::Output{self+-rhs}}impl Neg for DoubleDouble{type Output=Self;fn neg(self)->Self::Output{Self(-self.0,-self.1)}}impl Mulfor DoubleDouble{type Output=Self;fn mul(self,rhs:f64)->Self::Output{let product=self.0*rhs;if!product.is_finite()||product==0.0{return Self::from(product);}let(product,error)=two_prod(self.0,rhs);let error=if cfg!(any(target_arch="aarch64",target_feature="fma")){self.1 .mul_add(rhs,error)}else{self.1*rhs+error};let(high,low)=quick_two_sum(product,error);Self(high,low)}}impl Mulfor DoubleDouble{type Output=Self;fn mul(self,rhs:Self)->Self::Output{let product=self.0*rhs.0;if!product.is_finite()||product==0.0{return Self::from(product);}let(product,error)=two_prod(self.0,rhs.0);let error=if cfg!(any(target_arch="aarch64",target_feature="fma")){self.0 .mul_add(rhs.1,self.1 .mul_add(rhs.0,error))}else{self.0*rhs.1+self.1*rhs.0+error};let(high,low)=quick_two_sum(product,error);Self(high,low)}}impl_float_expansion!(DoubleDouble,2,0,1);impl QuadDouble{fn renormalize(a0:f64,a1:f64,a2:f64,a3:f64,a4:f64)->Self{Self::from_components(renormalize([a0,a1,a2,a3,a4]))}}fn three_three_sum(a:f64,b:f64,c:f64)->(f64,f64,f64){let(u,v)=two_sum(a,b);let(r0,w)=two_sum(u,c);let(r1,r2)=two_sum(v,w);(r0,r1,r2)}fn three_two_sum(a:f64,b:f64,c:f64)->(f64,f64){let(u,v)=two_sum(a,b);let(r0,w)=two_sum(u,c);let r1=v+w;(r0,r1)}fn multiple_two_sum(xs:&[f64])->(f64,f64){let(mut high,mut low)=(xs[0],0.0);for&x in&xs[1..]{let(sum,error)=two_sum(high,x);high=sum;low+=error;}(high,low)}impl Addfor QuadDouble{type Output=Self;fn add(self,rhs:f64)->Self::Output{let sum=self.0+rhs;if!sum.is_finite()||self.0==0.0&&rhs==0.0{return Self::from(sum);}let(t0,e)=two_sum(self.0,rhs);let(t1,e)=two_sum(self.1,e);let(t2,e)=two_sum(self.2,e);let(t3,t4)=two_sum(self.3,e);Self::renormalize(t0,t1,t2,t3,t4)}}impl Addfor QuadDouble{type Output=Self;fn add(self,rhs:Self)->Self::Output{let sum=self.0+rhs.0;if!sum.is_finite()||self.0==0.0&&rhs.0==0.0{return Self::from(sum);}let(s0,e0)=two_sum(self.0,rhs.0);let(s1,e1)=two_sum(self.1,rhs.1);let(s2,e2)=two_sum(self.2,rhs.2);let(s3,e3)=two_sum(self.3,rhs.3);let(s1,e0)=two_sum(s1,e0);let(s2,e0,e1)=three_three_sum(s2,e0,e1);let(s3,e0)=three_two_sum(s3,e0,e2);Self::renormalize(s0,s1,s2,s3,e0+e1+e3)}}impl Sub for QuadDouble{type Output=Self;fn sub(self,rhs:Self)->Self::Output{self+-rhs}}impl Neg for QuadDouble{type Output=Self;fn neg(self)->Self::Output{Self(-self.0,-self.1,-self.2,-self.3)}}impl Mulfor QuadDouble{type Output=Self;fn mul(self,rhs:f64)->Self::Output{let product=self.0*rhs;if!product.is_finite()||product==0.0{return Self::from(product);}let(t0,e0)=two_prod(self.0,rhs);let(p1,e1)=two_prod(self.1,rhs);let(p2,e2)=two_prod(self.2,rhs);let p3=self.3*rhs;let(t1,e4)=two_sum(p1,e0);let(t2,e5,e6)=three_three_sum(p2,e1,e4);let(t3,e7)=three_two_sum(p3,e2,e5);let t4=e7+e6;Self::renormalize(t0,t1,t2,t3,t4)}}impl Mulfor QuadDouble{type Output=Self;fn mul(self,rhs:Self)->Self::Output{let product=self.0*rhs.0;if!product.is_finite()||product==0.0{return Self::from(product);}let(t0,q00)=two_prod(self.0,rhs.0);let(p01,q01)=two_prod(self.0,rhs.1);let(p10,q10)=two_prod(self.1,rhs.0);let(p02,q02)=two_prod(self.0,rhs.2);let(p11,q11)=two_prod(self.1,rhs.1);let(p20,q20)=two_prod(self.2,rhs.0);let p03=self.0*rhs.3;let p12=self.1*rhs.2;let p21=self.2*rhs.1;let p30=self.3*rhs.0;let(t1,e1,e2)=three_three_sum(q00,p01,p10);let(t2,e3)=multiple_two_sum(&[e1,q01,q10,p02,p11,p20]);let t3=e2+e3+q02+q11+q20+p03+p12+p21+p30;Self::renormalize(t0,t1,t2,t3,0.0)}}impl Indexfor QuadDouble{type Output=f64;fn index(&self,index:usize)->&Self::Output{match index{0=>&self.0,1=>&self.1,2=>&self.2,3=>&self.3,_=>panic!(),}}}impl_float_expansion!(QuadDouble,4,0,1,2,3);} // codesnip-guard: Decimal #[cfg_attr(any(),rustfmt::skip)]pub use self::decimal::Decimal;#[cfg_attr(any(),rustfmt::skip)]pub mod decimal{use super::{One,Scan,ScanSource,Zero};use std::{cmp::Ordering,ops::Neg};pub mod addsub{use super::*;use std::{mem::replace,ops::{Add,AddAssign,Sub,SubAssign}};fn add_carry(carry:bool,lhs:u64,rhs:u64,out:&mut u64)->bool{let mut sum=lhs+rhs+carry as u64;let cond=sum>=RADIX;if cond{sum-=RADIX;}*out=sum;cond}fn add_absolute_parts(lhs:&mut Decimal,rhs:&Decimal){let mut carry=false;let lhs_decimal_len=lhs.decimal.len();if lhs_decimal_lenbool{let(sum,borrow1)=lhs.overflowing_sub(rhs);let(mut sum,borrow2)=sum.overflowing_sub(borrow as u64);let borrow=borrow1||borrow2;if borrow{sum=sum.wrapping_add(RADIX);}*out=sum;borrow}fn sub_absolute_parts_gte(lhs:&Decimal,rhs:&mut Decimal){debug_assert!(matches!(lhs.cmp_absolute_parts(rhs),Ordering::Greater));let mut borrow=false;let rhs_decimal_len=rhs.decimal.len();if lhs.decimal.len()>rhs_decimal_len{for(l,r)in lhs.decimal[..rhs_decimal_len].iter().rev().zip(rhs.decimal.iter_mut().rev()){borrow=sub_borrow(borrow,*l,*r,r);}rhs.decimal.extend_from_slice(&lhs.decimal[rhs_decimal_len..]);}else{for r in rhs.decimal[lhs.decimal.len()..].iter_mut().rev(){borrow=sub_borrow(borrow,0,*r,r);}for(l,r)in lhs.decimal.iter().rev().zip(rhs.decimal[..lhs.decimal.len()].iter_mut().rev()){borrow=sub_borrow(borrow,*l,*r,r);}}let rhs_integer_len=rhs.integer.len();if lhs.integer.len()>rhs_integer_len{for(l,r)in lhs.integer[..rhs_integer_len].iter().zip(rhs.integer.iter_mut()){borrow=sub_borrow(borrow,*l,*r,r);}rhs.integer.extend_from_slice(&lhs.integer[rhs_integer_len..]);if borrow{for r in rhs.integer[rhs_integer_len..].iter_mut(){borrow=sub_borrow(borrow,*r,0,r);if!borrow{break;}}}}else{debug_assert_eq!(lhs.integer.len(),rhs_integer_len);for(l,r)in lhs.integer.iter().zip(&mut rhs.integer){borrow=sub_borrow(borrow,*l,*r,r);}}assert!(!borrow,"Cannot subtract lhs from rhs because lhs is smaller than rhs");rhs.normalize();}macro_rules!add{($lhs:expr,$lhs_owned:expr,$rhs:expr,$rhs_owned:expr)=>{match($lhs.sign,$rhs.sign){(Sign::Zero,_)=>$rhs_owned,(_,Sign::Zero)=>$lhs_owned,(Sign::Plus,Sign::Plus)|(Sign::Minus,Sign::Minus)=>{let mut lhs=$lhs_owned;add_absolute_parts(&mut lhs,&$rhs);lhs}(Sign::Plus,Sign::Minus)|(Sign::Minus,Sign::Plus)=>{match$lhs.cmp_absolute_parts(&$rhs){Ordering::Less=>{let mut lhs=$lhs_owned;sub_absolute_parts_gte(&$rhs,&mut lhs);lhs.sign=$rhs.sign;lhs}Ordering::Equal=>ZERO,Ordering::Greater=>{let mut rhs=$rhs_owned;sub_absolute_parts_gte(&$lhs,&mut rhs);rhs.sign=$lhs.sign;rhs}}}}};}macro_rules!sub{($lhs:expr,$lhs_owned:expr,$rhs:expr,$rhs_owned:expr)=>{match($lhs.sign,$rhs.sign){(Sign::Zero,_)=>-$rhs_owned,(_,Sign::Zero)=>$lhs_owned,(Sign::Plus,Sign::Minus)|(Sign::Minus,Sign::Plus)=>{let mut lhs=$lhs_owned;add_absolute_parts(&mut lhs,&$rhs);lhs}(Sign::Plus,Sign::Plus)|(Sign::Minus,Sign::Minus)=>{match$lhs.cmp_absolute_parts(&$rhs){Ordering::Less=>{let mut lhs=$lhs_owned;sub_absolute_parts_gte(&$rhs,&mut lhs);lhs.sign=-$rhs.sign;lhs}Ordering::Equal=>ZERO,Ordering::Greater=>{let mut rhs=$rhs_owned;sub_absolute_parts_gte(&$lhs,&mut rhs);rhs}}}}};}macro_rules!impl_binop{(impl$Trait:ident for Decimal,$method:ident,$macro:ident)=>{impl$Traitfor Decimal{type Output=Decimal;fn$method(self,rhs:Decimal)->Self::Output{$macro!(self,self,rhs,rhs)}}impl$Trait<&Decimal>for Decimal{type Output=Decimal;fn$method(self,rhs:&Decimal)->Self::Output{$macro!(self,self,rhs,rhs.clone())}}impl$Traitfor&Decimal{type Output=Decimal;fn$method(self,rhs:Decimal)->Self::Output{$macro!(self,self.clone(),rhs,rhs)}}impl$Trait<&Decimal>for&Decimal{type Output=Decimal;fn$method(self,rhs:&Decimal)->Self::Output{$macro!(self,self.clone(),rhs,rhs.clone())}}};}impl_binop!(impl Add for Decimal,add,add);impl_binop!(impl Sub for Decimal,sub,sub);macro_rules!impl_binop_assign{(impl$Trait:ident for Decimal,$method:ident,$op:tt)=>{impl$Trait for Decimal{fn$method(&mut self,rhs:Decimal){let lhs=replace(self,ZERO);*self=lhs$op rhs;}}impl$Trait<&Decimal>for Decimal{fn$method(&mut self,rhs:&Decimal){let lhs=replace(self,ZERO);*self=lhs$op rhs;}}};}impl_binop_assign!(impl AddAssign for Decimal,add_assign,+);impl_binop_assign!(impl SubAssign for Decimal,sub_assign,-);}pub mod convert{use super::*;use std::{fmt::{self,Display},str::FromStr};#[derive(Debug,Clone,PartialEq,Eq)]pub struct ParseDecimalError{kind:DecimalErrorKind}impl ParseDecimalError{fn empty()->Self{Self{kind:DecimalErrorKind::Empty}}fn invalid_digit()->Self{Self{kind:DecimalErrorKind::InvalidDigit}}}#[derive(Debug,Clone,PartialEq,Eq)]enum DecimalErrorKind{Empty,InvalidDigit}impl Display for ParseDecimalError{fn fmt(&self,f:&mut fmt::Formatter<'_>)->fmt::Result{match self.kind{DecimalErrorKind::Empty=>write!(f,"empty string"),DecimalErrorKind::InvalidDigit=>write!(f,"invalid digit"),}}}impl FromStr for Decimal{type Err=ParseDecimalError;fn from_str(s:&str)->Result{if s.is_empty(){return Err(ParseDecimalError::empty());}let(s,sign)=if let Some(s)=s.strip_prefix('+'){(s,Sign::Plus)}else if let Some(s)=s.strip_prefix('-'){(s,Sign::Minus)}else{(s,Sign::Plus)};let(integer_str,decimal_str)=if let Some((integer_str,decimal_str))=s.split_once('.'){(integer_str,decimal_str)}else{(s,"")};if!integer_str.is_ascii()||!decimal_str.is_ascii(){return Err(ParseDecimalError::invalid_digit());}let integer_bytes=integer_str.trim_start_matches('0').as_bytes();let decimal_bytes=decimal_str.trim_end_matches('0').as_bytes();let mut integer=Vec::with_capacity(integer_bytes.len().div_ceil(RADIX_LEN));for chunk in integer_bytes.rchunks(18){let chunk=unsafe{std::str::from_utf8_unchecked(chunk)};match chunk.parse::(){Ok(val)=>integer.push(val),Err(_)=>return Err(ParseDecimalError::invalid_digit()),}}let mut decimal=Vec::with_capacity(decimal_bytes.len().div_ceil(RADIX_LEN));for chunk in decimal_bytes.chunks(18){let chunk=unsafe{std::str::from_utf8_unchecked(chunk)};match chunk.parse::(){Ok(val)=>decimal.push(val*POW10[RADIX_LEN-chunk.len()]),Err(_)=>return Err(ParseDecimalError::invalid_digit()),}}let sign=if integer.is_empty()&&decimal.is_empty(){Sign::Zero}else{sign};Ok(Decimal{sign,integer,decimal})}}impl Display for Decimal{fn fmt(&self,f:&mut fmt::Formatter<'_>)->fmt::Result{match self.sign{Sign::Minus=>write!(f,"-")?,Sign::Zero=>return write!(f,"0"),Sign::Plus=>{}}if let Some(last)=self.integer.last(){write!(f,"{}",last)?;for&val in self.integer.iter().rev().skip(1){write!(f,"{:018}",val)?;}}else{write!(f,"0")?;}if let Some(last)=self.decimal.last(){write!(f,".")?;for&val in self.decimal.iter().take(self.decimal.len()-1){write!(f,"{:018}",val)?;}let mut l=0;let mut r=RADIX_LEN;while r-l>1{let m=l.midpoint(r);if last%POW10[m]==0{l=m;}else{r=m;}}debug_assert!(last%POW10[l]==0);debug_assert!(r==RADIX_LEN||last%POW10[r]!=0);write!(f,"{:0width$}",last/POW10[l],width=RADIX_LEN-l)?;}Ok(())}}impl Scan for Decimal{type Output=Self;fn scan(iter:&mut I)->Option{iter.next_token()?.parse().ok()}}macro_rules!impl_from_unsigned{($base:ty;$($t:ty)*)=>{$(impl From<$t>for Decimal{fn from(val:$t)->Self{if val==0{return Decimal::zero();}let mut val=val as$base;let mut integer=Vec::new();while val>0{integer.push((val%RADIX as$base)as u64);val/=RADIX as$base;}Decimal{sign:Sign::Plus,integer,decimal:Vec::new(),}}})*};}impl_from_unsigned!(u64;u8 u16 u32 u64 usize);impl_from_unsigned!(u128;u128);macro_rules!impl_from_signed{($base:ty;$($t:ty)*)=>{$(impl From<$t>for Decimal{fn from(val:$t)->Self{let d=Decimal::from(val.unsigned_abs()as$base);if val.is_negative(){-d}else{d}}})*};}impl_from_signed!(u64;i8 i16 i32 i64 isize);impl_from_signed!(u128;i128);impl Fromfor Decimal{fn from(value:f32)->Self{Self::from(f64::from(value))}}impl Fromfor Decimal{#[doc=" Preserves the exact binary value. The input must be finite."]fn from(value:f64)->Self{assert!(value.is_finite());let bits=value.to_bits();let exponent=((bits>>52)&0x7ff)as i32;let mantissa=(bits&((1<<52)-1))|(u64::from(exponent!=0)<<52);let mut result=Self::from(mantissa);let mut exponent=exponent.max(1)-1075;while exponent>0{let shift=exponent.min(60);let mut carry=0u128;for digit in&mut result.integer{let value=((*digit as u128)<>shift)as u64;remainder=value&mask;}while remainder!=0{let value=remainder*RADIX as u128;result.decimal.push((value>>shift)as u64);remainder=value&mask;}exponent+=shift;}if value.is_sign_negative(){result.sign=-result.sign;}result.normalize();result}}}#[derive(PartialEq,PartialOrd,Eq,Ord,Copy,Clone,Debug,Hash)]enum Sign{Minus,Zero,Plus}impl Neg for Sign{type Output=Self;fn neg(self)->Self::Output{match self{Sign::Minus=>Sign::Plus,Sign::Zero=>Sign::Zero,Sign::Plus=>Sign::Minus,}}}const ZERO:Decimal=Decimal{sign:Sign::Zero,integer:Vec::new(),decimal:Vec::new()};const POW10:[u64;RADIX_LEN+1]=[1,10,100,1_000,10_000,100_000,1_000_000,10_000_000,100_000_000,1_000_000_000,10_000_000_000,100_000_000_000,1_000_000_000_000,10_000_000_000_000,100_000_000_000_000,1_000_000_000_000_000,10_000_000_000_000_000,100_000_000_000_000_000,1_000_000_000_000_000_000];const RADIX:u64=POW10[RADIX_LEN];const RADIX_LEN:usize=18;#[derive(Clone,Debug,PartialEq,Eq,Hash)]pub struct Decimal{sign:Sign,integer:Vec,decimal:Vec}impl Default for Decimal{fn default()->Self{Decimal::zero()}}impl Zero for Decimal{fn zero()->Self{ZERO}fn is_zero(&self)->bool{self.sign==Sign::Zero}}impl One for Decimal{fn one()->Self{Decimal{sign:Sign::Plus,integer:vec![1],decimal:Vec::new()}}}impl PartialOrd for Decimal{fn partial_cmp(&self,other:&Self)->Option{Some(self.cmp(other))}}impl Ord for Decimal{fn cmp(&self,other:&Self)->Ordering{self.sign.cmp(&other.sign).then_with(| |match self.sign{Sign::Minus=>other.cmp_absolute_parts(self),Sign::Zero=>Ordering::Equal,Sign::Plus=>self.cmp_absolute_parts(other),})}}impl Neg for Decimal{type Output=Self;fn neg(self)->Self::Output{Self{sign:-self.sign,integer:self.integer,decimal:self.decimal}}}impl Decimal{fn cmp_absolute_parts(&self,other:&Self)->Ordering{self.integer.len().cmp(&other.integer.len()).then_with(| |self.integer.iter().rev().cmp(other.integer.iter().rev())).then_with(| |self.decimal.iter().cmp(other.decimal.iter()))}fn normalize(&mut self){if let Some(&0)=self.decimal.last(){let len=self.decimal.iter().rposition(|&d|d!=0).map_or(0,|i|i+1);self.decimal.truncate(len);}if self.decimal.len(){{use::std::mem::{ManuallyDrop,MaybeUninit};let mut$data:[MaybeUninit<_>;$len]=unsafe{MaybeUninit::uninit().assume_init()};$init;#[repr(C)]union __Transmuter{src:ManuallyDrop<[MaybeUninit;N]>,dst:ManuallyDrop<[T;N]>,}ManuallyDrop::into_inner(unsafe{__Transmuter{src:ManuallyDrop::new($data)}.dst})}};[||$e:expr;$len:expr]=>{$crate::array![@inner data=[data.iter_mut().for_each(|item|*item=MaybeUninit::new($e));$len]]};[|$i:pat_param|$e:expr;$len:expr]=>{$crate::array![@inner data=[data.iter_mut().enumerate().for_each(|($i,item)|*item=MaybeUninit::new($e));$len]]};[$e:expr;$len:expr]=>{{let e=$e;$crate::array![||Clone::clone(&e);$len]}};}} // codesnip-guard: bounded #[cfg_attr(any(),rustfmt::skip)]pub use self::bounded::Bounded;#[cfg_attr(any(),rustfmt::skip)]mod bounded{#[doc=" Trait for max/min bounds"]pub trait Bounded:Sized+PartialOrd{fn maximum()->Self;fn minimum()->Self;fn is_maximum(&self)->bool{self==&Self::maximum()}fn is_minimum(&self)->bool{self==&Self::minimum()}fn set_maximum(&mut self){*self=Self::maximum()}fn set_minimum(&mut self){*self=Self::minimum()}}macro_rules!impl_bounded_num{($($t:ident)*)=>{$(impl Bounded for$t{fn maximum()->Self{$t::MAX}fn minimum()->Self{$t::MIN}})*};}impl_bounded_num!(u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize f32 f64);macro_rules!impl_bounded_tuple{(@impl$($T:ident)*)=>{impl<$($T:Bounded),*>Bounded for($($T,)*){fn maximum()->Self{($(<$T as Bounded>::maximum(),)*)}fn minimum()->Self{($(<$T as Bounded>::minimum(),)*)}}};(@inner$($T:ident)*,)=>{impl_bounded_tuple!(@impl$($T)*);};(@inner$($T:ident)*,$U:ident$($Rest:ident)*)=>{impl_bounded_tuple!(@impl$($T)*);impl_bounded_tuple!(@inner$($T)*$U,$($Rest)*);};($T:ident$($Rest:ident)*)=>{impl_bounded_tuple!(@inner$T,$($Rest)*);};}impl_bounded_tuple!(A B C D E F G H I J);impl Bounded for(){fn maximum()->Self{}fn minimum()->Self{}}impl Bounded for bool{fn maximum()->Self{true}fn minimum()->Self{false}}implBounded for Optionwhere T:Bounded{fn maximum()->Self{Some(::maximum())}fn minimum()->Self{None}}implBounded for std::cmp::Reversewhere T:Bounded{fn maximum()->Self{std::cmp::Reverse(::minimum())}fn minimum()->Self{std::cmp::Reverse(::maximum())}}} // codesnip-guard: float #[cfg_attr(any(),rustfmt::skip)]pub use self::float::{Float,Float32,Float64};#[cfg_attr(any(),rustfmt::skip)]mod float{use super::{Bounded,One,Scan,ScanSource,Zero};use std::{cmp::Ordering,fmt::Display,num::FpCategory,ops::{Add,Div,Mul,Neg,Rem,Sub},str::FromStr};pub trait Float:Copy+Default+Display+FromStr+PartialEq+PartialOrd+Zero+One+Bounded+Add+Sub+Mul+Div+Neg+Rem{type Bits;fn floor(self)->Self;fn ceil(self)->Self;fn round(self)->Self;fn trunc(self)->Self;fn fract(self)->Self;fn abs(self)->Self;fn signum(self)->Self;fn copysign(self,sign:Self)->Self;fn mul_add(self,a:Self,b:Self)->Self;fn div_euclid(self,rhs:Self)->Self;fn rem_euclid(self,rhs:Self)->Self;fn powi(self,n:i32)->Self;fn powf(self,n:Self)->Self;fn sqrt(self)->Self;fn exp(self)->Self;fn exp2(self)->Self;fn ln(self)->Self;fn log(self,base:Self)->Self;fn log2(self)->Self;fn log10(self)->Self;fn cbrt(self)->Self;fn hypot(self,other:Self)->Self;fn sin(self)->Self;fn cos(self)->Self;fn tan(self)->Self;fn asin(self)->Self;fn acos(self)->Self;fn atan(self)->Self;fn atan2(self,other:Self)->Self;fn sin_cos(self)->(Self,Self);fn exp_m1(self)->Self;fn ln_1p(self)->Self;fn sinh(self)->Self;fn cosh(self)->Self;fn tanh(self)->Self;fn asinh(self)->Self;fn acosh(self)->Self;fn atanh(self)->Self;fn is_nan(self)->bool;fn is_infinite(self)->bool;fn is_finite(self)->bool;fn is_normal(self)->bool;fn classify(self)->FpCategory;fn is_sign_positive(self)->bool;fn is_sign_negative(self)->bool;fn recip(self)->Self;fn to_degrees(self)->Self;fn to_radians(self)->Self;fn max(self,other:Self)->Self;fn min(self,other:Self)->Self;fn midpoint(self,other:Self)->Self;fn to_bits(self)->Self::Bits;fn from_bits(v:Self::Bits)->Self;fn total_cmp(&self,other:&Self)->Ordering;fn clamp(self,min:Self,max:Self)->Self;const RADIX:u32;const MANTISSA_DIGITS:u32;const DIGITS:u32;const EPSILON:Self;const MIN:Self;const MIN_POSITIVE:Self;const MAX:Self;const MIN_EXP:i32;const MAX_EXP:i32;const MIN_10_EXP:i32;const MAX_10_EXP:i32;const NAN:Self;const INFINITY:Self;const NEG_INFINITY:Self;const PI:Self;const TAU:Self;const FRAC_PI_2:Self;const FRAC_PI_3:Self;const FRAC_PI_4:Self;const FRAC_PI_6:Self;const FRAC_PI_8:Self;const FRAC_1_PI:Self;const FRAC_2_PI:Self;const FRAC_2_SQRT_PI:Self;const SQRT_2:Self;const FRAC_1_SQRT_2:Self;const E:Self;const LOG2_E:Self;const LOG10_E:Self;const LN_2:Self;const LN_10:Self;}macro_rules!impl_primitive_float{($({$t:ident$i:ident$u:ident$e:expr})*)=>{$(impl Float for$t{type Bits=$u;fn floor(self)->Self{$t::floor(self)}fn ceil(self)->Self{$t::ceil(self)}fn round(self)->Self{$t::round(self)}fn trunc(self)->Self{$t::trunc(self)}fn fract(self)->Self{$t::fract(self)}fn abs(self)->Self{$t::abs(self)}fn signum(self)->Self{$t::signum(self)}fn copysign(self,sign:Self)->Self{$t::copysign(self,sign)}fn mul_add(self,a:Self,b:Self)->Self{$t::mul_add(self,a,b)}fn div_euclid(self,rhs:Self)->Self{$t::div_euclid(self,rhs)}fn rem_euclid(self,rhs:Self)->Self{$t::rem_euclid(self,rhs)}fn powi(self,n:i32)->Self{$t::powi(self,n)}fn powf(self,n:Self)->Self{$t::powf(self,n)}fn sqrt(self)->Self{$t::sqrt(self)}fn exp(self)->Self{$t::exp(self)}fn exp2(self)->Self{$t::exp2(self)}fn ln(self)->Self{$t::ln(self)}fn log(self,base:Self)->Self{$t::log(self,base)}fn log2(self)->Self{$t::log2(self)}fn log10(self)->Self{$t::log10(self)}fn cbrt(self)->Self{$t::cbrt(self)}fn hypot(self,other:Self)->Self{$t::hypot(self,other)}fn sin(self)->Self{$t::sin(self)}fn cos(self)->Self{$t::cos(self)}fn tan(self)->Self{$t::tan(self)}fn asin(self)->Self{$t::asin(self)}fn acos(self)->Self{$t::acos(self)}fn atan(self)->Self{$t::atan(self)}fn atan2(self,other:Self)->Self{$t::atan2(self,other)}fn sin_cos(self)->(Self,Self){$t::sin_cos(self)}fn exp_m1(self)->Self{$t::exp_m1(self)}fn ln_1p(self)->Self{$t::ln_1p(self)}fn sinh(self)->Self{$t::sinh(self)}fn cosh(self)->Self{$t::cosh(self)}fn tanh(self)->Self{$t::tanh(self)}fn asinh(self)->Self{$t::asinh(self)}fn acosh(self)->Self{$t::acosh(self)}fn atanh(self)->Self{$t::atanh(self)}fn is_nan(self)->bool{$t::is_nan(self)}fn is_infinite(self)->bool{$t::is_infinite(self)}fn is_finite(self)->bool{$t::is_finite(self)}fn is_normal(self)->bool{$t::is_normal(self)}fn classify(self)->std::num::FpCategory{$t::classify(self)}fn is_sign_positive(self)->bool{$t::is_sign_positive(self)}fn is_sign_negative(self)->bool{$t::is_sign_negative(self)}fn recip(self)->Self{$t::recip(self)}fn to_degrees(self)->Self{$t::to_degrees(self)}fn to_radians(self)->Self{$t::to_radians(self)}fn max(self,other:Self)->Self{$t::max(self,other)}fn min(self,other:Self)->Self{$t::min(self,other)}fn midpoint(self,other:Self)->Self{$t::midpoint(self,other)}fn to_bits(self)->Self::Bits{$t::to_bits(self)}fn from_bits(v:Self::Bits)->Self{$t::from_bits(v)}fn total_cmp(&self,other:&Self)->Ordering{$t::total_cmp(self,other)}fn clamp(self,min:Self,max:Self)->Self{$t::clamp(self,min,max)}const RADIX:u32=$t::RADIX;const MANTISSA_DIGITS:u32=$t::MANTISSA_DIGITS;const DIGITS:u32=$t::DIGITS;const EPSILON:Self=$t::EPSILON;const MIN:Self=$t::MIN;const MIN_POSITIVE:Self=$t::MIN_POSITIVE;const MAX:Self=$t::MAX;const MIN_EXP:i32=$t::MIN_EXP;const MAX_EXP:i32=$t::MAX_EXP;const MIN_10_EXP:i32=$t::MIN_10_EXP;const MAX_10_EXP:i32=$t::MAX_10_EXP;const NAN:Self=$t::NAN;const INFINITY:Self=$t::INFINITY;const NEG_INFINITY:Self=$t::NEG_INFINITY;const PI:Self=std::$t::consts::PI;const TAU:Self=std::$t::consts::PI*2.0;const FRAC_PI_2:Self=std::$t::consts::FRAC_PI_2;const FRAC_PI_3:Self=std::$t::consts::FRAC_PI_3;const FRAC_PI_4:Self=std::$t::consts::FRAC_PI_4;const FRAC_PI_6:Self=std::$t::consts::FRAC_PI_6;const FRAC_PI_8:Self=std::$t::consts::FRAC_PI_8;const FRAC_1_PI:Self=std::$t::consts::FRAC_1_PI;const FRAC_2_PI:Self=std::$t::consts::FRAC_2_PI;const FRAC_2_SQRT_PI:Self=std::$t::consts::FRAC_2_SQRT_PI;const SQRT_2:Self=std::$t::consts::SQRT_2;const FRAC_1_SQRT_2:Self=std::$t::consts::FRAC_1_SQRT_2;const E:Self=std::$t::consts::E;const LOG2_E:Self=std::$t::consts::LOG2_E;const LOG10_E:Self=std::$t::consts::LOG10_E;const LN_2:Self=std::$t::consts::LN_2;const LN_10:Self=std::$t::consts::LN_10;})*};}impl_primitive_float!({f32 i32 u32 31}{f64 i64 u64 63});macro_rules!impl_ord_float{($({$t:ident$n:ident})*)=>{$(#[derive(Debug,Copy,Clone,Default)]#[repr(transparent)]pub struct$n(pub$t);impl std::fmt::Display for$n{fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{<$t as std::fmt::Display>::fmt(&self.0,f)}}impl std::str::FromStr for$n{type Err=std::num::ParseFloatError;fn from_str(s:&str)->Result{<$t as std::str::FromStr>::from_str(s).map(Self)}}impl From<$t>for$n{fn from(x:$t)->Self{Self(x)}}impl Zero for$n{fn zero()->Self{Self(<$t as Zero>::zero())}fn is_zero(&self)->bool{self.0==0.0}}impl One for$n{fn one()->Self{Self(<$t as One>::one())}}impl Bounded for$n{fn maximum()->Self{Self(<$t as Bounded>::maximum())}fn minimum()->Self{Self(<$t as Bounded>::minimum())}}impl Add for$n{type Output=Self;fn add(self,rhs:Self)->Self::Output{Self(<$t as Add>::add(self.0,rhs.0))}}impl Sub for$n{type Output=Self;fn sub(self,rhs:Self)->Self::Output{Self(<$t as Sub>::sub(self.0,rhs.0))}}impl Mul for$n{type Output=Self;fn mul(self,rhs:Self)->Self::Output{Self(<$t as Mul>::mul(self.0,rhs.0))}}impl Div for$n{type Output=Self;fn div(self,rhs:Self)->Self::Output{Self(<$t as Div>::div(self.0,rhs.0))}}impl Neg for$n{type Output=Self;fn neg(self)->Self::Output{Self(<$t as Neg>::neg(self.0))}}impl Rem for$n{type Output=Self;fn rem(self,rhs:Self)->Self::Output{Self(<$t as Rem>::rem(self.0,rhs.0))}}impl PartialEq for$n{fn eq(&self,other:&Self)->bool{self.total_cmp(other).is_eq()}}impl Eq for$n{}impl PartialOrd for$n{fn partial_cmp(&self,other:&Self)->Option{Some(self.cmp(other))}}impl Ord for$n{fn cmp(&self,other:&Self)->Ordering{self.total_cmp(other)}}impl Scan for$n{type Output=Self;fn scan(iter:&mut I)->Option{<$t as Scan>::scan(iter).map(Self)}}impl Float for$n{type Bits=<$t as Float>::Bits;fn floor(self)->Self{Self(<$t as Float>::floor(self.0))}fn ceil(self)->Self{Self(<$t as Float>::ceil(self.0))}fn round(self)->Self{Self(<$t as Float>::round(self.0))}fn trunc(self)->Self{Self(<$t as Float>::trunc(self.0))}fn fract(self)->Self{Self(<$t as Float>::fract(self.0))}fn abs(self)->Self{Self(<$t as Float>::abs(self.0))}fn signum(self)->Self{Self(<$t as Float>::signum(self.0))}fn copysign(self,sign:Self)->Self{Self(<$t as Float>::copysign(self.0,sign.0))}fn mul_add(self,a:Self,b:Self)->Self{Self(<$t as Float>::mul_add(self.0,a.0,b.0))}fn div_euclid(self,rhs:Self)->Self{Self(<$t as Float>::div_euclid(self.0,rhs.0))}fn rem_euclid(self,rhs:Self)->Self{Self(<$t as Float>::rem_euclid(self.0,rhs.0))}fn powi(self,n:i32)->Self{Self(<$t as Float>::powi(self.0,n))}fn powf(self,n:Self)->Self{Self(<$t as Float>::powf(self.0,n.0))}fn sqrt(self)->Self{Self(<$t as Float>::sqrt(self.0))}fn exp(self)->Self{Self(<$t as Float>::exp(self.0))}fn exp2(self)->Self{Self(<$t as Float>::exp2(self.0))}fn ln(self)->Self{Self(<$t as Float>::ln(self.0))}fn log(self,base:Self)->Self{Self(<$t as Float>::log(self.0,base.0))}fn log2(self)->Self{Self(<$t as Float>::log2(self.0))}fn log10(self)->Self{Self(<$t as Float>::log10(self.0))}fn cbrt(self)->Self{Self(<$t as Float>::cbrt(self.0))}fn hypot(self,other:Self)->Self{Self(<$t as Float>::hypot(self.0,other.0))}fn sin(self)->Self{Self(<$t as Float>::sin(self.0))}fn cos(self)->Self{Self(<$t as Float>::cos(self.0))}fn tan(self)->Self{Self(<$t as Float>::tan(self.0))}fn asin(self)->Self{Self(<$t as Float>::asin(self.0))}fn acos(self)->Self{Self(<$t as Float>::acos(self.0))}fn atan(self)->Self{Self(<$t as Float>::atan(self.0))}fn atan2(self,other:Self)->Self{Self(<$t as Float>::atan2(self.0,other.0))}fn sin_cos(self)->(Self,Self){let(sin,cos)=<$t as Float>::sin_cos(self.0);(Self(sin),Self(cos))}fn exp_m1(self)->Self{Self(<$t as Float>::exp_m1(self.0))}fn ln_1p(self)->Self{Self(<$t as Float>::ln_1p(self.0))}fn sinh(self)->Self{Self(<$t as Float>::sinh(self.0))}fn cosh(self)->Self{Self(<$t as Float>::cosh(self.0))}fn tanh(self)->Self{Self(<$t as Float>::tanh(self.0))}fn asinh(self)->Self{Self(<$t as Float>::asinh(self.0))}fn acosh(self)->Self{Self(<$t as Float>::acosh(self.0))}fn atanh(self)->Self{Self(<$t as Float>::atanh(self.0))}fn is_nan(self)->bool{<$t as Float>::is_nan(self.0)}fn is_infinite(self)->bool{<$t as Float>::is_infinite(self.0)}fn is_finite(self)->bool{<$t as Float>::is_finite(self.0)}fn is_normal(self)->bool{<$t as Float>::is_normal(self.0)}fn classify(self)->std::num::FpCategory{<$t as Float>::classify(self.0)}fn is_sign_positive(self)->bool{<$t as Float>::is_sign_positive(self.0)}fn is_sign_negative(self)->bool{<$t as Float>::is_sign_negative(self.0)}fn recip(self)->Self{Self(<$t as Float>::recip(self.0))}fn to_degrees(self)->Self{Self(<$t as Float>::to_degrees(self.0))}fn to_radians(self)->Self{Self(<$t as Float>::to_radians(self.0))}fn max(self,other:Self)->Self{Self(<$t as Float>::max(self.0,other.0))}fn min(self,other:Self)->Self{Self(<$t as Float>::min(self.0,other.0))}fn midpoint(self,other:Self)->Self{Self(<$t as Float>::midpoint(self.0,other.0))}fn to_bits(self)->Self::Bits{<$t as Float>::to_bits(self.0)}fn from_bits(v:Self::Bits)->Self{Self(<$t as Float>::from_bits(v))}fn total_cmp(&self,other:&Self)->Ordering{<$t as Float>::total_cmp(&self.0,&other.0)}fn clamp(self,min:Self,max:Self)->Self{Self(<$t as Float>::clamp(self.0,min.0,max.0))}const RADIX:u32=<$t as Float>::RADIX;const MANTISSA_DIGITS:u32=<$t as Float>::MANTISSA_DIGITS;const DIGITS:u32=<$t as Float>::DIGITS;const EPSILON:Self=Self(<$t as Float>::EPSILON);const MIN:Self=Self(<$t as Float>::MIN);const MIN_POSITIVE:Self=Self(<$t as Float>::MIN_POSITIVE);const MAX:Self=Self(<$t as Float>::MAX);const MIN_EXP:i32=<$t as Float>::MIN_EXP;const MAX_EXP:i32=<$t as Float>::MAX_EXP;const MIN_10_EXP:i32=<$t as Float>::MIN_10_EXP;const MAX_10_EXP:i32=<$t as Float>::MAX_10_EXP;const NAN:Self=Self(<$t as Float>::NAN);const INFINITY:Self=Self(<$t as Float>::INFINITY);const NEG_INFINITY:Self=Self(<$t as Float>::NEG_INFINITY);const PI:Self=Self(<$t as Float>::PI);const TAU:Self=Self(<$t as Float>::TAU);const FRAC_PI_2:Self=Self(<$t as Float>::FRAC_PI_2);const FRAC_PI_3:Self=Self(<$t as Float>::FRAC_PI_3);const FRAC_PI_4:Self=Self(<$t as Float>::FRAC_PI_4);const FRAC_PI_6:Self=Self(<$t as Float>::FRAC_PI_6);const FRAC_PI_8:Self=Self(<$t as Float>::FRAC_PI_8);const FRAC_1_PI:Self=Self(<$t as Float>::FRAC_1_PI);const FRAC_2_PI:Self=Self(<$t as Float>::FRAC_2_PI);const FRAC_2_SQRT_PI:Self=Self(<$t as Float>::FRAC_2_SQRT_PI);const SQRT_2:Self=Self(<$t as Float>::SQRT_2);const FRAC_1_SQRT_2:Self=Self(<$t as Float>::FRAC_1_SQRT_2);const E:Self=Self(<$t as Float>::E);const LOG2_E:Self=Self(<$t as Float>::LOG2_E);const LOG10_E:Self=Self(<$t as Float>::LOG10_E);const LN_2:Self=Self(<$t as Float>::LN_2);const LN_10:Self=Self(<$t as Float>::LN_10);})*};}impl_ord_float!({f32 Float32}{f64 Float64});} // codesnip-guard: scanner #[cfg_attr(any(),rustfmt::skip)]pub use self::scanner::*;#[cfg_attr(any(),rustfmt::skip)]mod scanner{use std::{iter::{FromIterator,from_fn,repeat_with},marker::PhantomData};pub fn read_stdin_all()->String{use std::io::Read as _;let mut s=String::new();std::io::stdin().read_to_string(&mut s).expect("io error");s}pub fn read_stdin_all_unchecked()->String{use std::io::Read as _;let mut buf=Vec::new();std::io::stdin().read_to_end(&mut buf).expect("io error");unsafe{String::from_utf8_unchecked(buf)}}pub fn read_all(mut reader:impl std::io::Read)->String{let mut s=String::new();reader.read_to_string(&mut s).expect("io error");s}pub fn read_all_unchecked(mut reader:impl std::io::Read)->String{let mut buf=Vec::new();reader.read_to_end(&mut buf).expect("io error");unsafe{String::from_utf8_unchecked(buf)}}pub fn read_stdin_line()->String{let mut s=String::new();std::io::stdin().read_line(&mut s).expect("io error");s}pub trait Scan:Sized{type Output;fn scan(source:&mut S)->Option;fn scan_vec(source:&mut S,size:usize,capacity:usize)->Vec{let mut values=Vec::with_capacity(capacity.max(size));values.extend((0..size).map(|_|source.scan::()));values}}pub trait MarkedScan:Sized{type Output;fn mscan(self,source:&mut S)->Option;}pub trait ScanSource:Sized{#[doc=" Reads a token under the source's input requirements."]#[doc=" Checked sources return `None` at EOF; unchecked sources require available input."]fn next_token(&mut self)->Option<&str>;#[doc=" Skips separators without consuming the next token."]#[inline]fn skip_whitespace(&mut self){}#[inline]fn read_u8(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_u16(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_u32(&mut self)->Option{self.next_token()?.parse().ok()}fn read_u32_vec(&mut self,size:usize,capacity:usize)->Vec{let mut values=Vec::with_capacity(capacity.max(size));values.extend((0..size).map(|_|self.scan::()));values}#[inline]fn read_u64(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_u128(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_usize(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_i8(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_i16(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_i32(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_i64(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_i128(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_isize(&mut self)->Option{self.next_token()?.parse().ok()}#[doc=" Panics if reading fails."]#[inline]fn scan(&mut self)->T::Output{T::scan(self).expect("scan error")}#[doc=" Panics if reading fails."]#[inline]fn mscan(&mut self,marker:T)->T::Output{marker.mscan(self).expect("scan error")}fn scan_vec(&mut self,size:usize,capacity:usize)->Vec{if size==0{self.skip_whitespace();}T::scan_vec(self,size,capacity)}#[inline]fn iter(&mut self)->ScannerIter<'_,Self,T>{ScannerIter{inner:self,_marker:PhantomData}}}#[derive(Clone,Debug)]pub struct Scanner<'a,I:Iterator=std::str::SplitAsciiWhitespace<'a>>{iter:I}impl<'a>Scanner<'a>{pub fn new(s:&'a str)->Self{Self{iter:s.split_ascii_whitespace()}}}impl<'a,I:Iterator>Scanner<'a,I>{pub fn new_from_iter(iter:I)->Self{Self{iter}}}impl<'a,I:Iterator>ScanSource for Scanner<'a,I>{fn next_token(&mut self)->Option<&str>{self.iter.next()}}macro_rules!impl_scan{($($t:ty)*)=>{$(impl Scan for$t{type Output=Self;fn scan(iter:&mut I)->Option{iter.next_token()?.parse::<$t>().ok()}})*};}impl_scan!(char f32 f64 String);macro_rules!impl_integer_scan{($($t:ty=>$read:ident),*$(,)?)=>{$(impl Scan for$t{type Output=Self;#[inline]fn scan(source:&mut S)->Option{source.$read()}})*};}impl_integer_scan!(u8=>read_u8,u16=>read_u16,u64=>read_u64,u128=>read_u128,usize=>read_usize,i8=>read_i8,i16=>read_i16,i32=>read_i32,i64=>read_i64,i128=>read_i128,isize=>read_isize,);impl Scan for u32{type Output=Self;#[inline]fn scan(source:&mut S)->Option{source.read_u32()}fn scan_vec(source:&mut S,size:usize,capacity:usize)->Vec{source.read_u32_vec(size,capacity)}}macro_rules!impl_scan_tuple{(@impl$($T:ident)*)=>{impl<$($T:Scan),*>Scan for($($T,)*){type Output=($(<$T as Scan>::Output,)*);fn scan(_iter:&mut It)->Option{Some(($(<$T as Scan>::scan(_iter)?,)*))}}};(@inner$($T:ident)*,)=>{impl_scan_tuple!(@impl$($T)*);};(@inner$($T:ident)*,$U:ident$($Rest:ident)*)=>{impl_scan_tuple!(@impl$($T)*);impl_scan_tuple!(@inner$($T)*$U,$($Rest)*);};($($T:ident)*)=>{impl_scan_tuple!(@inner,$($T)*);};}impl_scan_tuple!(A B C D E F G H I J K);pub struct ScannerIter<'a,S,T>{inner:&'a mut S,_marker:PhantomDataT>}implIterator for ScannerIter<'_,S,T>{type Item=T::Output;#[inline]fn next(&mut self)->Option{T::scan(self.inner)}}#[doc=" scan a value with Scanner"]#[doc=""]#[doc=" - `scan_value!(scanner, ELEMENT)`"]#[doc=""]#[doc=" ELEMENT :="]#[doc=" - `$ty`: Scan"]#[doc=" - `&str`: borrowed token; the source stays borrowed until its last use"]#[doc=" - `@$expr`: MarkedScan"]#[doc=" - `$ty = $expr`: MarkedScan"]#[doc=" - `[ELEMENT; $expr]`: vector"]#[doc=" - `[$ty; $len; capacity $capacity]`: vector with reserved capacity"]#[doc=" - `[ELEMENT; const $expr]`: array"]#[doc=" - `[ELEMENT]`: iterator"]#[doc=" - `[ELEMENT; iter $expr]`: iterator of the specified length"]#[doc=" - `($(ELEMENT)*,)`: tuple"]#[macro_export]macro_rules!scan_value{(@repeat$scanner:expr,[$($t:tt)*]$len:expr)=>{{$crate::scan_value!(@iter$scanner,[$($t)*]$len).collect::>()}};(@repeat$scanner:expr,[$($t:tt)*])=>{{::std::iter::repeat_with(||$crate::scan_value!(@inner$scanner,[]$($t)*))}};(@iter$scanner:expr,[$($t:tt)*]$len:expr)=>{{let size=$len;if size==0{$scanner.skip_whitespace();}$crate::scan_value!(@repeat$scanner,[$($t)*]).take(size)}};(@array$scanner:expr,[$($t:tt)*]$len:expr)=>{{if$len==0{$scanner.skip_whitespace();}$crate::array![||$crate::scan_value!(@inner$scanner,[]$($t)*);$len]}};(@tuple$scanner:expr,[$([$($args:tt)*])*])=>{($($($args)*,)*)};(@sparen$scanner:expr,[]@$e:expr;$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[@$e]$($t)*)};(@sparen$scanner:expr,[]($($tt:tt)*);$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[($($tt)*)]$($t)*)};(@sparen$scanner:expr,[][$($tt:tt)*];$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[[$($tt)*]]$($t)*)};(@sparen$scanner:expr,[]$ty:ty=$e:expr;$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[$ty=$e]$($t)*)};(@sparen$scanner:expr,[]$ty:ty;$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[$ty]$($t)*)};(@sparen$scanner:expr,[]$($args:tt)*)=>{$crate::scan_value!(@repeat$scanner,[$($args)*])};(@sparen$scanner:expr,[$($args:tt)+]const$len:expr)=>{$crate::scan_value!(@array$scanner,[$($args)+]$len)};(@sparen$scanner:expr,[$($args:tt)+]iter$len:expr)=>{$crate::scan_value!(@iter$scanner,[$($args)+]$len)};(@sparen$scanner:expr,[$($args:tt)+]$len:expr;capacity$capacity:expr)=>{{let size=$len;let capacity=$capacity;$scanner.scan_vec::<$($args)+>(size,capacity)}};(@sparen$scanner:expr,[$($args:tt)+]$len:expr)=>{$crate::scan_value!(@repeat$scanner,[$($args)+]$len)};(@$tag:ident$scanner:expr,[[$($args:tt)*]])=>{$($args)*};(@$tag:ident$scanner:expr,[$($args:tt)*]@$e:expr$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$scanner.mscan($e)]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*]($($tuple:tt)*)$($t:tt)*)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$crate::scan_value!(@tuple$scanner,[]$($tuple)*)]]$($t)*)};(@$tag:ident$scanner:expr,[$($args:tt)*][$($tt:tt)*]$($t:tt)*)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$crate::scan_value!(@sparen$scanner,[]$($tt)*)]]$($t)*)};(@$tag:ident$scanner:expr,[$($args:tt)*]&str$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$scanner.next_token().expect("scan error")]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*]$ty:ty=$e:expr$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[{let _tmp:$ty=$scanner.mscan($e);_tmp}]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*]$ty:ty$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$scanner.scan::<$ty>()]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*],$($t:tt)*)=>{$crate::scan_value!(@$tag$scanner,[$($args)*]$($t)*)};(@$tag:ident$scanner:expr,[$($args:tt)*])=>{::std::compile_error!(::std::stringify!($($args)*))};(src=$src:expr,$($t:tt)*)=>{{let mut __scanner=Scanner::new($src);$crate::scan_value!(@inner __scanner,[]$($t)*)}};(iter=$iter:expr,$($t:tt)*)=>{{let mut __scanner=Scanner::new_from_iter($iter);$crate::scan_value!(@inner __scanner,[]$($t)*)}};($scanner:expr,$($t:tt)*)=>{$crate::scan_value!(@inner$scanner,[]$($t)*)}}#[doc=" scan and bind values with Scanner"]#[doc=""]#[doc=" - `scan!(scanner, $($pat $(: ELEMENT)?),*)`"]#[macro_export]macro_rules!scan{(@assert$p:pat)=>{};(@assert$($p:tt)*)=>{::std::compile_error!(::std::concat!("expected pattern, found `",::std::stringify!($($p)*),"`"));};(@pat$scanner:expr,[][])=>{};(@pat$scanner:expr,[][],$($t:tt)*)=>{$crate::scan!(@pat$scanner,[][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]$x:ident$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*$x][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]::$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*::][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]&$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*&][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]($($x:tt)*)$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*($($x)*)][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][][$($x:tt)*]$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*[$($x)*]][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]{$($x:tt)*}$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*{$($x)*}][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]:$($t:tt)*)=>{$crate::scan!(@ty$scanner,[$($p)*][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]$($t:tt)*)=>{$crate::scan!(@let$scanner,[$($p)*][usize]$($t)*)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]@$e:expr$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*@$e]$(,$($t)*)?)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]($($x:tt)*)$($t:tt)*)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*($($x)*)]$($t)*)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*][$($x:tt)*]$($t:tt)*)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*[$($x)*]]$($t)*)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]&str$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*&str]$(,$($t)*)?)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]$ty:ty=$e:expr$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*$ty=$e]$(,$($t)*)?)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]$ty:ty$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*$ty]$(,$($t)*)?)};(@let$scanner:expr,[$($p:tt)*][$($tt:tt)*]$($t:tt)*)=>{$crate::scan!{@assert$($p)*}let$($p)* =$crate::scan_value!($scanner,$($tt)*);$crate::scan!(@pat$scanner,[][]$($t)*)};(src=$src:expr,$($t:tt)*)=>{let mut __scanner=Scanner::new($src);$crate::scan!(@pat __scanner,[][]$($t)*)};(iter=$iter:expr,$($t:tt)*)=>{let mut __scanner=Scanner::new_from_iter($iter);$crate::scan!(@pat __scanner,[][]$($t)*)};($scanner:expr,$($t:tt)*)=>{$crate::scan!(@pat$scanner,[][]$($t)*)}}#[doc=" define enum scan rules"]#[doc=""]#[doc=" # Example"]#[doc=" ```rust"]#[doc=" # use competitive::{define_enum_scan, tools::{CharsWithBase, Scan, ScanSource, Scanner, Usize1}};"]#[doc=" define_enum_scan! {"]#[doc=" enum Query: u8 {"]#[doc=" 0 => Noop,"]#[doc=" 1 => Args { i: Usize1, s: char },"]#[doc=" 9 => Complex { n: usize, c: [(usize, Vec = CharsWithBase('a')); n] },"]#[doc=" }"]#[doc=" }"]#[doc=" ```"]#[macro_export]macro_rules!define_enum_scan{(@field_ty@repeat[$($t:tt)*]$($len:expr)?)=>{Vec<$crate::define_enum_scan!(@field_ty$($t)*)>};(@field_ty@array[$($t:tt)*]$len:expr)=>{[$crate::define_enum_scan!(@field_ty$($t)*);$len]};(@field_ty@tuple[$([$($args:tt)*])*])=>{($($($args)*,)*)};(@field_ty@sparen[]($($tt:tt)*);$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[($($tt)*)]$($t)*)};(@field_ty@sparen[][$($tt:tt)*];$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[[$($tt)*]]$($t)*)};(@field_ty@sparen[]$ty:ty=$e:expr;$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[$ty=$e]$($t)*)};(@field_ty@sparen[]$ty:ty;$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[$ty]$($t)*)};(@field_ty@sparen[]$($args:tt)*)=>{$crate::define_enum_scan!(@field_ty@repeat[$($args)*])};(@field_ty@sparen[$($args:tt)+]const$len:expr)=>{$crate::define_enum_scan!(@field_ty@array[$($args)+]$len)};(@field_ty@sparen[$($args:tt)+]$len:expr)=>{$crate::define_enum_scan!(@field_ty@repeat[$($args)+]$len)};(@field_ty@$tag:ident[$($args:tt)*]($($tuple:tt)*)$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[$crate::define_enum_scan!(@field_ty@tuple[]$($tuple)*)]]$($t)*)};(@field_ty@$tag:ident[$($args:tt)*][$($tt:tt)*]$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[$crate::define_enum_scan!(@field_ty@sparen[]$($tt)*)]]$($t)*)};(@field_ty@$tag:ident[$($args:tt)*]$ty:ty=$e:expr$(,$($t:tt)*)?)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[$ty]]$(,$($t)*)?)};(@field_ty@$tag:ident[$($args:tt)*]$ty:ty$(,$($t:tt)*)?)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[<$ty as Scan>::Output]]$(,$($t)*)?)};(@field_ty@$tag:ident[$($args:tt)*],$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*]$($t)*)};(@field_ty@$tag:ident[[$($args:tt)*]])=>{$($args)*};(@field_ty@$tag:ident[$($args:tt)*])=>{::std::compile_error!(::std::stringify!($($args)*))};(@field_ty$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@inner[]$($t)*)};(@tag_expr raw,$iter:ident)=>{ScanSource::next_token($iter)?};(@tag_expr$d:ty,$iter:ident)=>{<$d as Scan>::scan($iter)?};(@variant([$($attr:tt)*]$vis:vis$T:ident$d:tt)[$($vars:tt)*])=>{$crate::define_enum_scan!{@def$($attr)*$vis enum$T:$d{$($vars)*}}};(@variant$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident{$($fs:tt)*}$($rest:tt)*)=>{$crate::define_enum_scan!{@field$ctx[$($vars)*]$p=>$v[]$($fs)*;$($rest)*}};(@variant$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*$p=>$v,]$($rest)*}};(@variant$ctx:tt[$($vars:tt)*],$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*]$($rest)*}};(@endfield$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*][$f:ident:$($spec:tt)*],$($rest:tt)*)=>{$crate::define_enum_scan!{@field$ctx[$($vars)*]$p=>$v[$($fs)*[$f:$($spec)*]]$($rest)*}};(@endfield$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*][$f:ident:$($spec:tt)*];$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*$p=>$v{$($fs)*[$f:$($spec)*]},]$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*];$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*$p=>$v{$($fs)*},]$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:($($tuple:tt)*)$sep:tt$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:($($tuple)*)]$sep$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:[$($x:tt)*]$sep:tt$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:[$($x)*]]$sep$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty=$e:expr,$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty=$e],$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty;$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty];$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty=$e:expr;$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty=$e];$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty,$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty],$($rest)*}};(@def$(#[$attr:meta])*$vis:vis enum$T:ident:$d:tt{$($p:pat=>$v:ident$({$([$f:ident:$($spec:tt)*])*})?,)*})=>{$(#[$attr])*$vis enum$T{$($v$({$($f:$crate::define_enum_scan!(@field_ty$($spec)*)),*})?),*}impl Scan for$T{type Output=Self;fn scan(iter:&mut I)->Option{let tag=$crate::define_enum_scan!(@tag_expr$d,iter);match tag{$($p=>{$($(let$f=$crate::scan_value!((*iter),$($spec)*);)*)?Some($T::$v$({$($f),*})?)}),*_=>None,}}}};($(#[$attr:meta])*$vis:vis enum$T:ident:raw{$($body:tt)*})=>{$crate::define_enum_scan!{@variant([$(#[$attr])*]$vis$T raw)[]$($body)*}};($(#[$attr:meta])*$vis:vis enum$T:ident:$d:ty{$($body:tt)*})=>{$crate::define_enum_scan!{@variant([$(#[$attr])*]$vis$T$d)[]$($body)*}};}#[derive(Debug,Copy,Clone)]pub enum Usize1{}impl Scan for Usize1{type Output=usize;fn scan(iter:&mut I)->Option{::scan(iter)?.checked_sub(1)}}#[derive(Debug,Copy,Clone)]pub struct CharWithBase(pub char);impl MarkedScan for CharWithBase{type Output=usize;fn mscan(self,iter:&mut I)->Option{Some((::scan(iter)?as u8-self.0 as u8)as usize)}}#[derive(Debug,Copy,Clone)]pub enum Chars{}impl Scan for Chars{type Output=Vec;fn scan(iter:&mut I)->Option{Some(iter.next_token()?.chars().collect())}}#[derive(Debug,Copy,Clone)]pub struct CharsWithBase(pub char);impl MarkedScan for CharsWithBase{type Output=Vec;fn mscan(self,iter:&mut I)->Option{Some(iter.next_token()?.chars().map(|c|(c as u8-self.0 as u8)as usize).collect())}}#[derive(Debug,Copy,Clone)]pub enum Byte1{}impl Scan for Byte1{type Output=u8;fn scan(iter:&mut I)->Option{let bytes=iter.next_token()?.as_bytes();assert_eq!(bytes.len(),1);Some(bytes[0])}}#[derive(Debug,Copy,Clone)]pub struct ByteWithBase(pub u8);impl MarkedScan for ByteWithBase{type Output=usize;fn mscan(self,iter:&mut I)->Option{Some((::scan(iter)?as u8-self.0)as usize)}}#[derive(Debug,Copy,Clone)]pub enum Bytes{}impl Scan for Bytes{type Output=Vec;fn scan(iter:&mut I)->Option{Some(iter.next_token()?.bytes().collect())}}#[derive(Debug,Copy,Clone)]pub struct BytesWithBase(pub u8);impl MarkedScan for BytesWithBase{type Output=Vec;fn mscan(self,iter:&mut I)->Option{Some(iter.next_token()?.bytes().map(|c|(c-self.0)as usize).collect())}}#[derive(Debug,Copy,Clone)]pub struct Collect::Output>>where T:Scan,B:FromIterator<::Output>{size:usize,_marker:PhantomData(T,B)>}implCollectwhere T:Scan,B:FromIterator<::Output>{pub fn new(size:usize)->Self{Self{size,_marker:PhantomData}}}implMarkedScan for Collectwhere T:Scan,B:FromIterator<::Output>{type Output=B;fn mscan(self,iter:&mut I)->Option{if self.size==0{iter.skip_whitespace();}repeat_with(| |::scan(iter)).take(self.size).collect()}}#[derive(Debug,Copy,Clone)]pub struct SizedCollect::Output>>where T:Scan,B:FromIterator<::Output>{_marker:PhantomData(T,B)>}implScan for SizedCollectwhere T:Scan,B:FromIterator<::Output>{type Output=B;fn scan(iter:&mut I)->Option{let size=usize::scan(iter)?;if size==0{iter.skip_whitespace();}repeat_with(| |::scan(iter)).take(size).collect()}}#[derive(Debug,Copy,Clone)]pub struct Splittedwhere T:Scan{pat:P,_marker:PhantomDataT>}implSplittedwhere T:Scan{pub fn new(pat:P)->Self{Self{pat,_marker:PhantomData}}}implMarkedScan for Splittedwhere T:Scan{type Output=Vec<::Output>;fn mscan(self,iter:&mut I)->Option{let mut iter=Scanner::new_from_iter(iter.next_token()?.split(self.pat));Some(from_fn(| |::scan(&mut iter)).collect())}}implMarkedScan for Splittedwhere T:Scan{type Output=Vec<::Output>;fn mscan(self,iter:&mut I)->Option{let mut iter=Scanner::new_from_iter(iter.next_token()?.split(self.pat));Some(from_fn(| |::scan(&mut iter)).collect())}}implMarkedScan for F where F:Fn(&str)->Option{type Output=T;fn mscan(self,iter:&mut I)->Option{self(iter.next_token()?)}}} // codesnip-guard: zero_one #[cfg_attr(any(),rustfmt::skip)]pub use self::zero_one::{One,Zero};#[cfg_attr(any(),rustfmt::skip)]mod zero_one{pub trait Zero:Sized{fn zero()->Self;#[inline]fn is_zero(&self)->bool where Self:PartialEq{self==&Self::zero()}#[inline]fn set_zero(&mut self){*self=Self::zero();}}pub trait One:Sized{fn one()->Self;#[inline]fn is_one(&self)->bool where Self:PartialEq{self==&Self::one()}#[inline]fn set_one(&mut self){*self=Self::one();}}macro_rules!impl_zero_one{($({$(<$T:ident:$Bound:ident>)?$Trait:ident$method:ident$($t:ty)*,$e:expr})*)=>{$(impl_zero_one!(@impl[$(<$T:$Bound>)?]$Trait$method[$($t)*],$e);)*};(@impl[<$T:ident:$Bound:ident>]$Trait:ident$method:ident[$($t:ty)*],$e:expr)=>{$(impl<$T:$Bound>$Trait for$t{fn$method()->Self{$e}})*};(@impl[]$Trait:ident$method:ident[$($t:ty)*],$e:expr)=>{$(impl$Trait for$t{fn$method()->Self{$e}})*};}impl_zero_one!({Zero zero u8 u16 u32 u64 usize i8 i16 i32 i64 isize u128 i128,0}{Zero zero f32 f64,0.}{One one u8 u16 u32 u64 usize i8 i16 i32 i64 isize u128 i128,1}{One one f32 f64,1.}{Zero zero std::num::Wrapping,Self(T::zero())}{One one std::num::Wrapping,Self(T::one())});}