소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정소정