0,]']ą>Sï}WĸÍu§ðp8·d%qy)6o;]ÉAĶösïũôôô”°ÂVl†3?0000000000000000  Õ 0 R@ 0@PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP @@@ O @ O @ O @@@@@@@@@@@@@@@@@@@@@@T!+ a aÃÃÃÃÃÃÃÃÃÃÃÃÃÃà ` ` ` `€€€ € € € € € € €€ A A Aaa a A A AA Aaa a a aa € € €€€€ € €€ €€€€ € €   A AAAAA AAa AAAAAA AAA AccÃÃccÃÃccÃÃĢãããÃĢ,€€€€€ €€€€€€ €€ `` ` ` `AAA A AAAAA ! ! A,€€€€€ €€ € € €€ €   €€   €,€`€€€€€`€`€ ` ` ` `€€ €€ ,€ €€ € € €€€` `` ` ` €€T'` `0^'@V'` `T'`>'@M'@CcƒĢcCcƒƒCcƒĢcCcƒƒc € ``€ €`€` € € € €€ €€ÃãcƒÃcÃãcƒÄÃDÃdcĪcôcDÃdcĪcôc€ ``€ €€€ `€ €€ €€ €  ã ÃãcãããÃããccッ €€€`€€€` € € €€ €€` ` ``€€€ € €€   € € €€€AA! A AAA!! !Aa aAAA A A AAaaa aa aa AAAAAaaA Aa AAAAAaaaaa aa aaa a a,`` ` ` ``€0€ @ @@@ @ @` ` `€@ @@@ @@ @ @ @ @`CĢĢCĢĢãÃãCĢĢッĢĢãƒcà @ @ @@ @ @@@@@` @ @ @@ @@ @`@ @ @ @ @@ @@ @ @ @@@@``` ``,` ``` ` `€ € € ` ```@`` ` ` ` `€  Ą Ą    aaa    aa a a, ý@ý@ý@ý@ų@ų@ų@ø@ø@ø@ø@ö@û@û@þ@ôĄ@a aa a(a aHa aha aˆa aĻa aČa a0ý@ý@ý@ý@ų@ų@ų@ø@ø@ø@ø@ö@û@û@þ@ôĄ@ý@ý@ý@ý@ų@ų@ų@ø@ø@ø@ø@ö@û@û@þ@ôĄ@]'a a6'a]'a a6'aĪÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ$ÃÃÃDÃÃÀ„ÃÃÃĪÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃà ` ` `€ € €   €  €€ €€€ €€ € €€€€]'a a6'a]'a a6'a]'a a6'a a]'a a6'a@0 a6'aZ'aa?'AZ'aa?'AZ'aa?'AaZ'aa?'AP0 a6'a_'a a8'a_'a a8'a_'a a8'a a_'a a8'a`0 a6'aT' a9'aT' a9'aT' a9'a aT' a9'ap0 a7'a `` ``€ € €  € € € €` €``€ `€€ €` €`€ €€   €€ €€ €`` ` €`` ` €`` `€ `€`€ €€ €€ €  € €  € €  € a       aa aa a     ĄĄ   ĄĄĄ ĄĪĄ†ĄmFĄdĄ†Ą­þ ĄĄĄaa aa a aa a  aaaaaa a aaaaĄ   aaa  ]'a a6'a]'a a6'a0ĄĪĄ†ĄmFĄdĄ†Ą­þ ĄĄĄĄĄĄ     € € €€ `€ `€€,€€ €€ € € € €ĶÃÃÃÃÃcƒÃÃÃÃÃÃÃÃÃcƒÃÃÃÃÃÃÃÃÃcƒÃÃÃÃÃÃÃÃÃcƒÃÃÃà €€€€ `€ `€€,€ € ,€ € €€ € € € € € €€A A aA A aAAa AaA AA AAA AA a a ae…þH@J@K@Œ@ÏHHÓHH@øý 8llÜ@@lÞ lÚ l l\ ” ”\ l @llĄ˜# ”# ”' ”l ”­ ”î ”# ”# ”üþvÜxÜý:üiĀ?™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖɜĖĖɜĖĖɜĖĖÉœĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖɜĖĖɜĖĖɜĖĖÉœĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖɜĖĖɜĖĖÉœĖ™™™™™™™™ĖɜĖ˜ĖɘĖə™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™É™™™™™™™™œ™™É™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™É™™™™™™™™œ™™Éœ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™É™™™™™™™™œ™™É™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™É™™™™™™™™œ™™Éœ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖɜĖĖɜĖĖÉœĖ™™™™™™™™Ėɜ˜ĖɘĖÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™ĖɜĖĖÉœĖ™™™™™™™™™™™™ĖɜĖĖÉœĖ™™™™™™™™™™™™ĖœĖɘĖə™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™Ė™™Ė™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™ĖÉœĖ™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™ĖÉœĖ™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™Ė™™Ė™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™ĖɜĖĖÉœĖ™™™™™™™™™™™™ĖɜĖĖÉœĖ™™™™™™™™™™™™œĖɘĖÉĖ™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™ĖɜĖĖÉœĖ™™™™ĖɜĖĖɜĖĖɜĖ˜ĖɘĖɘĖə™™™ĖœĖɘĖə™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™œ™™Éœ™™Éœ™™É™™™É™™™É™™™É™™™™™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™É™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™œ™™Éœ™™Éœ™™Éœ™™™œ™™™œ™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™œ™™Éœ™™Éœ™™É™™™É™™™É™™™É™™™™™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™É™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™œ™™Éœ™™Éœ™™Éœ™™™œ™™™œ™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™ĖɜĖĖÉœĖ™™™™ĖɜĖĖɜĖĖɜ˜ĖɘĖɘĖÉĖ™™™™œĖɘĖÉĖ™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™ĖÉœĖ™™™™™™™™™™™™ĖɜĖĖɜĖ˜ĖɘĖɘĖɘĖə™™™™™™™™™™™ĖœĖə™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™É™™™É™™™É™™™É™™™™™™™™™™™™™™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™™™™™œ™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™™™™™œ™™Éœ™™Éœ™™™œ™™™œ™™™œ™™™™™™™™™™™™™™™œ™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™É™™™É™™™É™™™É™™™™™™™™™™™™™™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™™™™™œ™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™™™™™œ™™Éœ™™Éœ™™™œ™™™œ™™™œ™™™™™™™™™™™™™™™œ™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™ĖÉœĖ™™™™™™™™™™™™ĖɜĖĖɜ˜ĖɘĖɘĖɘĖÉĖ™™™™™™™™™™™™œĖÉĖ™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜ĖĖĖĖĖĖĖĖĖ™™™ÉĖ™™™™™™™™™™™™™™™™™™™™ĖÉœĖ™™™™™™™™ĖɜĖĖɜĖ˜ĖɘĖɘĖɘĖɘĖɘĖə™™™™™™™ĖœĖə™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜ĖĖĖĖĖĖĖĖœĖ™™ÉĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™œ™™Éœ™™É™™™É™™™É™™™É™™™É™™™É™™™É™™™™™™™™™™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖœĖ™™ĖĖ™™Ėœ™Ė™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™œ™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜ĖɜĖĖɜĖĖĖ™™ÉĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™œ™™Éœ™™Éœ™™™œ™™™œ™™™œ™™™œ™™™œ™™™™™™™™™™™œ™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜ĖɜĖĖɜĖĖ™™™ÉĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™œ™™Éœ™™É™™™É™™™É™™™É™™™É™™™É™™™É™™™™™™™™™™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖœĖ™™ĖĖ™™ĖœĖ™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™œ™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜ĖĖĖĖĖĖĖ˜™Ė™ÉĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™œ™™Éœ™™Éœ™™™œ™™™œ™™™œ™™™œ™™™œ™™™™™™™™™™™œ™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜ĖĖĖĖĖĖĖĖĖĖ™™ÉĖ™™™™™™™™™™™™™™™™™™™™ĖÉœĖ™™™™™™™™ĖɜĖĖɜ˜ĖɘĖɘĖɘĖɘĖɘĖÉĖ™™™™™™™™œĖÉĖ™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™Éœ™ĖĖĖĖĖĖĖĖÉĖ™™™™™™™™™™™™™™™™ĖɜĖĖÉœĖ™™™™ĖɜĖĖɜĖ˜ĖɘĖɘĖɘĖɘĖɘĖÉĖĖĖĖ˜Ėə™™™ĖœĖɘĖə™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™ĖĖ™ĖĖĖĖĖĖĖĖÉĖ™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™œ™™Éœ™™É™™™É™™™É™™™É™™™É™™™É™™™ÉĖĖĖĖ™™™É™™™™™™™É™™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜ÉɜœĖ™™ĖĖ™™ĖÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™™ÉĖ™™Ėœ™™É™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™É™™ĖɜĖĖɜĖÉĖ™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™œ™™Éœ™™Éœ™™™œ™™™œ™™™œ™™™œ™™™œ™™™Ėɜ˜™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™œ™ĖɜĖĖɜĖÉĖ™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™œ™™Éœ™™É™™™É™™™É™™™É™™™É™™™É™™™ÉĖÉœĖ™™™É™™™™™™™É™™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™Éœ™Ė™™ĖĖ™™ĖÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™™ÉĖ™™Ėœ™™É™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™Éœ™ĖĖĖĖĖĖĖĖÉĖ™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™œ™™Éœ™™Éœ™™™œ™™™œ™™™œ™™™œ™™™œ™™™ĖĖĖ˜™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™É™™ĖĖĖĖĖĖĖĖÉĖ™™™™™™™™™™™™™™™™ĖɜĖĖÉœĖ™™™™ĖɜĖĖɜ˜ĖɘĖɘĖɘĖɘĖɘĖÉĖĖĖĖ˜ĖÉĖ™™™™œĖɘĖÉĖ™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™ĖÉœĖ™™™™ĖɜĖĖɜĖ˜ĖɘĖɘĖɘĖɘĖɘĖÉĖĖĖĖĖĖĖĖ˜ĖɘĖə™™™ĖœĖə™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™œ™™É™™™™œ™™Éœ™™É™™™É™™™É™™™É™™™É™™™É™™™ÉĖĖĖĖĖĖĖĖ™™™É™™™É™™™™™™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™™ÉĖ™™ĖĖ™™Ėœ™™Éœ™™É™™™™œ™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™œ™™É™™™™œ™™Éœ™™Éœ™™™œ™™™œ™™™œ™™™œ™™™œ™™™ĖɜĖĖɜ˜™™™œ™™™™™™™œ™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™œ™™É™™™™œ™™Éœ™™É™™™É™™™É™™™É™™™É™™™É™™™ÉĖɜĖĖÉœĖ™™™É™™™É™™™™™™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™™ÉĖ™™ĖĖ™™Ėœ™™Éœ™™É™™™™œ™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™œ™™É™™™™œ™™Éœ™™Éœ™™™œ™™™œ™™™œ™™™œ™™™œ™™™ĖĖĖĖĖĖĖ˜™™™œ™™™™™™™œ™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™ĖÉœĖ™™™™ĖɜĖĖɜ˜ĖɘĖɘĖɘĖɘĖɘĖÉĖĖĖĖĖĖĖĖ˜ĖɘĖÉĖ™™™™œĖÉĖ™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖ™™™™™™™™™™™™™™™™ĖÉœĖ™™™™ĖɜĖ˜ĖɘĖɘĖɘĖɘĖÉĖÉĖÉĖÉĖÉĖÉĖÉĖĖĖĖ˜ĖɘĖə™™™ĖœĖə™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™œ™™É™™™™œ™™É™™™É™™™É™™™É™™™É™™™É™™™™™™™™™™™™ĖĖĖĖ™™™É™™™É™™™™™™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™Éœ™™ÉÉĖÉĖÉĖÉĖÉĖÉĖĖ™™Ėœ™™Éœ™™É™™™™œ™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™œ™™É™™™™œ™™Éœ™™™œ™™™œ™™™œ™™™œ™™™™™™™™™™™™™™™Ėɜ˜™™™œ™™™™™™™œ™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™œ™™É™™™™œ™™É™™™É™™™É™™™É™™™É™™™ÉĖÉĖÉĖÉĖÉĖÉĖÉĖÉœĖ™™™É™™™É™™™™™™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™™™™™Ė™™Ėœ™™Éœ™™É™™™™œ™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™œ™™É™™™™œ™™Éœ™™™œ™™™œ™™™œ™™™œ™™™ÉĖÉĖÉĖÉĖÉĖÉĖĖĖĖ˜™™™œ™™™™™™™œ™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™ĖÉœĖ™™™™Ėɜ˜ĖɘĖɘĖɘĖɘĖÉĖ™™™™™™™™™™™™ĖĖĖ˜ĖɘĖÉĖ™™™™œĖÉĖ™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™ĖɜĖĖÉœĖ™™™™ĖœĖɘĖɘĖɘĖɘĖɘĖɘĖÉĖĖĖĖĖĖĖĖĖĖĖĖ™™™™ĖœĖɘĖə™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™É™™™É™™™É™™™É™™™É™™™É™™™Éœ™™Ėœ™™Ėœ™™Ė™™™™™™™É™™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™É˜™É˜™ÉĖ™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™œ™™™œ™™™œ™™™œ™™™œ™™™œ™™™œ™™™œ™Ė˜™Ė˜™ĖĖ™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™É™™™É™™™É™™™É™™™É™™™É™™™ÉœÉĖ˜ÉĖ˜ÉĖĖ™™™™™™™É™™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™™Éœ™™ÉœĖĖ˜ĖĖ˜ĖĖĖ™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™œ™™™œ™™™œ™™™œ™™™œ™™™œ™™™œ™™™ĖĖĖĖĖĖĖĖĖĖĖĖ™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™ĖɜĖĖÉœĖ™™™™œĖɘĖɘĖɘĖɘĖɘĖɘĖÉĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™œĖɘĖÉĖ™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™ĖœĖə™™™™™™™ĖœĖɘĖə™™™ĖœĖɘĖə™™™ĖœĖɘĖə™™™™™™™ĖœĖə™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™œ™™Ė™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™É™™™™™™™™™™™É™™™É™™™™™™™É™™™É™™™™™™™É™™™É™™™™™™™™™™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™œ™ÉĖ™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™œ™™Éœ™™É™™™™œ™™Éœ™™É™™™™œ™™Éœ™™É™™™™™™™™œ™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™œ™ĖĖ™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™™™™™™™™™™œ™™™œ™™™™™™™œ™™™œ™™™™™™™œ™™™œ™™™™™™™™™™™œ™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™œÉĖĖ™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™É™™™™™™™™™™™É™™™É™™™™™™™É™™™É™™™™™™™É™™™É™™™™™™™™™™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™œĖĖĖ™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™œ™™Éœ™™É™™™™œ™™Éœ™™É™™™™œ™™Éœ™™É™™™™™™™™œ™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™™™™™™™™™™œ™™™œ™™™™™™™œ™™™œ™™™™™™™œ™™™œ™™™™™™™™™™™œ™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™œĖÉĖ™™™™™™™™œĖɘĖÉĖ™™™™œĖɘĖÉĖ™™™™œĖɘĖÉĖ™™™™™™™™œĖÉĖ™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™ĖœĖə™™™™™™™™™™™™™™™™™™™ĖœĖɘĖə™™™™™™™™™™™™™™™™™™™ĖœĖə™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™É™™™™™™™™™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™™™™™™™™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™œ™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™É™™™™™™™™™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™œ™™É™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™œ™™™™™™™™™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™œ™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™œĖÉĖ™™™™™™™™™™™™™™™™™™™™œĖɘĖÉĖ™™™™™™™™™™™™™™™™™™™™œĖÉĖ™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖ˜™™™™™™™™™™™™ÉĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™ĖœĖɘĖə™™™™™™™™™™™ĖœĖɘĖə™™™™™™™™™™™ĖœĖɘĖə™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™™™™™™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™œĖɘĖÉĖ™™™™™™™™™™™™œĖɘĖÉĖ™™™™™™™™™™™™œĖɘĖÉĖ™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™ĖœĖɘĖə™™™™™™™™™™™ĖœĖɘĖə™™™™™™™™™™™ĖœĖɘĖə™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™Ė™™Ė™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖÉœĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖÉœĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™Ė™™Ė™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™œ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™œĖɘĖÉĖ™™™™™™™™™™™™œĖɘĖÉĖ™™™™™™™™™™™™œĖɘĖÉĖ™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜ĖĖĖĖĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖœĖɘĖɘĖə™™™™™™™ĖœĖɘĖɘĖə™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜ĖĖĖĖĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™É™™™É™™™É™™™™™™™™™™™É™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖœĖ™™ĖĖ™™Ė™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™É™™™™™™™™œ™™Éœ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜ĖɜĖĖÉœĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™™œ™™™œ™™™™™™™™™™™œ™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜ĖɜĖĖÉœĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™É™™™É™™™É™™™™™™™™™™™É™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖĖœĖ™™ĖĖ™™Ė™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™É™™™™™™™™œ™™Éœ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜ĖĖĖĖĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™™œ™™™œ™™™™™™™™™™™œ™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜ĖĖĖĖĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œĖɘĖɘĖÉĖ™™™™™™™™œĖɘĖɘĖÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖœĖɘĖɘĖɘĖə™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™É™™™É™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™Ė™™Ė™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖÉœĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™™œ™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖÉœĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™É™™™É™™™É™™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™Ė™™Ė™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™Éœ™™Éœ™™Éœ™™É™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œ™™™œ™™™œ™™™œ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™ĖĖĖĖ™™™™ÉĖĖĖĖĖĖĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œĖɘĖɘĖɘĖÉĖ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ĖĖ˜™™™™™™™™™™™™ÉĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™ĖĖĖĖĖĖĖĖĖ™ÉÉĖĖÉĖĖÉĖĖĖĖɜĖÉĖĖÉÉĖĖĖÉĖĖĖĖĖĖĖĖĖĖĖĖĖÉĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™ĖÉĖĖ˜ÉĖĖĖĖĖĖĖĖĖ˜™Ėœ™Ė˙˙™É™™ÉÉÉœĖ™ĖœÉĖĖÉĖĖ™ĖĖœÉ™ĖĖÉÉ˙əĖĖÉÉĖÉÉ™ĖœÉ™ĖĖÉÉœÉ™ĖœÉÉÉĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™Ėɜ™ÉœÉĖ™Ėɜ™ĖĖĖĖ™œÉ™œÉœ™ĖĖœÉ™ĖĖÉÉÉÉÉÉÉÉĖĖ™ĖÉÉÉəĖÉÉĖÉÉɜĖÉɘĖĖÉÉÉÉÉÉÉÉĖ™ĖÉɜÉÉÉÉÉĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ™ĖÉɜɜÉĖ™ĖəœÉĖĖĖ™ÉəÉÉĖ™Ė˙˙™ĖÉÉÉÉÉəĖĖĖÉĖÉÉÉÉĖÉÉÉĖ™ÉɜĖÉÉĖÉÉĖ™ÉÉəĖÉÉĖÉĖ™ĖÉÉÉɜÉĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ˜™ĖɜɜÉĖ™ĖəÉĖĖĖĖ™ĖəĖÉĖ™ĖœÉĖĖœÉ™ĖœĖÉɜÉÉĖÉĖÉÉÉəĖÉÉĖ™ÉÉĖÉÉÉĖÉÉĖ™ÉÉɜÉÉÉĖÉĖœÉ™ÉœÉĖÉÉĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖɘ™ÉĖ™Éœ™Ėœ™ĖĖĖ˜™Ėœ™Ėœ™É™ĖĖ™™ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ˜ĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ„-- title: Blueprint -- author: verysoftwares, Dreagonmon -- desc: build and solve levels, same as the game Blueprint, but with gamepad support. -- site: https://verysoftwares.itch.io/ -- script: lua -- saveid: BLUEPRINT_GP -- input: gamepad -- DONE pressing B places the block and ends the turn -- DONE have to have gem in level before pressing B? -- DONE if piece is gem then allow B press -- press B confirmation shout -- DONE rope climbing -- NOT DONE up/down to attach to rope, left/right to detach -- no need to have separate states for climbing -- rope swinging anim? -- DONE chaos bricks -- DONE procedurally generated 3x3 bricks -- DONE contain hazards like spikes with gravity -- hazards -- DONE spikes with gravity -- acid, spreads like waterfalls -- rocket enemies from Jetpack -- get soft-locked watching their plcmt side effect :D -- shout('umm. this seems to be taking a while.') -- a worm advancing within grid positions (animations) -- bonus for trapping by placing on top -- will split to multiple worms -- DONE further level select screen functionality -- DONE flash other text for Best/Last (A and B) -- DONE A accepts level -- DONE A brings you to credits with generative music -- I have decided not to pmem in default high scores. -- Getting a high score first try is important progress. -- levels that you finish are saved -- can be speedran -- score multiplier -- 1 hazard gets +1x score -- 2 hazards gets +2x score -- multiplier wanes away with time -- shown next to score -- placement combo mechanic? -- pause at level start to generate pieces? -- asked about hazards -- powerups -- DONE rotate piece -- (not a powerup, just press X) -- choose piece from queue t=0 x=24-3--240/2/8 y=14-1--144/2/8 --piece={ -- {0,0,6}, -- {1,0,6}, -- {1,1,6}, -- {2,1,6}, --} poke(0x3FF8,9) -- change border color poke(0x7FC3F,1,1) -- hide mouse cursor mode=nil -- can be nil, 'play', 'win', 'lose', 'talk' score=0 function update() if mode==nil or mode=='talk' then pal(9,12); pal(12,9); poke(0x3FF8,12) else poke(0x3FF8,9) end if mode==nil and not place_cor and not erase_cor and cur_piece then if btnp(0) then y=y-1; sfx(5,'A-5',6,2) end if btnp(1) then y=y+1; sfx(5,'A-4',6,2) end if btnp(2) then x=x-1; sfx(5,'A-5',6,2) end if btnp(3) then x=x+1; sfx(5,'A-4',6,2) end if btnp(6) then local rotated={} for i,p in ipairs(cur_piece) do table.insert(rotated,{3-p[2]-1,p[1],p[3]}) end cur_piece=rotated sfx(5,'D-5',6,2) end end if not erase_cor then -- v1.1 compatibility issue local bg=12 --if mode==nil or mode=='talk' then bg=9 end cls(bg) end rect(0,136-8,240,8,9) clip(0,136-8,240,8) local c=12 if mode==nil or mode=='talk' then c=9 end if #header.msg==1 then print(header.msg[#header.msg],0,136-6,c,false,1,true) else while #header.msg>2 do table.remove(header.msg,1) end print(header.msg[#header.msg-1],0,136-6+8-8-math.min(t-header.t,8),c,false,1,true) print(header.msg[#header.msg],0,136-6+8-math.min(t-header.t,8),c,false,1,true) end print(string.format('Value %.5d',score),240-11*6,136-6,c,true,1,false) clip() if not erase_cor then if (mode==nil or mode=='talk') then for mx=3,30-3-1 do for my=0,17-1 do if mget(mx,my)>0 then local sp=37 if dotted_anim then sp=sp+(dotted_anim+mx*0.5+my*0.5)*0.122%7 end spr(sp,(mx-3)*8,my*8) if update_cor then coroutine.yield() end end end end end for mx=3,30-3-1 do for my=17+0,17+17-1 do if mget(mx,my)>0 then spr(mget(mx,my),(mx-3)*8,(my-17)*8) if update_cor then coroutine.yield() end end end end end local allclear=true if (mode==nil or mode=='talk') and not erase_cor and cur_piece then for i,p in ipairs(cur_piece) do if mget(x+3+p[1],y+p[2])>0 and mget(x+3+p[1],y+17+p[2])==0 then if t%32<24 and not place_cor and not update_cor then spr(p[3],x*8+p[1]*8,y*8+p[2]*8) end else if t%32<24 and not place_cor and not update_cor then spr(25,x*8+p[1]*8,y*8+p[2]*8) end allclear=false end end end if not place_cor and not update_cor and not erase_cor then if mode==nil and not allclear and (btnp(4) or (not puzzle and btnp(5))) then sfx(6,'D-3',16,2); shout('All tiles must be in the grid.') end if (not puzzle and btnp(5)) and not gems_in_level() then sfx(6,'D-3',16,2); shout('There must be gems in a finished level.') end if btnp(5) and not placed then shout('You haven\'t placed anything!') end if mode==nil and allclear and btnp(4) and cur_piece then place_cor=coroutine.create(place_piece) pt=t shout('Placing piece...') cur_piece2=cur_piece pmsg='Done.' if not puzzle and gems_in_level() then pmsg='When done with the level, finish with B.' end if #pieces>0 then cur_piece=pieces[1] else pmsg='When done with the level, finish with B.'; cur_piece=nil end --if btnp(5) or #pieces==0 then x_flag=true end placed=true end if ((puzzle and placed) or (not puzzle and gems_in_level() and placed)) and btnp(5) then clear_level() end end rect(240-8*6,0,8*6,136-6,9) if (mode==nil or mode=='talk') and not erase_cor then for i,p in ipairs(pieces) do local off2=0 if i==1 then off2=-8 end if i==3 or i==4 then off2=4 end rect(240-8*4-1+off2,136-(i)*8*4-1-1,8*3+2,8*3+2,12) for i2,p2 in ipairs(p) do local off=0 --if #p==1 then off=8 end spr(p2[3],240-8*4+p2[1]*8+off+off2,136-i*8*4+p2[2]*8+off-1) if update_cor then coroutine.yield(); coroutine.yield(); coroutine.yield() end end end end if mode=='play' then if mget(plr.mx,plr.my)==86 then mset(plr.mx,plr.my,0) end --if mget(xit.mx,xit.my)==72 then mset(xit.mx,xit.my,0) end local nogems=true for mx=3,30-3-1 do for my=17+0,17+17-1 do if mget(mx,my)==23 then nogems=false; goto skip end end end ::skip:: if nogems then if not (xit.id==22) then shout('Level exit is now open.'); xit.id=22 end end local sp=plr.id local dx,dy=0,0 if btnp(4) and not plr.jump then dy=-2.4; plr.dy=-2.4; plr.jump=true end if btn(2) then dx=-0.4; if plr.dx>0 then plr.dx=0 end; plr.dx=plr.dx+dx end if btn(3) then dx= 0.4; if plr.dx<0 then plr.dx=0 end; plr.dx=plr.dx+dx end plr.y=plr.y+plr.dy for mx=3,30-3-1 do for my=17+0,17+17-1 do if fget(mget(mx,my),2) and AABB(plr.x,plr.y,8,8,(mx-3)*8,(my-17)*8,8,8) then if plr.dy>0 then plr.y=(my-17)*8-8; plr.dy=0; plr.jump=false else plr.y=(my-17)*8+8 end if mget(mx,my)==12 then collapse(mx,my) end goto endycoll end end end for mx=3,30-3-1 do for my=17+0,17+17-1 do if mget(mx,my)==21 and plr.dy>0 and AABB(plr.x,plr.y,8,8,(mx-3)*8,(my-17)*8,8,8) then plr.dy=0; plr.jump=false if btn(1) then plr.y=plr.y+1 end goto endycoll end end end ::endycoll:: plr.dy=plr.dy+0.1 if not (plr.dx==0) then plr.x=plr.x+plr.dx for mx=3,30-3-1 do for my=17+0,17+17-1 do if fget(mget(mx,my),2) and AABB(plr.x,plr.y,8,8,(mx-3)*8,(my-17)*8,8,8) then if plr.dx>0 then plr.x=(mx-3)*8-8 else plr.x=(mx-3)*8+8; end plr.dx=0 if mget(mx,my)==12 then collapse(mx,my) end goto endxcoll end end end ::endxcoll:: plr.dx=plr.dx*0.7 end for mx=3,30-3-1 do for my=17+0,17+17-1 do if fget(mget(mx,my),1) and AABB(plr.x,plr.y,8,8,(mx-3)*8+1,(my-17)*8+1,6,6) then mset(mx,my,0); sfx(7,'G-5',16,2) end if fget(mget(mx,my),3) and ( (mget(mx,my)==101 and AABB(plr.x,plr.y,8,8,(mx-3)*8,(my-17)*8+4,8,4)) or (mget(mx,my)==102 and AABB(plr.x,plr.y,8,8,(mx-3)*8,(my-17)*8,4,8)) or (mget(mx,my)==103 and AABB(plr.x,plr.y,8,8,(mx-3)*8,(my-17)*8,8,4)) or (mget(mx,my)==104 and AABB(plr.x,plr.y,8,8,(mx-3)*8+4,(my-17)*8,4,8)) ) then mode='lose' shout('You lost... score not saved. Y to reset.') if not puzzle then pmem(0,tsel) end music() particlespam(plr.x+4,plr.y+4) end end end if xit.id==22 and AABB(plr.x,plr.y,8,8,xit.x,xit.y,8,8) then mode='win' if not puzzle then if score>pmem(tsel) then pmem(tsel,score); music(5); shout('NEW HIGH SCORE! Press Y to reset.') else music(); sfx(9,'F-5',60+16,2); shout('You win! Score saved. Press Y to reset.') end pmem(tsel+6,score) pmem(0,tsel) else shout('You win! Press A to proceed.') pmem(255,puzzle) music(); sfx(9,'F-5',60+16,2) end end if plr.y>=136 then mode='lose' shout('You lost... score not saved. Y to reset.') if not puzzle then pmem(0,tsel) end music() end spr(xit.id,xit.x,xit.y) if math.abs(plr.dx)>0.02 then plr.t=plr.t or t; sp=sp+(t-plr.t)*0.18%4 else plr.t=nil end if plr.jump then sp=88 end local flip=0; if plr.dx<0 then flip=1 end spr(sp,plr.x,plr.y,12,1,flip) for i=#collapsing,1,-1 do local c=collapsing[i] if (t-c.t)%16==0 then local nsp=mget(c.x,c.y)+1 if nsp<=14 then mset(c.x,c.y,nsp) else mset(c.x,c.y,0) table.remove(collapsing,i) particlespam((c.x-3)*8+4,(c.y-17)*8+4) end end end end for i=#labels,1,-1 do local lb=labels[i] local tw=print(lb,0,-6,0,false,1,true) print(lb.msg,lb.x+1,lb.y,9,false,1,true) print(lb.msg,lb.x-1,lb.y,9,false,1,true) print(lb.msg,lb.x,lb.y+1,9,false,1,true) print(lb.msg,lb.x,lb.y-1,9,false,1,true) print(lb.msg,lb.x,lb.y,12,false,1,true) lb.y=lb.y-0.25 if t-lb.t>60 then table.remove(labels,i) end end if btnp(7) or (puzzle and mode=='win' and btnp(4)) then reset() end if place_cor then if (t-pt)%16==0 then if not coroutine.resume(place_cor) then place_cor=nil; shout(pmsg) else if not (coroutine.status(place_cor)=='dead') then sfx(4,'A-5',7,2) else place_cor=nil; shout(pmsg) end end end if dotted_anim then dotted_anim=dotted_anim+1 end end if erase_cor then if 1 then if not coroutine.resume(erase_cor) then erase_cor=nil; shout('Now play the level.'); music(4) end end if dotted_anim then dotted_anim=dotted_anim+1 end end for i=#particles,1,-1 do local p=particles[i] pix(p.x,p.y,9) p.x=p.x+p.dx; p.y=p.y+p.dy p.dy=p.dy+0.1 if p.y>=136 then table.remove(particles,i) end end pal() --if not mode and pmem(255)==0 then mode='talk' end --[[if mode=='talk' then rect(explain.x,explain.y,explain.w+4,explain.h+4,9) clip(explain.x,explain.y,explain.w,explain.h) talk=diag[diag.i] talk.t=talk.t or t spr(talk.sp,explain.x+2,explain.y+2,0,1,0,0,3,3) print(string.sub(talk[1],1,t-talk.t),explain.x+24+4,explain.y+2,12) rectb(explain.x,explain.y,explain.w,explain.h,12) explain.w=explain.w+(180+1-explain.w)*0.1 explain.h=explain.h+(24+4+1-explain.h)*0.1 if btnp(4) then diag.i=diag.i+1 if diag.i>#diag then mode=nil else if not (talk.sp==diag[diag.i].sp) then explain.w=0; explain.h=0 end end end clip() end]] if invert then for nx=0,240-1 do for ny=0,136-1 do if pix(nx,ny)==9 then pix(nx,ny,12) else pix(nx,ny,9) end end end end end explain={x=(240-180)/2,y=136-24-4-4,w=0,h=0} dialogue={ ['intro']={ {'...So I think this piece goes\nhere.',sp=256}, {'And then I just press B to\nplace this final piece,\nright?',sp=256}, {'You sure you know what\nyou\'re doing?',sp=260}, {'Hey, I\'m trying to make this\neasy for you.',sp=256}, }, ['gmtk']={ {'Hello world! I am the build\nmode mascot.',sp=256}, {'And I am in charge of the\nadventure mode.',sp=260}, {'What the heck am I anyway?\nSome kinda cat-bunny?',sp=260}, {'We\'ll pop up with dialogue\nwhenever specific events\nare triggered.',sp=256}, }, } diag=dialogue['intro'] diag.i=1 --mode='talk' header={ msg={}, t=t, } function shout(msg) table.insert(header.msg,msg) header.t=t+1 end shout('Constructing...') dotted_anim=t function randomchoice(tbl,remove) local n=math.random(#tbl) local out=tbl[n] if remove then table.remove(tbl,n) end return out end piece_list={ {{0,0},{1,0},{1,1},{2,1}}, {{0,1},{1,1},{1,0},{2,0}}, {{0,0},{0,1},{1,1},{1,2}}, {{1,0},{1,1},{0,1},{0,2}}, {{0,0},{1,0},{1,1},{0,1}}, {{0,0},{1,0},{2,0},{1,1}}, {{0,1},{1,1},{2,1},{1,0}}, {{0,0},{0,1},{0,2},{1,1}}, {{1,0},{1,1},{1,2},{0,1}}, {{1,0},{1,1},{1,2}}, {{0,1},{1,1},{2,1}}, {{1,1}}, {{1,1,26}}, {{1,1,27}}, {{1,1,23}}, } function randompiece() local out={} local out2=randomchoice(piece_list) local tile=out2[1][3] or randomchoice({6,6,7,7,8,8,12,23}) for i,v in ipairs(out2) do table.insert(out,{v[1],v[2],tile}) end -- hazards --if math.random(1,100)<10 then local avail={} for sx=0,3-1 do for sy=0,3-1 do if not piece_find(out,sx,sy) then table.insert(avail,{sx,sy}) end end end local mc=math.random(1,4)-2 for i=1,mc do local chaos=randomchoice(avail,true) local bonus=randomchoice({101,102,103,104,tile,26,27,23}) table.insert(out,{chaos[1],chaos[2],bonus}) end --end return out end function piece_find(out,sx,sy) for i,p in ipairs(out) do if p[1]==sx and p[2]==sy then return p[3] end end return nil end pieces={} for i=1,5 do table.insert(pieces,randompiece()) end cur_piece=pieces[1] table.remove(pieces,1) function place_piece() if puzzle==3 then if (cur_piece2[1][3]==27 and not (x+cur_piece2[1][1]==11 and y+cur_piece2[1][2]==0)) or (cur_piece2[1][3]==12 and not (x+cur_piece2[1][1]==13 or x+cur_piece2[1][1]==15)) then pmsg='If you get stuck, press Y to reset level.' end end for i,p in ipairs(cur_piece2) do if p[3]==26 or p[3]==27 then local pdy=-1; if p[3]==27 then pdy=1 end local px,py=p[1],p[2]--1,1 --local pf=piece_find(cur_piece2,px,py) while y+py<=17-1 and mget(x+3+px,y+py)>0 and mget(x+3+px,y+17+py)==0 do--and (not pf or pf==p[3]) do mset(x+3+px,y+17+py,21) add_score(15,x+3+px,y+17+py) py=py+pdy --pf=piece_find(cur_piece2,px,py) coroutine.yield() end elseif p[3]>=101 then local pdx,pdy=0,0 if p[3]==101 then pdy= 1 end if p[3]==102 then pdx=-1 end if p[3]==103 then pdy=-1 end if p[3]==104 then pdx= 1 end local px,py=p[1],p[2]--1,1 local prevx,prevy=px,py while y+py<=17-1 and mget(x+3+px,y+py)>0 and mget(x+3+px,y+17+py)==0 do mset(x+3+prevx,y+17+prevy,0) mset(x+3+px,y+17+py,p[3]) add_score(-5,x+3+px,y+17+py) prevx,prevy=px,py px=px+pdx; py=py+pdy coroutine.yield() end else mset(x+3+p[1],y+17+p[2],p[3]) if fget(p[3],2) then add_score(25,x+3+p[1],y+17+p[2]) elseif p[3]==23 then add_score(99,x+3+p[1],y+17+p[2]) end coroutine.yield() end end table.remove(pieces,1) if not puzzle then table.insert(pieces,randompiece()) end --if x_flag then clear_level() end --x=24-3;y=14-1 end update_cor=coroutine.create(update) function main_TIC() if update_cor and (not coroutine.resume(update_cor) or (not puzzle and not coroutine.resume(update_cor)) or (not puzzle and not coroutine.resume(update_cor))) then update_cor=nil if puzzle==1 then shout('Welcome! Place piece with arrows and A.') elseif puzzle==2 then shout('Tip: X button to rotate piece.') else shout('Place piece with arrows and A.') end music(3) --mode='talk' end if not update_cor then update() end t=t+1 end --TIC=main_TIC tsel=math.random(1,6) if pmem(0)>0 then tsel=pmem(0); pmem(0,0) end local level={176,179,182,179,176,184} local numerals={184,187,139-1,91-1,141,93} function title_TIC() cls(12) rect(0,136/2-6,240,12,9) local vd=0 for i,l in ipairs(level) do if l==182 then vd=vd+12+2 else vd=vd+16+2+1 end if i==5 then vd=vd+16+2+1 end end local d=12 for i,l in ipairs(level) do local rw,rh=3,3 if l==182 then rw,rh=2,2 end spr(l,d,136/2-6-4+math.sin(t*0.12+i)*2,2,1,0,0,rw,rh) if l==182 then d=d+12+2 else d=d+16+2+1 end if i==5 then d=d+16+2+1 end end if t%24<16 then spr(214,12-8-3,136/2-6+2,2) end if t%24>12 then spr(214,12-8+d,136/2-6+2,2,1,1) end if btnp(0) or btnp(2) then tsel=tsel-1; if btnp(0) then tsel=tsel-2 end; if tsel<1 then tsel=(tsel-1)%6+1 end; sfx(5,'A-5',6,2); st=nil end if btnp(1) or btnp(3) then tsel=tsel+1; if btnp(1) then tsel=tsel+2 end; if tsel>6 then tsel=(tsel-1)%6+1 end; sfx(5,'A-4',6,2); st=nil end if btnp(7) then tsel=math.random(1,6); sfx(5,'A-5',6,2); st=nil end level[6]=numerals[tsel] -- draw 6 level previews for i=1,6 do local mx,my -- for loop variables local bx,by=(i-1)%3,(i-1)//3 -- whole pic offset local buffer_len_x=28 -- changing this has weird fx... local buffer_len_y=17 local buffer_len_z=22 -- internal pic position local bmx,bmy=bx*buffer_len_x,by*buffer_len_y for mx=i*30,i*30+30-1 do for my=0,17-1 do if mget(mx,my)>0 then -- pixels on the screen rectb((bmx+mx-i*30)*3-3*3, (bmy*3+my-(i-1)//3*buffer_len_z)*3+(i-1)//3, 3,3,9) end end end local lv_best=pmem(i) local lv_prev=pmem(i+6) local sx,sy=bx*buffer_len_x*3+27,by if sy==0 then sy=3*17-1 else sy=136-3*17-4 end print(string.format('%.5d',lv_best),sx,sy,9,true,1,true) if i==tsel then clip(0,136/2-6,240,12) st=st or t local sfn=true local msg='A to enter level\nB to see credits' if (t-st)%400<200 then msg=string.format('Best: %.5d\nLast: %.5d',lv_best,lv_prev); sfn=false end print(msg,240/2+36+8-1,136/2-6+12-math.min((t-st)%200,12),12,true,1,sfn) clip() end if i==tsel then local row_scale=5.195 for nx=bmx*3+26*3-1-2*3,bmx*3+0,-1 do for ny=bmy*row_scale+17*3-4+8,bmy*row_scale+0-8,-1 do if pix(nx,ny)==9 then pix(nx,ny,12) elseif pix(nx,ny)==12 then pix(nx,ny,9) end end end end end if btnp(4) then for mx=30*tsel,30*tsel+30-1 do for my=0,17-1 do mset(mx-30*tsel,my,mget(mx,my)) end end TIC=main_TIC score=0 x=24-3;y=14-1 t=-1 music() elseif btnp(5) then cred_cor=coroutine.create(credits_TIC) TIC=function() if not cred_cor or not coroutine.resume(cred_cor) or not coroutine.resume(cred_cor) then cred_cor=nil; credits_TIC() end t=t+1 end music() end t=t+1 end TIC=title_TIC --music(1) -- copy map to buffer --for mx=30,30+30-1 do for my=0,17-1 do -- mset(mx-30,my,mget(mx,my)) --end end function clear_level() erase_cor=coroutine.create(function() for mx=3,30-3-1 do for my=17+0,17+17-1 do if mget(mx,my)==86 then mset(mx,my,0); plr={mx=mx,my=my-17,x=(mx-3)*8,y=(my-17)*8,dx=0,dy=0,id=86} end if mget(mx,my)==72 then xit={mx=mx,my=my-17,x=(mx-3)*8,y=(my-17)*8,id=72} end end end local doorpos={} for mx=3,30-3-1 do for my=17+0,17+17-1 do if mget(mx,my-17)>0 and mget(mx,my)==0 and fget(mget(mx,my+1),2) then table.insert(doorpos,{mx,my}) end end end local ep local sp if #doorpos==0 then sp={3,17} else sp=randomchoice(doorpos,true) end if #doorpos==0 then ep={26,17+17-1-1} else ep=randomchoice(doorpos,true) --mset(dp[1],dp[2],72) end for mx=3,30-1 do for my=0,17-1 do if not plr and mx==sp[1] and my+17==sp[2] then mset(sp[1],sp[2],86) plr={mx=sp[1],my=sp[2],x=(mx-3)*8,y=my*8,dx=0,dy=0,id=86} coroutine.yield() end if not xit and mx==ep[1] and my+17==ep[2] then mset(ep[1],ep[2],72) xit={mx=ep[1],my=ep[2],x=(mx-3)*8,y=my*8,id=72} coroutine.yield() end if mget(mx,my)>0 and mget(mx,my+17)==0 then spr(0,(mx-3)*8,my*8) coroutine.yield() end end end mode='play' music(4) end) shout('Finishing level...') music() end function gems_in_level() for mx=3,30-1 do for my=17,17+17-1 do if mget(mx,my)==23 then return true end end end if not cur_piece then return false end for i,p in ipairs(cur_piece) do if p[3]==23 then return true end end return false end function gen_music(t) for i=0,64-1-6 do if t%480>=240 then local base=0 if (t+i)//68%6>=3 then base=0xffff end local mult=0.68 if (t+i)//68%8<4 then mult=15.68 end poke(0xFF9C+i,base+t*mult-t*2%4*16) else local phase=88 if t%240<120 then phase=188 end poke(0xFF9C+2+i,0xff-t*phase) end end end local cred_msg='*!* BLUEPRINT (c) Leonard Somero *!* Version 1.d, March-April 2025 *!* Made with TIC-80 *!* Special thanks to Stefan V., the Jwaaaap Discord, the SuomiGameHub Discord, and the GMTK Discord for playtesting and finding improvements. *!*' local ctw=print(cred_msg,0,-6) function credits_TIC() cls(9) pal(12,9); pal(9,12); poke(0x3FF8,12) ct=ct or t if cred_cor then for mx=30,30+30-1 do for my=17,17+17-1 do if mget(mx,my)>0 then local sx,sy=(mx-30)*8,(my-17)*8 spr(37,sx,sy) end if mget(mx,my)>0 then gen_music(t-ct+480); coroutine.yield() end end end end local wobble=false if not cred_cor then wobble=true end for mx=30,30+30-1 do for my=17,17+17-1 do if mget(mx,my)>0 then local sx,sy=(mx-30)*8,(my-17)*8 if wobble then local wob_str=1--1+math.sin(t*0.01)*0.5 sx=sx+math.cos(t*0.09+mx+my)*wob_str; sy=sy+math.sin(t*0.09+mx+my)*wob_str end spr(mget(mx,my),sx,sy) end if cred_cor and mget(mx,my)>0 then gen_music(t-ct+480); coroutine.yield() end end end gen_music(t-ct+480) ct2=ct2 or t rect(240-math.min((t-ct2)*8,240),136/2-6,math.min((t-ct2)*8,240),12,9) local tx=0 for i=1,#cred_msg do tx=tx+print(string.sub(cred_msg,i,i),tx+240-(t-ct2)*0.5%(ctw+240)+math.sin((t-ct2)*0.12)*2,136/2-3+1+math.sin(((t-ct2)*0.6+i*4)*0.11)*2,9) end if btnp(4) or btnp(5) then TIC=title_TIC; poke(0x3FF8,9); ct=nil; ct2=nil; st=nil; music(1) end pal() t=t+1 end labels={} function add_label(msg,lx,ly) table.insert(labels,{msg=msg, x=lx+4-print(msg,0,-6,0,false,1,true)/2+1, y=ly, t=t}) end mult=1 function add_score(sc,scx,scy) -- scx,scy in map coordinates local add=sc*mult score=score+add if score<0 then score=0 end add_label(add,(scx-3)*8,(scy-17)*8) end collapsing={} function collapse(mx,my) --mset(mx,my,13) for i,c in ipairs(collapsing) do if c.x==mx and c.y==my then return end end table.insert(collapsing,{x=mx,y=my,t=t}) end particles={} function particlespam(px,py) for i=1,36 do local dx=(math.random(0,7)-4)/3 local dy=-(math.random(1,3))/2 table.insert(particles,{x=px,y=py,dx=dx,dy=dy}) end end function puzzle_piece() for mx=puzzle*30+#pieces*3,puzzle*30+#pieces*3+3-1 do for my=17*3,17*3+3-1 do if mget(mx,my)>0 then return true end end end return false end function puzzle_init() for mx=puzzle*30+3,puzzle*30+30-3-1 do for my=17*2,17*2+17-1 do mset(mx-puzzle*30,my-17*2,0); mset(mx-puzzle*30,my-17,0) if mget(mx,my)==37 then mset(mx-puzzle*30,my-17*2,37) elseif mget(mx,my)>0 then mset(mx-puzzle*30,my-17,mget(mx,my)) end end end pieces={} while puzzle_piece() do table.insert(pieces,{}) for mx=puzzle*30+(#pieces-1)*3,puzzle*30+(#pieces-1)*3+3-1 do for my=17*3,17*3+3-1 do if mget(mx,my)>0 then table.insert(pieces[#pieces],{mx-(puzzle*30+(#pieces-1)*3),my-17*3,mget(mx,my)}) end end end end cur_piece=pieces[1] table.remove(pieces,1) TIC=main_TIC end function unlock_TIC() cls(9) pal(9,12); pal(12,9) for i=#pieces,1,-1 do local p=pieces[i] rectb((p.i-1)*(3*8+3)-1+1-t,0-1+1,24+2,24+2,9) for i2,p2 in ipairs(p) do spr(p2[3],(p.i-1)*(3*8+3)+p2[1]*8-t+1,p2[2]*8+1) end if (p.i-1)*(3*8+3)-1+1-t<-26 then table.remove(pieces,1) table.insert(pieces,randompiece()) pieces[#pieces].i=pieces[#pieces-1].i+1 end --print(#pieces,0,0,12) end for i=#pieces2,1,-1 do local p=pieces2[i] rectb((-p.i+1)*(3*8+3)-1+1+t+240,136-26,24+2,24+2,9) for i2,p2 in ipairs(p) do spr(p2[3],(-p.i+1)*(3*8+3)+p2[1]*8+1+t+240,136-26+p2[2]*8+1) end if (-p.i+1)*(3*8+3)-1+1+t+240>=240 then table.remove(pieces2,1) table.insert(pieces2,randompiece()) pieces2[#pieces2].i=pieces2[#pieces2-1].i+1 end --print(#pieces2,0,0,12) end pal() clip(240-math.min(t*12,240),136/2-12,240,10) rect(0,136/2-12,240,10,12) rect(0,136/2-12+2,240,10-4,9) print('Tutorial complete!',240/2-print('Tutorial complete!',0,-6)/2,136/2-10,12) clip() clip(240-math.min((t-20)*12,240),136/2,240,10) rect(0,136/2,240,10,12) rect(0,136/2+2,240,10-4,9) print('Now move on to the main game!',240/2-print('Now move on to the main game!',0,-6,0,false,1,true)/2,136/2+2,12,false,1,true) clip() if (t-20)*12>=240 and t%(24*3)<18*3 then print('Press A to start your high scoring journey...',240/2-print('Press A to start your high scoring journey...',0,-6,0,false,1,true)/2,136/2+2+10+10,12,false,1,true) if btnp(4) then pmem(0,1); music(); reset() end end t=t+1 end if pmem(255)<4 then puzzle=pmem(255)+1 puzzle_init() elseif pmem(255)==4 then TIC=unlock_TIC pieces={} for i=1,10 do table.insert(pieces,randompiece()); pieces[#pieces].i=i end pieces2={} for i=1,10 do table.insert(pieces2,randompiece()); pieces2[#pieces2].i=i end pmem(255,5) music(5) else TIC=title_TIC music(1) end -- basic AABB collision. function AABB(x1,y1,w1,h1, x2,y2,w2,h2) return (x1 < x2 + w2 and x1 + w1 > x2 and y1 < y2 + h2 and y1 + h1 > y2) end -- palette swapping by BORB function pal(c0,c1) if(c0==nil and c1==nil) then for i=0,15 do poke4(0x3FF0*2+i,i) end else poke4(0x3FF0*2+c0,c1) end end --invert=true --pmem(255,0)