making it more flexible
fixed. require test