0 D$404mNJNL04e$FHuqaY}},m,Ҫm^ 02TvͫgE#2Tv2TvUUUU[[[[[[UUUUpwwpwwpwwpwwpwwpwwpwvpwf`ff`ffpwfpwvpgvpgvpgv`ffpffpgvpgwpfw`ff`ffpfwpgwpgvpff`ffpgvpgvpgv3333333333333333 33333n3m03m33ff3ff03ff3333333333f33m>3m0f3cf33c63333333333n336f>cf03f633c03333333333333m6cf6cf>3f 33333333333333؍0333303333333333333Ѝ>3033383333333333338>0383303333333333333Ѝ88>3 33333333333333ٝ0333303333333333333Н>303 3393333333333339>0393303333333333333Н99>3 33 3333333333330333303333333333333?30333>333333333333>?03>3303333333333333>>?3 3333333333333^3]03]33UU3UU03UU3333333333U33]>3]0U3SU33S53333333333^335U>SU03U533S03333333333333]5SU5SU>3U 333333333333330333303333333333333>3033313333333333331>031330333333333333311>3 333333333333330333303333333333333>303 33<333333333333<>03<3303333333333333<<>3 33 33333333333300000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330000003333333:3zw1ww1zwwzwwww1w131333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333( >?333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333n63333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU33333333333333333333333333333333333333333f 3333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU33333333333333333333333333333333333333333`f=3333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU33333333333333333333333333333333333333333ff03333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333f33333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333333333333333333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUMdo local _ENV = _ENV package.preload[ "middleclass" ] = function( ... ) local arg = _G.arg; local middleclass = { _VERSION = 'middleclass v4.1.1', _DESCRIPTION = 'Object Orientation for Lua', _URL = 'https://github.com/kikito/middleclass', _LICENSE = [[ MIT LICENSE Copyright (c) 2011 Enrique García Cota Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ]] } local function _createIndexWrapper(aClass, f) if f == nil then return aClass.__instanceDict elseif type(f) == "function" then return function(self, name) local value = aClass.__instanceDict[name] if value ~= nil then return value else return (f(self, name)) end end else -- if type(f) == "table" then return function(self, name) local value = aClass.__instanceDict[name] if value ~= nil then return value else return f[name] end end end end local function _propagateInstanceMethod(aClass, name, f) f = name == "__index" and _createIndexWrapper(aClass, f) or f aClass.__instanceDict[name] = f for subclass in pairs(aClass.subclasses) do if rawget(subclass.__declaredMethods, name) == nil then _propagateInstanceMethod(subclass, name, f) end end end local function _declareInstanceMethod(aClass, name, f) aClass.__declaredMethods[name] = f if f == nil and aClass.super then f = aClass.super.__instanceDict[name] end _propagateInstanceMethod(aClass, name, f) end local function _tostring(self) return "class " .. self.name end local function _call(self, ...) return self:new(...) end local function _createClass(name, super) local dict = {} dict.__index = dict local aClass = { name = name, super = super, static = {}, __instanceDict = dict, __declaredMethods = {}, subclasses = setmetatable({}, {__mode='k'}) } if super then setmetatable(aClass.static, { __index = function(_,k) local result = rawget(dict,k) if result == nil then return super.static[k] end return result end }) else setmetatable(aClass.static, { __index = function(_,k) return rawget(dict,k) end }) end setmetatable(aClass, { __index = aClass.static, __tostring = _tostring, __call = _call, __newindex = _declareInstanceMethod }) return aClass end local function _includeMixin(aClass, mixin) assert(type(mixin) == 'table', "mixin must be a table") for name,method in pairs(mixin) do if name ~= "included" and name ~= "static" then aClass[name] = method end end for name,method in pairs(mixin.static or {}) do aClass.static[name] = method end if type(mixin.included)=="function" then mixin:included(aClass) end return aClass end local DefaultMixin = { __tostring = function(self) return "instance of " .. tostring(self.class) end, initialize = function(self, ...) end, isInstanceOf = function(self, aClass) return type(aClass) == 'table' and type(self) == 'table' and (self.class == aClass or type(self.class) == 'table' and type(self.class.isSubclassOf) == 'function' and self.class:isSubclassOf(aClass)) end, static = { allocate = function(self) assert(type(self) == 'table', "Make sure that you are using 'Class:allocate' instead of 'Class.allocate'") return setmetatable({ class = self }, self.__instanceDict) end, new = function(self, ...) assert(type(self) == 'table', "Make sure that you are using 'Class:new' instead of 'Class.new'") local instance = self:allocate() instance:initialize(...) return instance end, subclass = function(self, name) assert(type(self) == 'table', "Make sure that you are using 'Class:subclass' instead of 'Class.subclass'") assert(type(name) == "string", "You must provide a name(string) for your class") local subclass = _createClass(name, self) for methodName, f in pairs(self.__instanceDict) do if not (methodName == "__index" and type(f) == "table") then _propagateInstanceMethod(subclass, methodName, f) end end subclass.initialize = function(instance, ...) return self.initialize(instance, ...) end self.subclasses[subclass] = true self:subclassed(subclass) return subclass end, subclassed = function(self, other) end, isSubclassOf = function(self, other) return type(other) == 'table' and type(self.super) == 'table' and ( self.super == other or self.super:isSubclassOf(other) ) end, include = function(self, ...) assert(type(self) == 'table', "Make sure you that you are using 'Class:include' instead of 'Class.include'") for _,mixin in ipairs({...}) do _includeMixin(self, mixin) end return self end } } function middleclass.class(name, super) assert(type(name) == 'string', "A name (string) is needed for the new class") return super and super:subclass(name) or _includeMixin(_createClass(name), DefaultMixin) end setmetatable(middleclass, { __call = function(_, ...) return middleclass.class(...) end }) return middleclass end end do local _ENV = _ENV package.preload[ "std.strict" ] = function( ... ) local arg = _G.arg; --[[ Strict variable declarations for Lua 5.1, 5.2, 5.3 & 5.4. Copyright (C) 2006-2023 std.strict authors ]] --[[-- Diagnose uses of undeclared variables. All variables(including functions!) must be "declared" through a regular assignment(even assigning `nil` will do) in a strict scope before being used anywhere or assigned to inside a nested scope. Use the callable returned by this module to interpose a strictness check proxy table to the given environment. The callable runs `setfenv` appropriately in Lua 5.1 interpreters to ensure the semantic equivalence. @module std.strict ]] local setfenv = rawget(_G, 'setfenv') or function() end local debug_getinfo = debug.getinfo -- Return callable objects. -- @function callable -- @param x an object or primitive -- @return *x* if *x* can be called, otherwise `nil` -- @usage -- (callable(functable) or function()end)(args, ...) local function callable(x) -- Careful here! -- Most versions of Lua don't recurse functables, so make sure you -- always put a real function in __call metamethods. Consequently, -- no reason to recurse here. -- func=function() print 'called' end -- func() --> 'called' -- functable=setmetatable({}, {__call=func}) -- functable() --> 'called' -- nested=setmetatable({}, {__call=function(self, ...) return functable(...)end}) -- nested() -> 'called' -- notnested=setmetatable({}, {__call=functable}) -- notnested() -- --> stdin:1: attempt to call global 'nested' (a table value) -- --> stack traceback: -- --> stdin:1: in main chunk -- --> [C]: in ? if type(x) == 'function' or (getmetatable(x) or {}).__call then return x end end -- Return named metamethod, if callable, otherwise `nil`. -- @param x item to act on -- @string n name of metamethod to look up -- @treturn function|nil metamethod function, if callable, otherwise `nil` local function getmetamethod(x, n) return callable((getmetatable(x) or {})[n]) end -- Length of a string or table object without using any metamethod. -- @function rawlen -- @tparam string|table x object to act on -- @treturn int raw length of *x* -- @usage -- --> 0 -- rawlen(setmetatable({}, {__len=function() return 42})) local function rawlen(x) -- Lua 5.1 does not implement rawlen, and while # operator ignores -- __len metamethod, `nil` in sequence is handled inconsistently. if type(x) ~= 'table' then return #x end local n = #x for i = 1, n do if x[i] == nil then return i -1 end end return n end -- Deterministic, functional version of core Lua `#` operator. -- -- Respects `__len` metamethod (like Lua 5.2+). Otherwise, always return -- one less than the lowest integer index with a `nil` value in *x*, where -- the `#` operator implementation might return the size of the array part -- of a table. -- @function len -- @param x item to act on -- @treturn int the length of *x* -- @usage -- x = {1, 2, 3, nil, 5} -- --> 5 3 -- print(#x, len(x)) local function len(x) return (getmetamethod(x, '__len') or rawlen)(x) end -- Like Lua `pairs` iterator, but respect `__pairs` even in Lua 5.1. -- @function pairs -- @tparam table t table to act on -- @treturn function iterator function -- @treturn table *t*, the table being iterated over -- @return the previous iteration key -- @usage -- for k, v in pairs {'a', b='c', foo=42} do process(k, v) end local pairs = (function(f) if not f(setmetatable({},{__pairs=function() return false end})) then return f end return function(t) return(getmetamethod(t, '__pairs') or f)(t) end end)(pairs) -- What kind of variable declaration is this? -- @treturn string 'C', 'Lua' or 'main' local function what() local d = debug_getinfo(3, 'S') return d and d.what or 'C' end return setmetatable({ --- Module table. -- @table strict -- @string version release version identifier --- Require variable declarations before use in scope *env*. -- -- Normally the module @{strict:__call} metamethod is all you need, -- but you can use this method for more complex situations. -- @function strict -- @tparam table env lexical environment table -- @treturn table *env* proxy table with metamethods to enforce strict -- declarations -- @usage -- local _ENV = setmetatable({}, {__index = _G}) -- if require 'std._debug'.strict then -- _ENV = require 'std.strict'.strict(_ENV) -- end -- -- ...and for Lua 5.1 compatibility, without triggering undeclared -- -- variable error: -- if rawget(_G, 'setfenv') ~= nil then -- setfenv(1, _ENV) -- end strict = function(env) -- The set of declared variables in this scope. local declared = {} --- Environment Metamethods -- @section environmentmetamethods return setmetatable({}, { --- Detect dereference of undeclared variable. -- @function env:__index -- @string n name of the variable being dereferenced __index = function(_, n) local v = env[n] if v ~= nil then declared[n] = true elseif not declared[n] and what() ~= 'C' then error("variable '" .. n .. "' is not declared", 2) end return v end, --- Proxy `len` calls. -- @function env:__len -- @tparam table t strict table __len = function() return len(env) end, --- Detect assignment to undeclared variable. -- @function env:__newindex -- @string n name of the variable being declared -- @param v initial value of the variable __newindex = function(_, n, v) local x = env[n] if x == nil and not declared[n] then local w = what() if w ~= 'main' and w ~= 'C' then error("assignment to undeclared variable '" .. n .. "'", 2) end end declared[n] = true env[n] = v end, --- Proxy `pairs` calls. -- @function env:__pairs -- @tparam table t strict table __pairs = function() return pairs(env) end, }) end, }, { --- Module Metamethods -- @section modulemetamethods --- Enforce strict variable declarations in *env*. -- @function strict:__call -- @tparam table env lexical environment table -- @tparam[opt=1] int level stack level for `setfenv`, 1 means -- set caller's environment -- @treturn table *env* which must be assigned to `_ENV` -- @usage -- local _ENV = require 'std.strict'(_G) __call = function(self, env, level) env = self.strict(env) setfenv(1 + (level or 1), env) return env end, --- Lazy loading of strict submodules. -- Don't load everything on initial startup, wait until first attempt -- to access a submodule, and then load it on demand. -- @function __index -- @string name submodule name -- @treturn table|nil the submodule that was loaded to satisfy the missing -- `name`, otherwise `nil` if nothing was found -- @usage -- local strict = require 'std.strict' -- local version = strict.version __index = function(self, name) local ok, t = pcall(require, 'std.strict.' .. name) if ok then rawset(self, name, t) return t end end, }) end end -- title: Red vs Blue Time Trial -- author: Liam and Leo -- desc: Uses msx80 driving model to create a simple time trial game. Our fastest time was a 5.95 -- script: lua local _ENV = require 'std.strict' (_G) local class = require 'middleclass' local Car = class('Car') function Car:initialize(xpos,ypos) self.x = xpos self.y = ypos self.lc = 0 self.a = 1.57 self.vx = 0 self.vy = 0 self.laps = 0 self.pr = 6000 self.starttime = 0 end -------------------------- -- Vector functions -------------------------- pi2 = math.pi*2.0 -- gets a vector of given length -- oriented on the given angle function vector(length, angle) -- this could actually be optimized -- since the X is always 0, to avoid -- two sin/cos calls. return rotate(0, -length, angle) end -- rotate a vector by a certain angle function rotate(x,y,a) return x*math.cos(a)-y*math.sin(a), x*math.sin(a)+y*math.cos(a) end -- gives the angle of a given vector function angle(x,y) return math.pi - math.atan2(x,y) end -- give the angle from a certain point -- to another point function angle2(fromx,fromy, tox, toy) return angle(tox-fromx, toy-fromy) end -- calculates if an angle is closer -- to a given angle in the positive -- direction rather than the negative -- returns -1, 0 or +1 function angleDir(from, to) local diff = to-from if math.abs(diff) < 0.00001 then return 0 end -- avoid rounding errors that will prevent settling if diff > math.pi then return -1 elseif diff < -math.pi then return 1 else return diff>0 and 1 or -1 end end -- return the length of a vector function vecLen(x,y) return math.sqrt(x ^ 2 + y ^ 2) end -- adds two angles ensuring the -- result is in the 0..2pi range function angleAdd(a, d) a=a+d -- ensure angle is in 0..2pi range if a<0 then a=a+pi2 elseif a>=pi2 then a=a-pi2 end return a end ---------------- TURN_RADIUS = 0.05 -- how much the car turn when pressing left or right ACCEL_VALUE = 0.02 -- acceleration when pressing z FRICTION = 0.98 -- how much the car decelerate on asphalt DIRT_FRICTION = 0.95 -- deceleration on dirt ALIGNEMENT = 0.02 -- how fast the velocity catch up with direciton eps = 6 lastcollision = 0 t = 0 function Car:turnleft() self.a = angleAdd(self.a, -TURN_RADIUS) end function Car:turnright() self.a = angleAdd(self.a, TURN_RADIUS) end function Car:accelerate() local ax,ay = vector(ACCEL_VALUE,self.a) self.vx=self.vx+ax -- change velocity this time self.vy=self.vy+ay end function Car:friction() local id = mget((self.x)/8, (self.y)/8) local fr = FRICTION if id > 1 and id < 6 then self.vx = self.vx * 1.1 self.vy = self.vy * 1.1 end if id == 0 then fr = DIRT_FRICTION end self.vx = self.vx * fr self.vy = self.vy * fr end function Car:drawCar(i) -- with sprites: local idx = rou(self.a*16/pi2) % 16 spr(i + (idx % 4), flr(self.x)-4, flr(self.y)-4,3, 1,0, idx // 4) --with circle and arrow: -- circb(c.x, c.y, 3, 15) -- local x1,y1 = vector(10,c.a) -- line(c.x, c.y, c.x+x1, c.y+y1, 15) end function Car:rotateVel() -- slowly rotate velocity to match car direction local v = angle(self.vx, self.vy) -- v is the angle of the velocity local d = angleDir(v, self.a) -- direction to go to align (-1 or 1) self.vx, self.vy = rotate(self.vx, self.vy, ALIGNEMENT * d) end function Car:addVel() self.x=self.x+self.vx self.y=self.y+self.vy end function Car:hitWalls() if self.x - 4 < 0 then self.vx = -self.vx; self.x = 4 elseif self.x + 4 > 239 then self.vx = -self.vx; self.x = 235 elseif self.y + 4 > 135 then self.vy = -self.vy; self.y = 131 elseif self.y - 4 < 0 then self.vy = -self.vy; self.y = 4 end end function Car:hitCheckpoint() if (self.x > 192 and self.y < 60) and self.lc == 0 then self.lc = 1 elseif (self.x > 192 and self.y > 70) and self.lc == 1 then self.lc = 2 elseif (self.x < 48 and self.y > 70) and self.lc == 2 then self.lc = 3 elseif (self.x < 48 and self.y < 60) and self.lc == 3 then self.lc = 4 elseif ((math.abs(self.x - 124) < 4 and math.abs(self.y - 16) < 20) and self.lc == 4) then if t - self.starttime < self.pr then self.pr = t - self.starttime end self.lc = 0 self.starttime = t self.laps = self.laps + 1 end end function Car:printScore(id) print(self.laps, 10 + 210*(id-1), 10, 06 + 2*(id-1), false, 2, false) end cars = {} cars[1] = Car:new(120, 12) cars[2] = Car:new(120, 28) function TIC() -- cls(3) -- rect(120,0,120,136,5) map(0, 0, 30, 17, 0, 0, -1, 1, nil) if cars[1].pr ~= 6000 then local time1 = tostring(rou((cars[1].pr / 60) * 100) / 100) local width1 = print(time1, 0, -6) print(time1, (240 - 3*width1)//2, 40, 06, true, 3, false) end if cars[2].pr ~= 6000 then local time2 = tostring(rou((cars[2].pr / 60) * 100) / 100) local width2 = print(time2, 0, -6) print(time2, (240 - 3*width2)//2, 80, 08, true, 3, false) end -- rotate our direction if btn(2) then cars[1]:turnleft() end if btn(3) then cars[1]:turnright() end if btn(4) then cars[1]:accelerate() end if btn(10) then cars[2]:turnleft() end if btn(11) then cars[2]:turnright() end if btn(12) then cars[2]:accelerate() end for i = 1, 2 do -- apply friction cars[i]:friction() -- rotate velocity cars[i]:rotateVel() -- add velocity to car cars[i]:addVel() -- check wall collisions cars[i]:hitWalls() -- render cars[i]:drawCar(240 + 16 * i) -- check car collisions cars[i]:hitCheckpoint() cars[i]:printScore(i) end if math.abs(cars[1].x - cars[2].x) < eps and math.abs(cars[1].y - cars[2].y) < eps then if t - lastcollision > 5 then lastcollision = t local tempvx, tempvy = cars[1].vx, cars[1].vy cars[1].vx, cars[1].vy = cars[2].vx, cars[2].vy cars[2].vx, cars[2].vy = tempvx, tempvy end end t = t + 1 end function flr(a) return math.floor(a) end function rou(x) return x + 0.5 - (x + 0.5) % 1 end