From c5fcf7179a83ef65c86c6a4a390029149e518649 Mon Sep 17 00:00:00 2001 From: Franciszek Malinka Date: Tue, 5 Oct 2021 21:49:54 +0200 Subject: Duzy commit ze smieciami --- ...1081_1151103648602701_2043131207718798221_n.jpg | Bin 0 -> 365667 bytes semestr-2/algebra/32.jpg | Bin 0 -> 206132 bytes semestr-2/algebra/33.jpg | Bin 0 -> 212272 bytes semestr-2/algebra/34.jpg | Bin 0 -> 190004 bytes semestr-2/algebra/35.jpg | Bin 0 -> 220677 bytes semestr-2/algebra/36.jpg | Bin 0 -> 184488 bytes semestr-2/algebra/37.jpg | Bin 0 -> 171842 bytes semestr-2/algebra/38.jpg | Bin 0 -> 197921 bytes semestr-2/algebra/39.jpg | Bin 0 -> 174797 bytes semestr-2/algebra/40.jpg | Bin 0 -> 195910 bytes semestr-2/algebra/41.jpg | Bin 0 -> 173475 bytes semestr-2/algebra/42.jpg | Bin 0 -> 233446 bytes semestr-2/algebra/43.jpg | Bin 0 -> 188791 bytes semestr-2/algebra/44.jpg | Bin 0 -> 197980 bytes semestr-2/algebra/45.jpg | Bin 0 -> 167104 bytes semestr-2/algebra/46.jpg | Bin 0 -> 210398 bytes semestr-2/algebra/47.jpg | Bin 0 -> 190287 bytes semestr-2/algebra/48.jpg | Bin 0 -> 186012 bytes semestr-2/algebra/49.jpg | Bin 0 -> 182485 bytes semestr-2/algebra/50.jpg | Bin 0 -> 193019 bytes ...eiliby\305\233myUdziela\304\207Korepetycji.jpg" | Bin 0 -> 34616 bytes semestr-2/algebra/FraMalEgzamin.pdf | Bin 0 -> 963445 bytes semestr-2/algebra/egzamin/z1a.jpg | Bin 0 -> 173901 bytes semestr-2/algebra/egzamin/z1b.jpg | Bin 0 -> 43979 bytes semestr-2/algebra/egzamin/z2a.jpg | Bin 0 -> 43523 bytes semestr-2/algebra/egzamin/z2b.jpg | Bin 0 -> 46691 bytes semestr-2/algebra/egzamin/z2c.jpg | Bin 0 -> 103884 bytes semestr-2/algebra/egzamin/z4a.jpg | Bin 0 -> 40713 bytes semestr-2/algebra/egzamin/z4b.jpg | Bin 0 -> 60338 bytes semestr-2/algebra/egzamin/z4c.jpg | Bin 0 -> 50039 bytes semestr-2/algebra/egzamin/z5a.jpg | Bin 0 -> 39674 bytes semestr-2/algebra/egzamin/z5b.jpg | Bin 0 -> 31446 bytes semestr-2/algebra/egzamin/z6.jpg | Bin 0 -> 39287 bytes semestr-2/algebra/egzamin/z6a.jpg | Bin 0 -> 44221 bytes semestr-2/algebra/egzamin/z6b.jpg | Bin 0 -> 49631 bytes semestr-2/algebra/egzamin/z6c.jpg | Bin 0 -> 47465 bytes semestr-2/algebra/kolokwium/zad1.jpg | Bin 0 -> 311797 bytes semestr-2/algebra/kolokwium/zad2.jpg | Bin 0 -> 63809 bytes semestr-2/algebra/kolokwium/zad2cd.jpg | Bin 0 -> 65841 bytes semestr-2/algebra/kolokwium/zad3.jpg | Bin 0 -> 90572 bytes semestr-2/algebra/kolokwium/zad4.jpg | Bin 0 -> 306994 bytes semestr-2/algebra/kolokwium/zad6.jpg | Bin 0 -> 288908 bytes semestr-2/algebra/lista10/66.png | Bin 0 -> 391731 bytes semestr-2/algebra/lista10/67.png | Bin 0 -> 389525 bytes semestr-2/algebra/lista10/68.png | Bin 0 -> 497884 bytes semestr-2/algebra/lista10/69.png | Bin 0 -> 424553 bytes semestr-2/algebra/lista10/70.png | Bin 0 -> 348488 bytes semestr-2/algebra/lista10/71.png | Bin 0 -> 378907 bytes semestr-2/algebra/lista10/72.png | Bin 0 -> 385889 bytes semestr-2/algebra/lista10/73.png | Bin 0 -> 369513 bytes semestr-2/algebra/lista10/74.png | Bin 0 -> 401320 bytes semestr-2/algebra/lista10/75.png | Bin 0 -> 327086 bytes semestr-2/algebra/lista10/76.png | Bin 0 -> 375970 bytes semestr-2/algebra/lista10/77.png | Bin 0 -> 366403 bytes semestr-2/algebra/lista10/zad1.jpg | Bin 0 -> 204448 bytes semestr-2/algebra/lista10/zad11.jpg | Bin 0 -> 238123 bytes semestr-2/algebra/lista10/zad21A.jpg | Bin 0 -> 194934 bytes semestr-2/algebra/lista10/zad21B.jpg | Bin 0 -> 49197 bytes semestr-2/algebra/lista10/zad21C.jpg | Bin 0 -> 48670 bytes semestr-2/algebra/lista10/zad21D.jpg | Bin 0 -> 309659 bytes semestr-2/algebra/lista10/zad3.jpg | Bin 0 -> 255585 bytes semestr-2/algebra/lista10/zad6.jpg | Bin 0 -> 233281 bytes semestr-2/algebra/lista10/zad7.jpg | Bin 0 -> 258015 bytes semestr-2/algebra/lista11/78.png | Bin 0 -> 1398319 bytes semestr-2/algebra/lista11/79.png | Bin 0 -> 1266655 bytes semestr-2/algebra/lista11/80.png | Bin 0 -> 1424243 bytes semestr-2/algebra/lista11/81.png | Bin 0 -> 1376070 bytes semestr-2/algebra/lista11/82.png | Bin 0 -> 1408919 bytes semestr-2/algebra/lista11/83.png | Bin 0 -> 1391087 bytes semestr-2/algebra/lista11/84.png | Bin 0 -> 1372672 bytes semestr-2/algebra/lista11/85.png | Bin 0 -> 1410804 bytes semestr-2/algebra/lista11/86.png | Bin 0 -> 1368489 bytes semestr-2/algebra/lista11/87.png | Bin 0 -> 1361263 bytes semestr-2/algebra/lista11/88.png | Bin 0 -> 1385287 bytes semestr-2/algebra/lista11/89.png | Bin 0 -> 1404569 bytes semestr-2/algebra/lista11/90.png | Bin 0 -> 1339680 bytes semestr-2/algebra/lista11/91.png | Bin 0 -> 1372560 bytes semestr-2/algebra/lista11/92.png | Bin 0 -> 1404574 bytes semestr-2/algebra/lista11/zad1312.jpg | Bin 0 -> 260095 bytes semestr-2/algebra/lista11/zad2.jpg | Bin 0 -> 327561 bytes semestr-2/algebra/lista11/zad2c.jpg | Bin 0 -> 126523 bytes semestr-2/algebra/lista11/zad6.jpg | Bin 0 -> 122642 bytes semestr-2/algebra/lista11/zad7a.jpg | Bin 0 -> 146024 bytes semestr-2/algebra/lista11/zad7b.jpg | Bin 0 -> 211857 bytes semestr-2/algebra/lista11/zad9.jpg | Bin 0 -> 92369 bytes semestr-2/algebra/lista12/100.png | Bin 0 -> 345246 bytes semestr-2/algebra/lista12/101.png | Bin 0 -> 400133 bytes semestr-2/algebra/lista12/102.png | Bin 0 -> 302152 bytes semestr-2/algebra/lista12/103.png | Bin 0 -> 410059 bytes semestr-2/algebra/lista12/104.png | Bin 0 -> 325369 bytes semestr-2/algebra/lista12/105.png | Bin 0 -> 356252 bytes semestr-2/algebra/lista12/107.png | Bin 0 -> 376442 bytes semestr-2/algebra/lista12/16.jpg | Bin 0 -> 167273 bytes semestr-2/algebra/lista12/21.jpg | Bin 0 -> 175859 bytes semestr-2/algebra/lista12/7a.jpg | Bin 0 -> 189376 bytes semestr-2/algebra/lista12/7b.jpg | Bin 0 -> 206316 bytes semestr-2/algebra/lista12/8.jpg | Bin 0 -> 193076 bytes semestr-2/algebra/lista12/9.jpg | Bin 0 -> 42985 bytes semestr-2/algebra/lista12/95.png | Bin 0 -> 341457 bytes semestr-2/algebra/lista12/96.png | Bin 0 -> 369495 bytes semestr-2/algebra/lista12/97.png | Bin 0 -> 391960 bytes semestr-2/algebra/lista12/98.png | Bin 0 -> 340355 bytes semestr-2/algebra/lista12/99.png | Bin 0 -> 296338 bytes semestr-2/algebra/lista12/unknown.png | Bin 0 -> 1063866 bytes semestr-2/algebra/lista12/zad5.jpg | Bin 0 -> 24117 bytes semestr-2/algebra/lista13/110.png | Bin 0 -> 1222766 bytes semestr-2/algebra/lista13/111.png | Bin 0 -> 1194865 bytes semestr-2/algebra/lista13/112.png | Bin 0 -> 1189988 bytes semestr-2/algebra/lista13/113.png | Bin 0 -> 1192181 bytes semestr-2/algebra/lista13/114.png | Bin 0 -> 1223165 bytes semestr-2/algebra/lista13/115.png | Bin 0 -> 1197864 bytes semestr-2/algebra/lista13/116.png | Bin 0 -> 1204290 bytes semestr-2/algebra/lista13/117.png | Bin 0 -> 1203324 bytes semestr-2/algebra/lista13/118.png | Bin 0 -> 1200359 bytes semestr-2/algebra/lista13/zad11.jpg | Bin 0 -> 67460 bytes semestr-2/algebra/lista13/zad7.jpg | Bin 0 -> 174903 bytes semestr-2/algebra/lista13/zad8a.jpg | Bin 0 -> 46252 bytes semestr-2/algebra/lista13/zad8b.jpg | Bin 0 -> 70384 bytes semestr-2/algebra/lista14/11.jpg | Bin 0 -> 45816 bytes semestr-2/algebra/lista14/1a.jpg | Bin 0 -> 46431 bytes semestr-2/algebra/lista14/1aa.jpg | Bin 0 -> 45878 bytes semestr-2/algebra/lista14/1c.jpg | Bin 0 -> 89905 bytes semestr-2/algebra/lista14/1cc.jpg | Bin 0 -> 61182 bytes semestr-2/algebra/lista14/7.jpg | Bin 0 -> 64599 bytes semestr-2/algebra/lista14/8.jpg | Bin 0 -> 28811 bytes semestr-2/algebra/lista14/9a.jpg | Bin 0 -> 37695 bytes semestr-2/algebra/lista14/9b.jpg | Bin 0 -> 36484 bytes .../algebra/lista14/FraMal,z1;7;8;9;11;18.pdf | Bin 0 -> 608041 bytes semestr-2/algebra/lista14/zad18.jpg | Bin 0 -> 40241 bytes semestr-2/algebra/lista9/32.jpg | Bin 0 -> 247003 bytes semestr-2/algebra/lista9/34.jpg | Bin 0 -> 261625 bytes semestr-2/algebra/lista9/36.jpg | Bin 0 -> 215510 bytes semestr-2/algebra/lista9/38.jpg | Bin 0 -> 223506 bytes semestr-2/algebra/lista9/40.jpg | Bin 0 -> 225450 bytes semestr-2/algebra/lista9/42.jpg | Bin 0 -> 280494 bytes semestr-2/algebra/lista9/44.jpg | Bin 0 -> 218826 bytes semestr-2/algebra/lista9/46.jpg | Bin 0 -> 232402 bytes semestr-2/algebra/lista9/48.jpg | Bin 0 -> 223615 bytes semestr-2/algebra/lista9/50.jpg | Bin 0 -> 230537 bytes semestr-2/algebra/lista9/zad10.jpg | Bin 0 -> 161120 bytes semestr-2/algebra/lista9/zad10bpoprawka.jpg | Bin 0 -> 174812 bytes semestr-2/algebra/lista9/zad11.jpg | Bin 0 -> 157934 bytes semestr-2/algebra/lista9/zad12.jpg | Bin 0 -> 110740 bytes semestr-2/algebra/lista9/zad13.jpg | Bin 0 -> 273471 bytes semestr-2/algebra/lista9/zad6.jpg | Bin 0 -> 67937 bytes semestr-2/algebra/lista9/zad8a.jpg | Bin 0 -> 142464 bytes semestr-2/algebra/lista9/zad8b.jpg | Bin 0 -> 88781 bytes semestr-2/algebra/lista9/zad9.jpg | Bin 0 -> 168035 bytes semestr-2/algebra/z1a-skonwertowany.pdf | Bin 0 -> 963445 bytes semestr-2/algebra/zad101213.jpg | Bin 0 -> 185244 bytes semestr-2/algebra/zad14.jpg | Bin 0 -> 146485 bytes semestr-2/algebra/zad2;3;6;7;11;21.pdf | Bin 0 -> 1959170 bytes semestr-2/algebra/zad2;6;7;9.pdf | Bin 0 -> 1171720 bytes semestr-2/algebra/zad5;7;8;9;16.pdf | Bin 0 -> 892151 bytes semestr-2/algebra/zad7;8;11;15.pdf | Bin 0 -> 424939 bytes semestr-2/analiza/Analiza_last_gwiazdka.pdf | Bin 0 -> 155235 bytes .../L11Z8,9;L12Z1,2,3,7; PUNTK\303\223W 18.pdf" | Bin 0 -> 693764 bytes .../analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf | Bin 0 -> 457283 bytes ...;L10Z2,3,4;L11Z1,2,4,5,6;Punkt\303\263w 34.pdf" | Bin 0 -> 1613519 bytes semestr-2/analiza/Lista7;21pkt.pdf | Bin 0 -> 918184 bytes .../Lista9;zad3;5;6;8;12;PUNKT\303\223W 25.pdf" | Bin 0 -> 716107 bytes semestr-2/analiza/lista11/LISTA3;zad11.jpg | Bin 0 -> 207637 bytes semestr-2/analiza/lista11/l11z8l12z1.jpg | Bin 0 -> 161554 bytes semestr-2/analiza/lista11/l11z9.jpg | Bin 0 -> 198131 bytes semestr-2/analiza/lista11/l12z2.jpg | Bin 0 -> 161375 bytes semestr-2/analiza/lista11/l12z3.jpg | Bin 0 -> 56891 bytes semestr-2/analiza/lista11/l12z7.jpg | Bin 0 -> 33902 bytes semestr-2/analiza/lista11/szwarc26.06.jpg | Bin 0 -> 75212 bytes semestr-2/analiza/lista11/zad11b.jpg | Bin 0 -> 128041 bytes semestr-2/analiza/lista11/zad1a-e.jpg | Bin 0 -> 166178 bytes semestr-2/analiza/lista11/zad1f2.jpg | Bin 0 -> 177380 bytes semestr-2/analiza/lista11/zad2.jpg | Bin 0 -> 208902 bytes semestr-2/analiza/lista11/zad3.jpg | Bin 0 -> 193499 bytes semestr-2/analiza/lista11/zad4.jpg | Bin 0 -> 151935 bytes semestr-2/analiza/lista11/zad465.jpg | Bin 0 -> 152331 bytes semestr-2/analiza/lista11/zad7a.jpg | Bin 0 -> 206281 bytes semestr-2/analiza/lista11/zad7b.jpg | Bin 0 -> 206293 bytes semestr-2/analiza/zad12.jpg | Bin 0 -> 49660 bytes semestr-2/analiza/zad3;5.jpg | Bin 0 -> 247822 bytes semestr-2/analiza/zad6;8a.jpg | Bin 0 -> 230676 bytes semestr-2/analiza/zad8b1.jpg | Bin 0 -> 19594 bytes semestr-2/analiza/zad8b2.jpg | Bin 0 -> 30323 bytes semestr-2/analiza/zad8c.jpg | Bin 0 -> 56019 bytes semestr-2/racket/cnf.rkt | 188 + semestr-2/racket/cw.rkt | 57 + semestr-2/racket/deriv.rkt | 47 + semestr-2/racket/egzamin/rozw2.txt | 1 + semestr-2/racket/egzamin/zad1.bak | 1 + semestr-2/racket/egzamin/zad1.rkt | 300 ++ semestr-2/racket/egzamin/zad1a.bak | 300 ++ semestr-2/racket/egzamin/zad1a.rkt | 314 ++ semestr-2/racket/egzamin/zad1b.bak | 314 ++ semestr-2/racket/egzamin/zad1b.rkt | 482 +++ semestr-2/racket/egzamin/zad2.bak | 119 + semestr-2/racket/egzamin/zad2.rkt | 186 + semestr-2/racket/egzamin/zad3.bak | 4 + semestr-2/racket/egzamin/zad3.rkt | 347 ++ semestr-2/racket/egzamin/zad3a.bak | 298 ++ semestr-2/racket/egzamin/zad3a.rkt | 301 ++ semestr-2/racket/l10z18/solution.bak | 363 ++ semestr-2/racket/l10z18/solution.rkt | 409 +++ semestr-2/racket/l11/rozw.bak | 2 + semestr-2/racket/l11/rozw.rkt | 776 +++++ semestr-2/racket/l11/solution.bak | 18 + semestr-2/racket/l11/solution.rkt | 35 + .../compiled/drracket/errortrace/graph_rkt.dep | 1 + .../compiled/drracket/errortrace/graph_rkt.zo | Bin 0 -> 43422 bytes semestr-2/racket/l11z20/graph.bak | 97 + semestr-2/racket/l11z20/graph.rkt | 100 + semestr-2/racket/l11z20/solution.bak | 1 + semestr-2/racket/l11z20/solution.rkt | 245 ++ semestr-2/racket/l13/oceny.txt | 18 + semestr-2/racket/l13/rozw.rkt | 79 + semestr-2/racket/l13/solution.rkt | 124 + semestr-2/racket/l13/zad6.rkt | 132 + semestr-2/racket/l14z22/solution.bak | 70 + semestr-2/racket/l14z22/solution.rkt | 87 + semestr-2/racket/l15/kacp.bak | 55 + semestr-2/racket/l15/kacp.rkt | 59 + semestr-2/racket/l15/solution.bak | 7 + semestr-2/racket/l15/solution.rkt | 85 + semestr-2/racket/l7z12/solution.rkt | 95 + semestr-2/racket/l7z13/solution.rkt | 104 + semestr-2/racket/l8z14/solution.bak | 155 + semestr-2/racket/l8z14/solution.rkt | 201 ++ semestr-2/racket/l8z15/solution.bak | 187 + semestr-2/racket/l8z15/solution.rkt | 182 + semestr-2/racket/l9/zad4.rkt | 202 ++ semestr-2/racket/l9/zad7.rkt | 340 ++ semestr-2/racket/l9z16/solution.rkt | 42 + semestr-2/racket/l9z17/solution.rkt | 266 ++ semestr-2/racket/leftist.rkt | 105 + .../compiled/drracket/errortrace/prop_rkt.dep | 1 + .../compiled/drracket/errortrace/prop_rkt.zo | Bin 0 -> 1709 bytes .../compiled/drracket/errortrace/props_rkt.dep | 1 + .../compiled/drracket/errortrace/props_rkt.zo | Bin 0 -> 3273 bytes .../compiled/drracket/errortrace/solution_rkt.dep | 1 + .../compiled/drracket/errortrace/solution_rkt.zo | Bin 0 -> 10868 bytes .../compiled/drracket/errortrace/props_rkt.dep | 1 + .../compiled/drracket/errortrace/props_rkt.zo | Bin 0 -> 3273 bytes semestr-2/racket/lista5/julita/props.rkt | 52 + semestr-2/racket/lista5/julita/solution.bak | 164 + semestr-2/racket/lista5/julita/solution.rkt | 164 + semestr-2/racket/lista5/prop.rkt | 1 + semestr-2/racket/lista5/props.bak | 71 + semestr-2/racket/lista5/props.rkt | 52 + semestr-2/racket/lista5/skrr/solution.bak | 135 + semestr-2/racket/lista5/skrr/solution.rkt | 88 + semestr-2/racket/lista5/sol2.rkt | 90 + semestr-2/racket/lista5/solution.bak | 135 + semestr-2/racket/lista5/solution.rkt | 140 + semestr-2/racket/lista5/xd.bak | 4 + semestr-2/racket/lista5/xd.rkt | 4 + semestr-2/racket/lista6/lista8/kappa.py | 13 + semestr-2/racket/lista6/lista8/zad1.bak | 98 + semestr-2/racket/lista6/lista8/zad1.rkt | 104 + semestr-2/racket/lista6/lista8/zad4.bak | 114 + semestr-2/racket/lista6/lista8/zad4.rkt | 118 + semestr-2/racket/lista6/lista8/zad5.bak | 1 + semestr-2/racket/lista6/lista8/zad5.rkt | 151 + semestr-2/racket/lista6/lista8/zad6.bak | 151 + semestr-2/racket/lista6/lista8/zad6.rkt | 171 + semestr-2/racket/lista6/lista8/zadanie.rkt | 98 + semestr-2/racket/lista6/solution.bak | 27 + semestr-2/racket/lista6/solution.rkt | 73 + semestr-2/racket/lista6/zad11/solution.bak | 36 + semestr-2/racket/lista6/zad11/solution.rkt | 58 + semestr-2/racket/luk.rkt | 137 + semestr-2/racket/rac.rkt | 371 ++ semestr-2/racket/solution.rkt | 14 + ...85944_268984110829847_6553948354204680381_n.jpg | Bin 0 -> 63539 bytes ...6932_2682289525419459_8890828706710255563_n.jpg | Bin 0 -> 47593 bytes ...03086_728253774716175_2262465163427979269_n.jpg | Bin 0 -> 46311 bytes ...92000_316914386368237_6535047497894014786_n.jpg | Bin 0 -> 17926 bytes ...3323_1187351634957579_7077220020141497805_n.jpg | Bin 0 -> 48979 bytes ...KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf | 3629 ++++++++++++++++++++ .../topo/FraMalCz\304\231\305\233\304\2071.pdf" | Bin 0 -> 270505 bytes .../topo/FraMalCz\304\231\305\233\304\2072.pdf" | Bin 0 -> 689315 bytes semestr-2/topo/Topologia2_Franciszek_Malinka.pdf | Bin 0 -> 198792 bytes semestr-2/topo/zad1a.jpg | Bin 0 -> 55456 bytes semestr-2/topo/zad1aa.jpg | Bin 0 -> 49682 bytes semestr-2/topo/zad1b.jpg | Bin 0 -> 63375 bytes semestr-2/topo/zad1c.jpg | Bin 0 -> 46532 bytes semestr-2/topo/zad2a.jpg | Bin 0 -> 42734 bytes semestr-2/topo/zad2bc.jpg | Bin 0 -> 54378 bytes semestr-2/topo/zad2da.jpg | Bin 0 -> 55937 bytes semestr-2/topo/zad2db.jpg | Bin 0 -> 56781 bytes semestr-2/topo/zad2dc.jpg | Bin 0 -> 118128 bytes semestr-2/topo/zad2dd.jpg | Bin 0 -> 36936 bytes 289 files changed, 14369 insertions(+) create mode 100644 semestr-2/algebra/106131081_1151103648602701_2043131207718798221_n.jpg create mode 100644 semestr-2/algebra/32.jpg create mode 100644 semestr-2/algebra/33.jpg create mode 100644 semestr-2/algebra/34.jpg create mode 100644 semestr-2/algebra/35.jpg create mode 100644 semestr-2/algebra/36.jpg create mode 100644 semestr-2/algebra/37.jpg create mode 100644 semestr-2/algebra/38.jpg create mode 100644 semestr-2/algebra/39.jpg create mode 100644 semestr-2/algebra/40.jpg create mode 100644 semestr-2/algebra/41.jpg create mode 100644 semestr-2/algebra/42.jpg create mode 100644 semestr-2/algebra/43.jpg create mode 100644 semestr-2/algebra/44.jpg create mode 100644 semestr-2/algebra/45.jpg create mode 100644 semestr-2/algebra/46.jpg create mode 100644 semestr-2/algebra/47.jpg create mode 100644 semestr-2/algebra/48.jpg create mode 100644 semestr-2/algebra/49.jpg create mode 100644 semestr-2/algebra/50.jpg create mode 100644 "semestr-2/algebra/DodatkoweWyt\305\202umaczenieDlaKogo\305\233KomuNieCheiliby\305\233myUdziela\304\207Korepetycji.jpg" create mode 100644 semestr-2/algebra/FraMalEgzamin.pdf create mode 100644 semestr-2/algebra/egzamin/z1a.jpg create mode 100644 semestr-2/algebra/egzamin/z1b.jpg create mode 100644 semestr-2/algebra/egzamin/z2a.jpg create mode 100644 semestr-2/algebra/egzamin/z2b.jpg create mode 100644 semestr-2/algebra/egzamin/z2c.jpg create mode 100644 semestr-2/algebra/egzamin/z4a.jpg create mode 100644 semestr-2/algebra/egzamin/z4b.jpg create mode 100644 semestr-2/algebra/egzamin/z4c.jpg create mode 100644 semestr-2/algebra/egzamin/z5a.jpg create mode 100644 semestr-2/algebra/egzamin/z5b.jpg create mode 100644 semestr-2/algebra/egzamin/z6.jpg create mode 100644 semestr-2/algebra/egzamin/z6a.jpg create mode 100644 semestr-2/algebra/egzamin/z6b.jpg create mode 100644 semestr-2/algebra/egzamin/z6c.jpg create mode 100644 semestr-2/algebra/kolokwium/zad1.jpg create mode 100644 semestr-2/algebra/kolokwium/zad2.jpg create mode 100644 semestr-2/algebra/kolokwium/zad2cd.jpg create mode 100644 semestr-2/algebra/kolokwium/zad3.jpg create mode 100644 semestr-2/algebra/kolokwium/zad4.jpg create mode 100644 semestr-2/algebra/kolokwium/zad6.jpg create mode 100644 semestr-2/algebra/lista10/66.png create mode 100644 semestr-2/algebra/lista10/67.png create mode 100644 semestr-2/algebra/lista10/68.png create mode 100644 semestr-2/algebra/lista10/69.png create mode 100644 semestr-2/algebra/lista10/70.png create mode 100644 semestr-2/algebra/lista10/71.png create mode 100644 semestr-2/algebra/lista10/72.png create mode 100644 semestr-2/algebra/lista10/73.png create mode 100644 semestr-2/algebra/lista10/74.png create mode 100644 semestr-2/algebra/lista10/75.png create mode 100644 semestr-2/algebra/lista10/76.png create mode 100644 semestr-2/algebra/lista10/77.png create mode 100644 semestr-2/algebra/lista10/zad1.jpg create mode 100644 semestr-2/algebra/lista10/zad11.jpg create mode 100644 semestr-2/algebra/lista10/zad21A.jpg create mode 100644 semestr-2/algebra/lista10/zad21B.jpg create mode 100644 semestr-2/algebra/lista10/zad21C.jpg create mode 100644 semestr-2/algebra/lista10/zad21D.jpg create mode 100644 semestr-2/algebra/lista10/zad3.jpg create mode 100644 semestr-2/algebra/lista10/zad6.jpg create mode 100644 semestr-2/algebra/lista10/zad7.jpg create mode 100644 semestr-2/algebra/lista11/78.png create mode 100644 semestr-2/algebra/lista11/79.png create mode 100644 semestr-2/algebra/lista11/80.png create mode 100644 semestr-2/algebra/lista11/81.png create mode 100644 semestr-2/algebra/lista11/82.png create mode 100644 semestr-2/algebra/lista11/83.png create mode 100644 semestr-2/algebra/lista11/84.png create mode 100644 semestr-2/algebra/lista11/85.png create mode 100644 semestr-2/algebra/lista11/86.png create mode 100644 semestr-2/algebra/lista11/87.png create mode 100644 semestr-2/algebra/lista11/88.png create mode 100644 semestr-2/algebra/lista11/89.png create mode 100644 semestr-2/algebra/lista11/90.png create mode 100644 semestr-2/algebra/lista11/91.png create mode 100644 semestr-2/algebra/lista11/92.png create mode 100644 semestr-2/algebra/lista11/zad1312.jpg create mode 100644 semestr-2/algebra/lista11/zad2.jpg create mode 100644 semestr-2/algebra/lista11/zad2c.jpg create mode 100644 semestr-2/algebra/lista11/zad6.jpg create mode 100644 semestr-2/algebra/lista11/zad7a.jpg create mode 100644 semestr-2/algebra/lista11/zad7b.jpg create mode 100644 semestr-2/algebra/lista11/zad9.jpg create mode 100644 semestr-2/algebra/lista12/100.png create mode 100644 semestr-2/algebra/lista12/101.png create mode 100644 semestr-2/algebra/lista12/102.png create mode 100644 semestr-2/algebra/lista12/103.png create mode 100644 semestr-2/algebra/lista12/104.png create mode 100644 semestr-2/algebra/lista12/105.png create mode 100644 semestr-2/algebra/lista12/107.png create mode 100644 semestr-2/algebra/lista12/16.jpg create mode 100644 semestr-2/algebra/lista12/21.jpg create mode 100644 semestr-2/algebra/lista12/7a.jpg create mode 100644 semestr-2/algebra/lista12/7b.jpg create mode 100644 semestr-2/algebra/lista12/8.jpg create mode 100644 semestr-2/algebra/lista12/9.jpg create mode 100644 semestr-2/algebra/lista12/95.png create mode 100644 semestr-2/algebra/lista12/96.png create mode 100644 semestr-2/algebra/lista12/97.png create mode 100644 semestr-2/algebra/lista12/98.png create mode 100644 semestr-2/algebra/lista12/99.png create mode 100644 semestr-2/algebra/lista12/unknown.png create mode 100644 semestr-2/algebra/lista12/zad5.jpg create mode 100644 semestr-2/algebra/lista13/110.png create mode 100644 semestr-2/algebra/lista13/111.png create mode 100644 semestr-2/algebra/lista13/112.png create mode 100644 semestr-2/algebra/lista13/113.png create mode 100644 semestr-2/algebra/lista13/114.png create mode 100644 semestr-2/algebra/lista13/115.png create mode 100644 semestr-2/algebra/lista13/116.png create mode 100644 semestr-2/algebra/lista13/117.png create mode 100644 semestr-2/algebra/lista13/118.png create mode 100644 semestr-2/algebra/lista13/zad11.jpg create mode 100644 semestr-2/algebra/lista13/zad7.jpg create mode 100644 semestr-2/algebra/lista13/zad8a.jpg create mode 100644 semestr-2/algebra/lista13/zad8b.jpg create mode 100644 semestr-2/algebra/lista14/11.jpg create mode 100644 semestr-2/algebra/lista14/1a.jpg create mode 100644 semestr-2/algebra/lista14/1aa.jpg create mode 100644 semestr-2/algebra/lista14/1c.jpg create mode 100644 semestr-2/algebra/lista14/1cc.jpg create mode 100644 semestr-2/algebra/lista14/7.jpg create mode 100644 semestr-2/algebra/lista14/8.jpg create mode 100644 semestr-2/algebra/lista14/9a.jpg create mode 100644 semestr-2/algebra/lista14/9b.jpg create mode 100644 semestr-2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdf create mode 100644 semestr-2/algebra/lista14/zad18.jpg create mode 100644 semestr-2/algebra/lista9/32.jpg create mode 100644 semestr-2/algebra/lista9/34.jpg create mode 100644 semestr-2/algebra/lista9/36.jpg create mode 100644 semestr-2/algebra/lista9/38.jpg create mode 100644 semestr-2/algebra/lista9/40.jpg create mode 100644 semestr-2/algebra/lista9/42.jpg create mode 100644 semestr-2/algebra/lista9/44.jpg create mode 100644 semestr-2/algebra/lista9/46.jpg create mode 100644 semestr-2/algebra/lista9/48.jpg create mode 100644 semestr-2/algebra/lista9/50.jpg create mode 100644 semestr-2/algebra/lista9/zad10.jpg create mode 100644 semestr-2/algebra/lista9/zad10bpoprawka.jpg create mode 100644 semestr-2/algebra/lista9/zad11.jpg create mode 100644 semestr-2/algebra/lista9/zad12.jpg create mode 100644 semestr-2/algebra/lista9/zad13.jpg create mode 100644 semestr-2/algebra/lista9/zad6.jpg create mode 100644 semestr-2/algebra/lista9/zad8a.jpg create mode 100644 semestr-2/algebra/lista9/zad8b.jpg create mode 100644 semestr-2/algebra/lista9/zad9.jpg create mode 100644 semestr-2/algebra/z1a-skonwertowany.pdf create mode 100644 semestr-2/algebra/zad101213.jpg create mode 100644 semestr-2/algebra/zad14.jpg create mode 100644 semestr-2/algebra/zad2;3;6;7;11;21.pdf create mode 100644 semestr-2/algebra/zad2;6;7;9.pdf create mode 100644 semestr-2/algebra/zad5;7;8;9;16.pdf create mode 100644 semestr-2/algebra/zad7;8;11;15.pdf create mode 100644 semestr-2/analiza/Analiza_last_gwiazdka.pdf create mode 100644 "semestr-2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTK\303\223W 18.pdf" create mode 100644 semestr-2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf create mode 100644 "semestr-2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punkt\303\263w 34.pdf" create mode 100644 semestr-2/analiza/Lista7;21pkt.pdf create mode 100644 "semestr-2/analiza/Lista9;zad3;5;6;8;12;PUNKT\303\223W 25.pdf" create mode 100644 semestr-2/analiza/lista11/LISTA3;zad11.jpg create mode 100644 semestr-2/analiza/lista11/l11z8l12z1.jpg create mode 100644 semestr-2/analiza/lista11/l11z9.jpg create mode 100644 semestr-2/analiza/lista11/l12z2.jpg create mode 100644 semestr-2/analiza/lista11/l12z3.jpg create mode 100644 semestr-2/analiza/lista11/l12z7.jpg create mode 100644 semestr-2/analiza/lista11/szwarc26.06.jpg create mode 100644 semestr-2/analiza/lista11/zad11b.jpg create mode 100644 semestr-2/analiza/lista11/zad1a-e.jpg create mode 100644 semestr-2/analiza/lista11/zad1f2.jpg create mode 100644 semestr-2/analiza/lista11/zad2.jpg create mode 100644 semestr-2/analiza/lista11/zad3.jpg create mode 100644 semestr-2/analiza/lista11/zad4.jpg create mode 100644 semestr-2/analiza/lista11/zad465.jpg create mode 100644 semestr-2/analiza/lista11/zad7a.jpg create mode 100644 semestr-2/analiza/lista11/zad7b.jpg create mode 100644 semestr-2/analiza/zad12.jpg create mode 100644 semestr-2/analiza/zad3;5.jpg create mode 100644 semestr-2/analiza/zad6;8a.jpg create mode 100644 semestr-2/analiza/zad8b1.jpg create mode 100644 semestr-2/analiza/zad8b2.jpg create mode 100644 semestr-2/analiza/zad8c.jpg create mode 100644 semestr-2/racket/cnf.rkt create mode 100644 semestr-2/racket/cw.rkt create mode 100644 semestr-2/racket/deriv.rkt create mode 100644 semestr-2/racket/egzamin/rozw2.txt create mode 100644 semestr-2/racket/egzamin/zad1.bak create mode 100644 semestr-2/racket/egzamin/zad1.rkt create mode 100644 semestr-2/racket/egzamin/zad1a.bak create mode 100644 semestr-2/racket/egzamin/zad1a.rkt create mode 100644 semestr-2/racket/egzamin/zad1b.bak create mode 100644 semestr-2/racket/egzamin/zad1b.rkt create mode 100644 semestr-2/racket/egzamin/zad2.bak create mode 100644 semestr-2/racket/egzamin/zad2.rkt create mode 100644 semestr-2/racket/egzamin/zad3.bak create mode 100644 semestr-2/racket/egzamin/zad3.rkt create mode 100644 semestr-2/racket/egzamin/zad3a.bak create mode 100644 semestr-2/racket/egzamin/zad3a.rkt create mode 100644 semestr-2/racket/l10z18/solution.bak create mode 100644 semestr-2/racket/l10z18/solution.rkt create mode 100644 semestr-2/racket/l11/rozw.bak create mode 100644 semestr-2/racket/l11/rozw.rkt create mode 100644 semestr-2/racket/l11/solution.bak create mode 100644 semestr-2/racket/l11/solution.rkt create mode 100644 semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep create mode 100644 semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zo create mode 100644 semestr-2/racket/l11z20/graph.bak create mode 100644 semestr-2/racket/l11z20/graph.rkt create mode 100644 semestr-2/racket/l11z20/solution.bak create mode 100644 semestr-2/racket/l11z20/solution.rkt create mode 100644 semestr-2/racket/l13/oceny.txt create mode 100644 semestr-2/racket/l13/rozw.rkt create mode 100644 semestr-2/racket/l13/solution.rkt create mode 100644 semestr-2/racket/l13/zad6.rkt create mode 100644 semestr-2/racket/l14z22/solution.bak create mode 100644 semestr-2/racket/l14z22/solution.rkt create mode 100644 semestr-2/racket/l15/kacp.bak create mode 100644 semestr-2/racket/l15/kacp.rkt create mode 100644 semestr-2/racket/l15/solution.bak create mode 100644 semestr-2/racket/l15/solution.rkt create mode 100644 semestr-2/racket/l7z12/solution.rkt create mode 100644 semestr-2/racket/l7z13/solution.rkt create mode 100644 semestr-2/racket/l8z14/solution.bak create mode 100644 semestr-2/racket/l8z14/solution.rkt create mode 100644 semestr-2/racket/l8z15/solution.bak create mode 100644 semestr-2/racket/l8z15/solution.rkt create mode 100644 semestr-2/racket/l9/zad4.rkt create mode 100644 semestr-2/racket/l9/zad7.rkt create mode 100644 semestr-2/racket/l9z16/solution.rkt create mode 100644 semestr-2/racket/l9z17/solution.rkt create mode 100644 semestr-2/racket/leftist.rkt create mode 100644 semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep create mode 100644 semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zo create mode 100644 semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep create mode 100644 semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.zo create mode 100644 semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep create mode 100644 semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zo create mode 100644 semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep create mode 100644 semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zo create mode 100644 semestr-2/racket/lista5/julita/props.rkt create mode 100644 semestr-2/racket/lista5/julita/solution.bak create mode 100644 semestr-2/racket/lista5/julita/solution.rkt create mode 100644 semestr-2/racket/lista5/prop.rkt create mode 100644 semestr-2/racket/lista5/props.bak create mode 100644 semestr-2/racket/lista5/props.rkt create mode 100644 semestr-2/racket/lista5/skrr/solution.bak create mode 100644 semestr-2/racket/lista5/skrr/solution.rkt create mode 100644 semestr-2/racket/lista5/sol2.rkt create mode 100644 semestr-2/racket/lista5/solution.bak create mode 100644 semestr-2/racket/lista5/solution.rkt create mode 100644 semestr-2/racket/lista5/xd.bak create mode 100644 semestr-2/racket/lista5/xd.rkt create mode 100644 semestr-2/racket/lista6/lista8/kappa.py create mode 100644 semestr-2/racket/lista6/lista8/zad1.bak create mode 100644 semestr-2/racket/lista6/lista8/zad1.rkt create mode 100644 semestr-2/racket/lista6/lista8/zad4.bak create mode 100644 semestr-2/racket/lista6/lista8/zad4.rkt create mode 100644 semestr-2/racket/lista6/lista8/zad5.bak create mode 100644 semestr-2/racket/lista6/lista8/zad5.rkt create mode 100644 semestr-2/racket/lista6/lista8/zad6.bak create mode 100644 semestr-2/racket/lista6/lista8/zad6.rkt create mode 100644 semestr-2/racket/lista6/lista8/zadanie.rkt create mode 100644 semestr-2/racket/lista6/solution.bak create mode 100644 semestr-2/racket/lista6/solution.rkt create mode 100644 semestr-2/racket/lista6/zad11/solution.bak create mode 100644 semestr-2/racket/lista6/zad11/solution.rkt create mode 100644 semestr-2/racket/luk.rkt create mode 100644 semestr-2/racket/rac.rkt create mode 100644 semestr-2/racket/solution.rkt create mode 100644 semestr-2/topo/106185944_268984110829847_6553948354204680381_n.jpg create mode 100644 semestr-2/topo/106656932_2682289525419459_8890828706710255563_n.jpg create mode 100644 semestr-2/topo/106703086_728253774716175_2262465163427979269_n.jpg create mode 100644 semestr-2/topo/106792000_316914386368237_6535047497894014786_n.jpg create mode 100644 semestr-2/topo/107093323_1187351634957579_7077220020141497805_n.jpg create mode 100644 semestr-2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf create mode 100644 "semestr-2/topo/FraMalCz\304\231\305\233\304\2071.pdf" create mode 100644 "semestr-2/topo/FraMalCz\304\231\305\233\304\2072.pdf" create mode 100644 semestr-2/topo/Topologia2_Franciszek_Malinka.pdf create mode 100644 semestr-2/topo/zad1a.jpg create mode 100644 semestr-2/topo/zad1aa.jpg create mode 100644 semestr-2/topo/zad1b.jpg create mode 100644 semestr-2/topo/zad1c.jpg create mode 100644 semestr-2/topo/zad2a.jpg create mode 100644 semestr-2/topo/zad2bc.jpg create mode 100644 semestr-2/topo/zad2da.jpg create mode 100644 semestr-2/topo/zad2db.jpg create mode 100644 semestr-2/topo/zad2dc.jpg create mode 100644 semestr-2/topo/zad2dd.jpg (limited to 'semestr-2') diff --git a/semestr-2/algebra/106131081_1151103648602701_2043131207718798221_n.jpg b/semestr-2/algebra/106131081_1151103648602701_2043131207718798221_n.jpg new file mode 100644 index 0000000..b0e2f4e Binary files /dev/null and b/semestr-2/algebra/106131081_1151103648602701_2043131207718798221_n.jpg differ diff --git a/semestr-2/algebra/32.jpg b/semestr-2/algebra/32.jpg new file mode 100644 index 0000000..8f66fb0 Binary files /dev/null and b/semestr-2/algebra/32.jpg differ diff --git a/semestr-2/algebra/33.jpg b/semestr-2/algebra/33.jpg new file mode 100644 index 0000000..200d044 Binary files /dev/null and b/semestr-2/algebra/33.jpg differ diff --git a/semestr-2/algebra/34.jpg b/semestr-2/algebra/34.jpg new file mode 100644 index 0000000..39bb45c Binary files /dev/null and b/semestr-2/algebra/34.jpg differ diff --git a/semestr-2/algebra/35.jpg b/semestr-2/algebra/35.jpg new file mode 100644 index 0000000..ce2008c Binary files /dev/null and b/semestr-2/algebra/35.jpg differ diff --git a/semestr-2/algebra/36.jpg b/semestr-2/algebra/36.jpg new file mode 100644 index 0000000..b776d30 Binary files /dev/null and b/semestr-2/algebra/36.jpg differ diff --git a/semestr-2/algebra/37.jpg b/semestr-2/algebra/37.jpg new file mode 100644 index 0000000..18d9384 Binary files /dev/null and b/semestr-2/algebra/37.jpg differ diff --git a/semestr-2/algebra/38.jpg b/semestr-2/algebra/38.jpg new file mode 100644 index 0000000..1b90aee Binary files /dev/null and b/semestr-2/algebra/38.jpg differ diff --git a/semestr-2/algebra/39.jpg b/semestr-2/algebra/39.jpg new file mode 100644 index 0000000..6fa2ebb Binary files /dev/null and b/semestr-2/algebra/39.jpg differ diff --git a/semestr-2/algebra/40.jpg b/semestr-2/algebra/40.jpg new file mode 100644 index 0000000..64c2a62 Binary files /dev/null and b/semestr-2/algebra/40.jpg differ diff --git a/semestr-2/algebra/41.jpg b/semestr-2/algebra/41.jpg new file mode 100644 index 0000000..f160777 Binary files /dev/null and b/semestr-2/algebra/41.jpg differ diff --git a/semestr-2/algebra/42.jpg b/semestr-2/algebra/42.jpg new file mode 100644 index 0000000..e8de627 Binary files /dev/null and b/semestr-2/algebra/42.jpg differ diff --git a/semestr-2/algebra/43.jpg b/semestr-2/algebra/43.jpg new file mode 100644 index 0000000..ceffb0c Binary files /dev/null and b/semestr-2/algebra/43.jpg differ diff --git a/semestr-2/algebra/44.jpg b/semestr-2/algebra/44.jpg new file mode 100644 index 0000000..6237e6c Binary files /dev/null and b/semestr-2/algebra/44.jpg differ diff --git a/semestr-2/algebra/45.jpg b/semestr-2/algebra/45.jpg new file mode 100644 index 0000000..1ec6cf1 Binary files /dev/null and b/semestr-2/algebra/45.jpg differ diff --git a/semestr-2/algebra/46.jpg b/semestr-2/algebra/46.jpg new file mode 100644 index 0000000..c2cbcc0 Binary files /dev/null and b/semestr-2/algebra/46.jpg differ diff --git a/semestr-2/algebra/47.jpg b/semestr-2/algebra/47.jpg new file mode 100644 index 0000000..7a4a73c Binary files /dev/null and b/semestr-2/algebra/47.jpg differ diff --git a/semestr-2/algebra/48.jpg b/semestr-2/algebra/48.jpg new file mode 100644 index 0000000..d27be3d Binary files /dev/null and b/semestr-2/algebra/48.jpg differ diff --git a/semestr-2/algebra/49.jpg b/semestr-2/algebra/49.jpg new file mode 100644 index 0000000..4a626d9 Binary files /dev/null and b/semestr-2/algebra/49.jpg differ diff --git a/semestr-2/algebra/50.jpg b/semestr-2/algebra/50.jpg new file mode 100644 index 0000000..06f0fe4 Binary files /dev/null and b/semestr-2/algebra/50.jpg differ diff --git "a/semestr-2/algebra/DodatkoweWyt\305\202umaczenieDlaKogo\305\233KomuNieCheiliby\305\233myUdziela\304\207Korepetycji.jpg" "b/semestr-2/algebra/DodatkoweWyt\305\202umaczenieDlaKogo\305\233KomuNieCheiliby\305\233myUdziela\304\207Korepetycji.jpg" new file mode 100644 index 0000000..48546c1 Binary files /dev/null and "b/semestr-2/algebra/DodatkoweWyt\305\202umaczenieDlaKogo\305\233KomuNieCheiliby\305\233myUdziela\304\207Korepetycji.jpg" differ diff --git a/semestr-2/algebra/FraMalEgzamin.pdf b/semestr-2/algebra/FraMalEgzamin.pdf new file mode 100644 index 0000000..a4d4941 Binary files /dev/null and b/semestr-2/algebra/FraMalEgzamin.pdf differ diff --git a/semestr-2/algebra/egzamin/z1a.jpg b/semestr-2/algebra/egzamin/z1a.jpg new file mode 100644 index 0000000..6bca7ce Binary files /dev/null and b/semestr-2/algebra/egzamin/z1a.jpg differ diff --git a/semestr-2/algebra/egzamin/z1b.jpg b/semestr-2/algebra/egzamin/z1b.jpg new file mode 100644 index 0000000..23fa274 Binary files /dev/null and b/semestr-2/algebra/egzamin/z1b.jpg differ diff --git a/semestr-2/algebra/egzamin/z2a.jpg b/semestr-2/algebra/egzamin/z2a.jpg new file mode 100644 index 0000000..81a90c2 Binary files /dev/null and b/semestr-2/algebra/egzamin/z2a.jpg differ diff --git a/semestr-2/algebra/egzamin/z2b.jpg b/semestr-2/algebra/egzamin/z2b.jpg new file mode 100644 index 0000000..510ca22 Binary files /dev/null and b/semestr-2/algebra/egzamin/z2b.jpg differ diff --git a/semestr-2/algebra/egzamin/z2c.jpg b/semestr-2/algebra/egzamin/z2c.jpg new file mode 100644 index 0000000..361dae8 Binary files /dev/null and b/semestr-2/algebra/egzamin/z2c.jpg differ diff --git a/semestr-2/algebra/egzamin/z4a.jpg b/semestr-2/algebra/egzamin/z4a.jpg new file mode 100644 index 0000000..c1a480e Binary files /dev/null and b/semestr-2/algebra/egzamin/z4a.jpg differ diff --git a/semestr-2/algebra/egzamin/z4b.jpg b/semestr-2/algebra/egzamin/z4b.jpg new file mode 100644 index 0000000..85c70c0 Binary files /dev/null and b/semestr-2/algebra/egzamin/z4b.jpg differ diff --git a/semestr-2/algebra/egzamin/z4c.jpg b/semestr-2/algebra/egzamin/z4c.jpg new file mode 100644 index 0000000..2196e19 Binary files /dev/null and b/semestr-2/algebra/egzamin/z4c.jpg differ diff --git a/semestr-2/algebra/egzamin/z5a.jpg b/semestr-2/algebra/egzamin/z5a.jpg new file mode 100644 index 0000000..b12f4b3 Binary files /dev/null and b/semestr-2/algebra/egzamin/z5a.jpg differ diff --git a/semestr-2/algebra/egzamin/z5b.jpg b/semestr-2/algebra/egzamin/z5b.jpg new file mode 100644 index 0000000..50f4883 Binary files /dev/null and b/semestr-2/algebra/egzamin/z5b.jpg differ diff --git a/semestr-2/algebra/egzamin/z6.jpg b/semestr-2/algebra/egzamin/z6.jpg new file mode 100644 index 0000000..3ab55a0 Binary files /dev/null and b/semestr-2/algebra/egzamin/z6.jpg differ diff --git a/semestr-2/algebra/egzamin/z6a.jpg b/semestr-2/algebra/egzamin/z6a.jpg new file mode 100644 index 0000000..7af963e Binary files /dev/null and b/semestr-2/algebra/egzamin/z6a.jpg differ diff --git a/semestr-2/algebra/egzamin/z6b.jpg b/semestr-2/algebra/egzamin/z6b.jpg new file mode 100644 index 0000000..3c5c3e3 Binary files /dev/null and b/semestr-2/algebra/egzamin/z6b.jpg differ diff --git a/semestr-2/algebra/egzamin/z6c.jpg b/semestr-2/algebra/egzamin/z6c.jpg new file mode 100644 index 0000000..f46689f Binary files /dev/null and b/semestr-2/algebra/egzamin/z6c.jpg differ diff --git a/semestr-2/algebra/kolokwium/zad1.jpg b/semestr-2/algebra/kolokwium/zad1.jpg new file mode 100644 index 0000000..f8fa7be Binary files /dev/null and b/semestr-2/algebra/kolokwium/zad1.jpg differ diff --git a/semestr-2/algebra/kolokwium/zad2.jpg b/semestr-2/algebra/kolokwium/zad2.jpg new file mode 100644 index 0000000..7c92bf4 Binary files /dev/null and b/semestr-2/algebra/kolokwium/zad2.jpg differ diff --git a/semestr-2/algebra/kolokwium/zad2cd.jpg b/semestr-2/algebra/kolokwium/zad2cd.jpg new file mode 100644 index 0000000..692419a Binary files /dev/null and b/semestr-2/algebra/kolokwium/zad2cd.jpg differ diff --git a/semestr-2/algebra/kolokwium/zad3.jpg b/semestr-2/algebra/kolokwium/zad3.jpg new file mode 100644 index 0000000..1f5304c Binary files /dev/null and b/semestr-2/algebra/kolokwium/zad3.jpg differ diff --git a/semestr-2/algebra/kolokwium/zad4.jpg b/semestr-2/algebra/kolokwium/zad4.jpg new file mode 100644 index 0000000..f04662a Binary files /dev/null and b/semestr-2/algebra/kolokwium/zad4.jpg differ diff --git a/semestr-2/algebra/kolokwium/zad6.jpg b/semestr-2/algebra/kolokwium/zad6.jpg new file mode 100644 index 0000000..be3acea Binary files /dev/null and b/semestr-2/algebra/kolokwium/zad6.jpg differ diff --git a/semestr-2/algebra/lista10/66.png b/semestr-2/algebra/lista10/66.png new file mode 100644 index 0000000..da66007 Binary files /dev/null and b/semestr-2/algebra/lista10/66.png differ diff --git a/semestr-2/algebra/lista10/67.png b/semestr-2/algebra/lista10/67.png new file mode 100644 index 0000000..a3992f9 Binary files /dev/null and b/semestr-2/algebra/lista10/67.png differ diff --git a/semestr-2/algebra/lista10/68.png b/semestr-2/algebra/lista10/68.png new file mode 100644 index 0000000..9e036f5 Binary files /dev/null and b/semestr-2/algebra/lista10/68.png differ diff --git a/semestr-2/algebra/lista10/69.png b/semestr-2/algebra/lista10/69.png new file mode 100644 index 0000000..1c15346 Binary files /dev/null and b/semestr-2/algebra/lista10/69.png differ diff --git a/semestr-2/algebra/lista10/70.png b/semestr-2/algebra/lista10/70.png new file mode 100644 index 0000000..9665a37 Binary files /dev/null and b/semestr-2/algebra/lista10/70.png differ diff --git a/semestr-2/algebra/lista10/71.png b/semestr-2/algebra/lista10/71.png new file mode 100644 index 0000000..b8874b1 Binary files /dev/null and b/semestr-2/algebra/lista10/71.png differ diff --git a/semestr-2/algebra/lista10/72.png b/semestr-2/algebra/lista10/72.png new file mode 100644 index 0000000..756231b Binary files /dev/null and b/semestr-2/algebra/lista10/72.png differ diff --git a/semestr-2/algebra/lista10/73.png b/semestr-2/algebra/lista10/73.png new file mode 100644 index 0000000..27805e2 Binary files /dev/null and b/semestr-2/algebra/lista10/73.png differ diff --git a/semestr-2/algebra/lista10/74.png b/semestr-2/algebra/lista10/74.png new file mode 100644 index 0000000..a441e21 Binary files /dev/null and b/semestr-2/algebra/lista10/74.png differ diff --git a/semestr-2/algebra/lista10/75.png b/semestr-2/algebra/lista10/75.png new file mode 100644 index 0000000..16dedc1 Binary files /dev/null and b/semestr-2/algebra/lista10/75.png differ diff --git a/semestr-2/algebra/lista10/76.png b/semestr-2/algebra/lista10/76.png new file mode 100644 index 0000000..7671d0c Binary files /dev/null and b/semestr-2/algebra/lista10/76.png differ diff --git a/semestr-2/algebra/lista10/77.png b/semestr-2/algebra/lista10/77.png new file mode 100644 index 0000000..ecd5099 Binary files /dev/null and b/semestr-2/algebra/lista10/77.png differ diff --git a/semestr-2/algebra/lista10/zad1.jpg b/semestr-2/algebra/lista10/zad1.jpg new file mode 100644 index 0000000..43206e2 Binary files /dev/null and b/semestr-2/algebra/lista10/zad1.jpg differ diff --git a/semestr-2/algebra/lista10/zad11.jpg b/semestr-2/algebra/lista10/zad11.jpg new file mode 100644 index 0000000..1f6852c Binary files /dev/null and b/semestr-2/algebra/lista10/zad11.jpg differ diff --git a/semestr-2/algebra/lista10/zad21A.jpg b/semestr-2/algebra/lista10/zad21A.jpg new file mode 100644 index 0000000..2e113b2 Binary files /dev/null and b/semestr-2/algebra/lista10/zad21A.jpg differ diff --git a/semestr-2/algebra/lista10/zad21B.jpg b/semestr-2/algebra/lista10/zad21B.jpg new file mode 100644 index 0000000..c457411 Binary files /dev/null and b/semestr-2/algebra/lista10/zad21B.jpg differ diff --git a/semestr-2/algebra/lista10/zad21C.jpg b/semestr-2/algebra/lista10/zad21C.jpg new file mode 100644 index 0000000..d6a2eb8 Binary files /dev/null and b/semestr-2/algebra/lista10/zad21C.jpg differ diff --git a/semestr-2/algebra/lista10/zad21D.jpg b/semestr-2/algebra/lista10/zad21D.jpg new file mode 100644 index 0000000..2406f53 Binary files /dev/null and b/semestr-2/algebra/lista10/zad21D.jpg differ diff --git a/semestr-2/algebra/lista10/zad3.jpg b/semestr-2/algebra/lista10/zad3.jpg new file mode 100644 index 0000000..7c99c84 Binary files /dev/null and b/semestr-2/algebra/lista10/zad3.jpg differ diff --git a/semestr-2/algebra/lista10/zad6.jpg b/semestr-2/algebra/lista10/zad6.jpg new file mode 100644 index 0000000..e75f2e2 Binary files /dev/null and b/semestr-2/algebra/lista10/zad6.jpg differ diff --git a/semestr-2/algebra/lista10/zad7.jpg b/semestr-2/algebra/lista10/zad7.jpg new file mode 100644 index 0000000..669ccc7 Binary files /dev/null and b/semestr-2/algebra/lista10/zad7.jpg differ diff --git a/semestr-2/algebra/lista11/78.png b/semestr-2/algebra/lista11/78.png new file mode 100644 index 0000000..db20401 Binary files /dev/null and b/semestr-2/algebra/lista11/78.png differ diff --git a/semestr-2/algebra/lista11/79.png b/semestr-2/algebra/lista11/79.png new file mode 100644 index 0000000..21908b8 Binary files /dev/null and b/semestr-2/algebra/lista11/79.png differ diff --git a/semestr-2/algebra/lista11/80.png b/semestr-2/algebra/lista11/80.png new file mode 100644 index 0000000..b2a153f Binary files /dev/null and b/semestr-2/algebra/lista11/80.png differ diff --git a/semestr-2/algebra/lista11/81.png b/semestr-2/algebra/lista11/81.png new file mode 100644 index 0000000..3d65485 Binary files /dev/null and b/semestr-2/algebra/lista11/81.png differ diff --git a/semestr-2/algebra/lista11/82.png b/semestr-2/algebra/lista11/82.png new file mode 100644 index 0000000..d90b5b9 Binary files /dev/null and b/semestr-2/algebra/lista11/82.png differ diff --git a/semestr-2/algebra/lista11/83.png b/semestr-2/algebra/lista11/83.png new file mode 100644 index 0000000..915574b Binary files /dev/null and b/semestr-2/algebra/lista11/83.png differ diff --git a/semestr-2/algebra/lista11/84.png b/semestr-2/algebra/lista11/84.png new file mode 100644 index 0000000..d2dda41 Binary files /dev/null and b/semestr-2/algebra/lista11/84.png differ diff --git a/semestr-2/algebra/lista11/85.png b/semestr-2/algebra/lista11/85.png new file mode 100644 index 0000000..00216c8 Binary files /dev/null and b/semestr-2/algebra/lista11/85.png differ diff --git a/semestr-2/algebra/lista11/86.png b/semestr-2/algebra/lista11/86.png new file mode 100644 index 0000000..8f649e3 Binary files /dev/null and b/semestr-2/algebra/lista11/86.png differ diff --git a/semestr-2/algebra/lista11/87.png b/semestr-2/algebra/lista11/87.png new file mode 100644 index 0000000..037ebc4 Binary files /dev/null and b/semestr-2/algebra/lista11/87.png differ diff --git a/semestr-2/algebra/lista11/88.png b/semestr-2/algebra/lista11/88.png new file mode 100644 index 0000000..94a43c9 Binary files /dev/null and b/semestr-2/algebra/lista11/88.png differ diff --git a/semestr-2/algebra/lista11/89.png b/semestr-2/algebra/lista11/89.png new file mode 100644 index 0000000..fa58ac9 Binary files /dev/null and b/semestr-2/algebra/lista11/89.png differ diff --git a/semestr-2/algebra/lista11/90.png b/semestr-2/algebra/lista11/90.png new file mode 100644 index 0000000..de92a0a Binary files /dev/null and b/semestr-2/algebra/lista11/90.png differ diff --git a/semestr-2/algebra/lista11/91.png b/semestr-2/algebra/lista11/91.png new file mode 100644 index 0000000..47aff85 Binary files /dev/null and b/semestr-2/algebra/lista11/91.png differ diff --git a/semestr-2/algebra/lista11/92.png b/semestr-2/algebra/lista11/92.png new file mode 100644 index 0000000..42d9caf Binary files /dev/null and b/semestr-2/algebra/lista11/92.png differ diff --git a/semestr-2/algebra/lista11/zad1312.jpg b/semestr-2/algebra/lista11/zad1312.jpg new file mode 100644 index 0000000..63674a3 Binary files /dev/null and b/semestr-2/algebra/lista11/zad1312.jpg differ diff --git a/semestr-2/algebra/lista11/zad2.jpg b/semestr-2/algebra/lista11/zad2.jpg new file mode 100644 index 0000000..9793c78 Binary files /dev/null and b/semestr-2/algebra/lista11/zad2.jpg differ diff --git a/semestr-2/algebra/lista11/zad2c.jpg b/semestr-2/algebra/lista11/zad2c.jpg new file mode 100644 index 0000000..de85e61 Binary files /dev/null and b/semestr-2/algebra/lista11/zad2c.jpg differ diff --git a/semestr-2/algebra/lista11/zad6.jpg b/semestr-2/algebra/lista11/zad6.jpg new file mode 100644 index 0000000..582bddc Binary files /dev/null and b/semestr-2/algebra/lista11/zad6.jpg differ diff --git a/semestr-2/algebra/lista11/zad7a.jpg b/semestr-2/algebra/lista11/zad7a.jpg new file mode 100644 index 0000000..944b735 Binary files /dev/null and b/semestr-2/algebra/lista11/zad7a.jpg differ diff --git a/semestr-2/algebra/lista11/zad7b.jpg b/semestr-2/algebra/lista11/zad7b.jpg new file mode 100644 index 0000000..1e62ad2 Binary files /dev/null and b/semestr-2/algebra/lista11/zad7b.jpg differ diff --git a/semestr-2/algebra/lista11/zad9.jpg b/semestr-2/algebra/lista11/zad9.jpg new file mode 100644 index 0000000..cb0646e Binary files /dev/null and b/semestr-2/algebra/lista11/zad9.jpg differ diff --git a/semestr-2/algebra/lista12/100.png b/semestr-2/algebra/lista12/100.png new file mode 100644 index 0000000..32b2012 Binary files /dev/null and b/semestr-2/algebra/lista12/100.png differ diff --git a/semestr-2/algebra/lista12/101.png b/semestr-2/algebra/lista12/101.png new file mode 100644 index 0000000..4eee8ba Binary files /dev/null and b/semestr-2/algebra/lista12/101.png differ diff --git a/semestr-2/algebra/lista12/102.png b/semestr-2/algebra/lista12/102.png new file mode 100644 index 0000000..6c2c8b4 Binary files /dev/null and b/semestr-2/algebra/lista12/102.png differ diff --git a/semestr-2/algebra/lista12/103.png b/semestr-2/algebra/lista12/103.png new file mode 100644 index 0000000..d417206 Binary files /dev/null and b/semestr-2/algebra/lista12/103.png differ diff --git a/semestr-2/algebra/lista12/104.png b/semestr-2/algebra/lista12/104.png new file mode 100644 index 0000000..3a1522d Binary files /dev/null and b/semestr-2/algebra/lista12/104.png differ diff --git a/semestr-2/algebra/lista12/105.png b/semestr-2/algebra/lista12/105.png new file mode 100644 index 0000000..583e7d6 Binary files /dev/null and b/semestr-2/algebra/lista12/105.png differ diff --git a/semestr-2/algebra/lista12/107.png b/semestr-2/algebra/lista12/107.png new file mode 100644 index 0000000..9f715e4 Binary files /dev/null and b/semestr-2/algebra/lista12/107.png differ diff --git a/semestr-2/algebra/lista12/16.jpg b/semestr-2/algebra/lista12/16.jpg new file mode 100644 index 0000000..3e7c20c Binary files /dev/null and b/semestr-2/algebra/lista12/16.jpg differ diff --git a/semestr-2/algebra/lista12/21.jpg b/semestr-2/algebra/lista12/21.jpg new file mode 100644 index 0000000..263e8d4 Binary files /dev/null and b/semestr-2/algebra/lista12/21.jpg differ diff --git a/semestr-2/algebra/lista12/7a.jpg b/semestr-2/algebra/lista12/7a.jpg new file mode 100644 index 0000000..e84ef5e Binary files /dev/null and b/semestr-2/algebra/lista12/7a.jpg differ diff --git a/semestr-2/algebra/lista12/7b.jpg b/semestr-2/algebra/lista12/7b.jpg new file mode 100644 index 0000000..061543b Binary files /dev/null and b/semestr-2/algebra/lista12/7b.jpg differ diff --git a/semestr-2/algebra/lista12/8.jpg b/semestr-2/algebra/lista12/8.jpg new file mode 100644 index 0000000..94f8206 Binary files /dev/null and b/semestr-2/algebra/lista12/8.jpg differ diff --git a/semestr-2/algebra/lista12/9.jpg b/semestr-2/algebra/lista12/9.jpg new file mode 100644 index 0000000..a26d268 Binary files /dev/null and b/semestr-2/algebra/lista12/9.jpg differ diff --git a/semestr-2/algebra/lista12/95.png b/semestr-2/algebra/lista12/95.png new file mode 100644 index 0000000..07493f5 Binary files /dev/null and b/semestr-2/algebra/lista12/95.png differ diff --git a/semestr-2/algebra/lista12/96.png b/semestr-2/algebra/lista12/96.png new file mode 100644 index 0000000..bb1c592 Binary files /dev/null and b/semestr-2/algebra/lista12/96.png differ diff --git a/semestr-2/algebra/lista12/97.png b/semestr-2/algebra/lista12/97.png new file mode 100644 index 0000000..2bf4bee Binary files /dev/null and b/semestr-2/algebra/lista12/97.png differ diff --git a/semestr-2/algebra/lista12/98.png b/semestr-2/algebra/lista12/98.png new file mode 100644 index 0000000..413f7a6 Binary files /dev/null and b/semestr-2/algebra/lista12/98.png differ diff --git a/semestr-2/algebra/lista12/99.png b/semestr-2/algebra/lista12/99.png new file mode 100644 index 0000000..32f8997 Binary files /dev/null and b/semestr-2/algebra/lista12/99.png differ diff --git a/semestr-2/algebra/lista12/unknown.png b/semestr-2/algebra/lista12/unknown.png new file mode 100644 index 0000000..5556264 Binary files /dev/null and b/semestr-2/algebra/lista12/unknown.png differ diff --git a/semestr-2/algebra/lista12/zad5.jpg b/semestr-2/algebra/lista12/zad5.jpg new file mode 100644 index 0000000..fabc22b Binary files /dev/null and b/semestr-2/algebra/lista12/zad5.jpg differ diff --git a/semestr-2/algebra/lista13/110.png b/semestr-2/algebra/lista13/110.png new file mode 100644 index 0000000..2ac2e37 Binary files /dev/null and b/semestr-2/algebra/lista13/110.png differ diff --git a/semestr-2/algebra/lista13/111.png b/semestr-2/algebra/lista13/111.png new file mode 100644 index 0000000..6c4fc2d Binary files /dev/null and b/semestr-2/algebra/lista13/111.png differ diff --git a/semestr-2/algebra/lista13/112.png b/semestr-2/algebra/lista13/112.png new file mode 100644 index 0000000..432aec0 Binary files /dev/null and b/semestr-2/algebra/lista13/112.png differ diff --git a/semestr-2/algebra/lista13/113.png b/semestr-2/algebra/lista13/113.png new file mode 100644 index 0000000..dad0858 Binary files /dev/null and b/semestr-2/algebra/lista13/113.png differ diff --git a/semestr-2/algebra/lista13/114.png b/semestr-2/algebra/lista13/114.png new file mode 100644 index 0000000..ba0a7cb Binary files /dev/null and b/semestr-2/algebra/lista13/114.png differ diff --git a/semestr-2/algebra/lista13/115.png b/semestr-2/algebra/lista13/115.png new file mode 100644 index 0000000..07d838f Binary files /dev/null and b/semestr-2/algebra/lista13/115.png differ diff --git a/semestr-2/algebra/lista13/116.png b/semestr-2/algebra/lista13/116.png new file mode 100644 index 0000000..5e19116 Binary files /dev/null and b/semestr-2/algebra/lista13/116.png differ diff --git a/semestr-2/algebra/lista13/117.png b/semestr-2/algebra/lista13/117.png new file mode 100644 index 0000000..faa3b2c Binary files /dev/null and b/semestr-2/algebra/lista13/117.png differ diff --git a/semestr-2/algebra/lista13/118.png b/semestr-2/algebra/lista13/118.png new file mode 100644 index 0000000..572840d Binary files /dev/null and b/semestr-2/algebra/lista13/118.png differ diff --git a/semestr-2/algebra/lista13/zad11.jpg b/semestr-2/algebra/lista13/zad11.jpg new file mode 100644 index 0000000..890377d Binary files /dev/null and b/semestr-2/algebra/lista13/zad11.jpg differ diff --git a/semestr-2/algebra/lista13/zad7.jpg b/semestr-2/algebra/lista13/zad7.jpg new file mode 100644 index 0000000..5ec8064 Binary files /dev/null and b/semestr-2/algebra/lista13/zad7.jpg differ diff --git a/semestr-2/algebra/lista13/zad8a.jpg b/semestr-2/algebra/lista13/zad8a.jpg new file mode 100644 index 0000000..c631e11 Binary files /dev/null and b/semestr-2/algebra/lista13/zad8a.jpg differ diff --git a/semestr-2/algebra/lista13/zad8b.jpg b/semestr-2/algebra/lista13/zad8b.jpg new file mode 100644 index 0000000..d35585b Binary files /dev/null and b/semestr-2/algebra/lista13/zad8b.jpg differ diff --git a/semestr-2/algebra/lista14/11.jpg b/semestr-2/algebra/lista14/11.jpg new file mode 100644 index 0000000..9197141 Binary files /dev/null and b/semestr-2/algebra/lista14/11.jpg differ diff --git a/semestr-2/algebra/lista14/1a.jpg b/semestr-2/algebra/lista14/1a.jpg new file mode 100644 index 0000000..3f25d1c Binary files /dev/null and b/semestr-2/algebra/lista14/1a.jpg differ diff --git a/semestr-2/algebra/lista14/1aa.jpg b/semestr-2/algebra/lista14/1aa.jpg new file mode 100644 index 0000000..dd22bde Binary files /dev/null and b/semestr-2/algebra/lista14/1aa.jpg differ diff --git a/semestr-2/algebra/lista14/1c.jpg b/semestr-2/algebra/lista14/1c.jpg new file mode 100644 index 0000000..9181ea2 Binary files /dev/null and b/semestr-2/algebra/lista14/1c.jpg differ diff --git a/semestr-2/algebra/lista14/1cc.jpg b/semestr-2/algebra/lista14/1cc.jpg new file mode 100644 index 0000000..c258f16 Binary files /dev/null and b/semestr-2/algebra/lista14/1cc.jpg differ diff --git a/semestr-2/algebra/lista14/7.jpg b/semestr-2/algebra/lista14/7.jpg new file mode 100644 index 0000000..cee2b83 Binary files /dev/null and b/semestr-2/algebra/lista14/7.jpg differ diff --git a/semestr-2/algebra/lista14/8.jpg b/semestr-2/algebra/lista14/8.jpg new file mode 100644 index 0000000..877a488 Binary files /dev/null and b/semestr-2/algebra/lista14/8.jpg differ diff --git a/semestr-2/algebra/lista14/9a.jpg b/semestr-2/algebra/lista14/9a.jpg new file mode 100644 index 0000000..51fc8fc Binary files /dev/null and b/semestr-2/algebra/lista14/9a.jpg differ diff --git a/semestr-2/algebra/lista14/9b.jpg b/semestr-2/algebra/lista14/9b.jpg new file mode 100644 index 0000000..14345c8 Binary files /dev/null and b/semestr-2/algebra/lista14/9b.jpg differ diff --git a/semestr-2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdf b/semestr-2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdf new file mode 100644 index 0000000..bac9a67 Binary files /dev/null and b/semestr-2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdf differ diff --git a/semestr-2/algebra/lista14/zad18.jpg b/semestr-2/algebra/lista14/zad18.jpg new file mode 100644 index 0000000..d7cb461 Binary files /dev/null and b/semestr-2/algebra/lista14/zad18.jpg differ diff --git a/semestr-2/algebra/lista9/32.jpg b/semestr-2/algebra/lista9/32.jpg new file mode 100644 index 0000000..66d37a7 Binary files /dev/null and b/semestr-2/algebra/lista9/32.jpg differ diff --git a/semestr-2/algebra/lista9/34.jpg b/semestr-2/algebra/lista9/34.jpg new file mode 100644 index 0000000..14d8458 Binary files /dev/null and b/semestr-2/algebra/lista9/34.jpg differ diff --git a/semestr-2/algebra/lista9/36.jpg b/semestr-2/algebra/lista9/36.jpg new file mode 100644 index 0000000..44cb097 Binary files /dev/null and b/semestr-2/algebra/lista9/36.jpg differ diff --git a/semestr-2/algebra/lista9/38.jpg b/semestr-2/algebra/lista9/38.jpg new file mode 100644 index 0000000..2ad8395 Binary files /dev/null and b/semestr-2/algebra/lista9/38.jpg differ diff --git a/semestr-2/algebra/lista9/40.jpg b/semestr-2/algebra/lista9/40.jpg new file mode 100644 index 0000000..dbb145c Binary files /dev/null and b/semestr-2/algebra/lista9/40.jpg differ diff --git a/semestr-2/algebra/lista9/42.jpg b/semestr-2/algebra/lista9/42.jpg new file mode 100644 index 0000000..36bcae9 Binary files /dev/null and b/semestr-2/algebra/lista9/42.jpg differ diff --git a/semestr-2/algebra/lista9/44.jpg b/semestr-2/algebra/lista9/44.jpg new file mode 100644 index 0000000..fcf96e2 Binary files /dev/null and b/semestr-2/algebra/lista9/44.jpg differ diff --git a/semestr-2/algebra/lista9/46.jpg b/semestr-2/algebra/lista9/46.jpg new file mode 100644 index 0000000..f04c4ed Binary files /dev/null and b/semestr-2/algebra/lista9/46.jpg differ diff --git a/semestr-2/algebra/lista9/48.jpg b/semestr-2/algebra/lista9/48.jpg new file mode 100644 index 0000000..988cf50 Binary files /dev/null and b/semestr-2/algebra/lista9/48.jpg differ diff --git a/semestr-2/algebra/lista9/50.jpg b/semestr-2/algebra/lista9/50.jpg new file mode 100644 index 0000000..d4afb6d Binary files /dev/null and b/semestr-2/algebra/lista9/50.jpg differ diff --git a/semestr-2/algebra/lista9/zad10.jpg b/semestr-2/algebra/lista9/zad10.jpg new file mode 100644 index 0000000..6c7137a Binary files /dev/null and b/semestr-2/algebra/lista9/zad10.jpg differ diff --git a/semestr-2/algebra/lista9/zad10bpoprawka.jpg b/semestr-2/algebra/lista9/zad10bpoprawka.jpg new file mode 100644 index 0000000..73f79c2 Binary files /dev/null and b/semestr-2/algebra/lista9/zad10bpoprawka.jpg differ diff --git a/semestr-2/algebra/lista9/zad11.jpg b/semestr-2/algebra/lista9/zad11.jpg new file mode 100644 index 0000000..2fb3cb1 Binary files /dev/null and b/semestr-2/algebra/lista9/zad11.jpg differ diff --git a/semestr-2/algebra/lista9/zad12.jpg b/semestr-2/algebra/lista9/zad12.jpg new file mode 100644 index 0000000..152c3a4 Binary files /dev/null and b/semestr-2/algebra/lista9/zad12.jpg differ diff --git a/semestr-2/algebra/lista9/zad13.jpg b/semestr-2/algebra/lista9/zad13.jpg new file mode 100644 index 0000000..6404ef0 Binary files /dev/null and b/semestr-2/algebra/lista9/zad13.jpg differ diff --git a/semestr-2/algebra/lista9/zad6.jpg b/semestr-2/algebra/lista9/zad6.jpg new file mode 100644 index 0000000..e392b4b Binary files /dev/null and b/semestr-2/algebra/lista9/zad6.jpg differ diff --git a/semestr-2/algebra/lista9/zad8a.jpg b/semestr-2/algebra/lista9/zad8a.jpg new file mode 100644 index 0000000..37a64a5 Binary files /dev/null and b/semestr-2/algebra/lista9/zad8a.jpg differ diff --git a/semestr-2/algebra/lista9/zad8b.jpg b/semestr-2/algebra/lista9/zad8b.jpg new file mode 100644 index 0000000..1864fe6 Binary files /dev/null and b/semestr-2/algebra/lista9/zad8b.jpg differ diff --git a/semestr-2/algebra/lista9/zad9.jpg b/semestr-2/algebra/lista9/zad9.jpg new file mode 100644 index 0000000..bababf7 Binary files /dev/null and b/semestr-2/algebra/lista9/zad9.jpg differ diff --git a/semestr-2/algebra/z1a-skonwertowany.pdf b/semestr-2/algebra/z1a-skonwertowany.pdf new file mode 100644 index 0000000..a4d4941 Binary files /dev/null and b/semestr-2/algebra/z1a-skonwertowany.pdf differ diff --git a/semestr-2/algebra/zad101213.jpg b/semestr-2/algebra/zad101213.jpg new file mode 100644 index 0000000..e3bf7e2 Binary files /dev/null and b/semestr-2/algebra/zad101213.jpg differ diff --git a/semestr-2/algebra/zad14.jpg b/semestr-2/algebra/zad14.jpg new file mode 100644 index 0000000..95a8c95 Binary files /dev/null and b/semestr-2/algebra/zad14.jpg differ diff --git a/semestr-2/algebra/zad2;3;6;7;11;21.pdf b/semestr-2/algebra/zad2;3;6;7;11;21.pdf new file mode 100644 index 0000000..6eb52f7 Binary files /dev/null and b/semestr-2/algebra/zad2;3;6;7;11;21.pdf differ diff --git a/semestr-2/algebra/zad2;6;7;9.pdf b/semestr-2/algebra/zad2;6;7;9.pdf new file mode 100644 index 0000000..1a64f57 Binary files /dev/null and b/semestr-2/algebra/zad2;6;7;9.pdf differ diff --git a/semestr-2/algebra/zad5;7;8;9;16.pdf b/semestr-2/algebra/zad5;7;8;9;16.pdf new file mode 100644 index 0000000..c20a41e Binary files /dev/null and b/semestr-2/algebra/zad5;7;8;9;16.pdf differ diff --git a/semestr-2/algebra/zad7;8;11;15.pdf b/semestr-2/algebra/zad7;8;11;15.pdf new file mode 100644 index 0000000..2b1e160 Binary files /dev/null and b/semestr-2/algebra/zad7;8;11;15.pdf differ diff --git a/semestr-2/analiza/Analiza_last_gwiazdka.pdf b/semestr-2/analiza/Analiza_last_gwiazdka.pdf new file mode 100644 index 0000000..72d3041 Binary files /dev/null and b/semestr-2/analiza/Analiza_last_gwiazdka.pdf differ diff --git "a/semestr-2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTK\303\223W 18.pdf" "b/semestr-2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTK\303\223W 18.pdf" new file mode 100644 index 0000000..99b3e17 Binary files /dev/null and "b/semestr-2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTK\303\223W 18.pdf" differ diff --git a/semestr-2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf b/semestr-2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf new file mode 100644 index 0000000..b3814dc Binary files /dev/null and b/semestr-2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf differ diff --git "a/semestr-2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punkt\303\263w 34.pdf" "b/semestr-2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punkt\303\263w 34.pdf" new file mode 100644 index 0000000..7c37d85 Binary files /dev/null and "b/semestr-2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punkt\303\263w 34.pdf" differ diff --git a/semestr-2/analiza/Lista7;21pkt.pdf b/semestr-2/analiza/Lista7;21pkt.pdf new file mode 100644 index 0000000..e7328d9 Binary files /dev/null and b/semestr-2/analiza/Lista7;21pkt.pdf differ diff --git "a/semestr-2/analiza/Lista9;zad3;5;6;8;12;PUNKT\303\223W 25.pdf" "b/semestr-2/analiza/Lista9;zad3;5;6;8;12;PUNKT\303\223W 25.pdf" new file mode 100644 index 0000000..82894fd Binary files /dev/null and "b/semestr-2/analiza/Lista9;zad3;5;6;8;12;PUNKT\303\223W 25.pdf" differ diff --git a/semestr-2/analiza/lista11/LISTA3;zad11.jpg b/semestr-2/analiza/lista11/LISTA3;zad11.jpg new file mode 100644 index 0000000..19c129d Binary files /dev/null and b/semestr-2/analiza/lista11/LISTA3;zad11.jpg differ diff --git a/semestr-2/analiza/lista11/l11z8l12z1.jpg b/semestr-2/analiza/lista11/l11z8l12z1.jpg new file mode 100644 index 0000000..2766310 Binary files /dev/null and b/semestr-2/analiza/lista11/l11z8l12z1.jpg differ diff --git a/semestr-2/analiza/lista11/l11z9.jpg b/semestr-2/analiza/lista11/l11z9.jpg new file mode 100644 index 0000000..b38f822 Binary files /dev/null and b/semestr-2/analiza/lista11/l11z9.jpg differ diff --git a/semestr-2/analiza/lista11/l12z2.jpg b/semestr-2/analiza/lista11/l12z2.jpg new file mode 100644 index 0000000..835dd21 Binary files /dev/null and b/semestr-2/analiza/lista11/l12z2.jpg differ diff --git a/semestr-2/analiza/lista11/l12z3.jpg b/semestr-2/analiza/lista11/l12z3.jpg new file mode 100644 index 0000000..38e4ac8 Binary files /dev/null and b/semestr-2/analiza/lista11/l12z3.jpg differ diff --git a/semestr-2/analiza/lista11/l12z7.jpg b/semestr-2/analiza/lista11/l12z7.jpg new file mode 100644 index 0000000..396f123 Binary files /dev/null and b/semestr-2/analiza/lista11/l12z7.jpg differ diff --git a/semestr-2/analiza/lista11/szwarc26.06.jpg b/semestr-2/analiza/lista11/szwarc26.06.jpg new file mode 100644 index 0000000..6d6cb60 Binary files /dev/null and b/semestr-2/analiza/lista11/szwarc26.06.jpg differ diff --git a/semestr-2/analiza/lista11/zad11b.jpg b/semestr-2/analiza/lista11/zad11b.jpg new file mode 100644 index 0000000..68ad10b Binary files /dev/null and b/semestr-2/analiza/lista11/zad11b.jpg differ diff --git a/semestr-2/analiza/lista11/zad1a-e.jpg b/semestr-2/analiza/lista11/zad1a-e.jpg new file mode 100644 index 0000000..e1eb2f5 Binary files /dev/null and b/semestr-2/analiza/lista11/zad1a-e.jpg differ diff --git a/semestr-2/analiza/lista11/zad1f2.jpg b/semestr-2/analiza/lista11/zad1f2.jpg new file mode 100644 index 0000000..30395f2 Binary files /dev/null and b/semestr-2/analiza/lista11/zad1f2.jpg differ diff --git a/semestr-2/analiza/lista11/zad2.jpg b/semestr-2/analiza/lista11/zad2.jpg new file mode 100644 index 0000000..60183a4 Binary files /dev/null and b/semestr-2/analiza/lista11/zad2.jpg differ diff --git a/semestr-2/analiza/lista11/zad3.jpg b/semestr-2/analiza/lista11/zad3.jpg new file mode 100644 index 0000000..9be3db6 Binary files /dev/null and b/semestr-2/analiza/lista11/zad3.jpg differ diff --git a/semestr-2/analiza/lista11/zad4.jpg b/semestr-2/analiza/lista11/zad4.jpg new file mode 100644 index 0000000..2535e05 Binary files /dev/null and b/semestr-2/analiza/lista11/zad4.jpg differ diff --git a/semestr-2/analiza/lista11/zad465.jpg b/semestr-2/analiza/lista11/zad465.jpg new file mode 100644 index 0000000..fcfdda3 Binary files /dev/null and b/semestr-2/analiza/lista11/zad465.jpg differ diff --git a/semestr-2/analiza/lista11/zad7a.jpg b/semestr-2/analiza/lista11/zad7a.jpg new file mode 100644 index 0000000..5c045d9 Binary files /dev/null and b/semestr-2/analiza/lista11/zad7a.jpg differ diff --git a/semestr-2/analiza/lista11/zad7b.jpg b/semestr-2/analiza/lista11/zad7b.jpg new file mode 100644 index 0000000..5308651 Binary files /dev/null and b/semestr-2/analiza/lista11/zad7b.jpg differ diff --git a/semestr-2/analiza/zad12.jpg b/semestr-2/analiza/zad12.jpg new file mode 100644 index 0000000..4da6d95 Binary files /dev/null and b/semestr-2/analiza/zad12.jpg differ diff --git a/semestr-2/analiza/zad3;5.jpg b/semestr-2/analiza/zad3;5.jpg new file mode 100644 index 0000000..bacf11a Binary files /dev/null and b/semestr-2/analiza/zad3;5.jpg differ diff --git a/semestr-2/analiza/zad6;8a.jpg b/semestr-2/analiza/zad6;8a.jpg new file mode 100644 index 0000000..eec9653 Binary files /dev/null and b/semestr-2/analiza/zad6;8a.jpg differ diff --git a/semestr-2/analiza/zad8b1.jpg b/semestr-2/analiza/zad8b1.jpg new file mode 100644 index 0000000..e16c886 Binary files /dev/null and b/semestr-2/analiza/zad8b1.jpg differ diff --git a/semestr-2/analiza/zad8b2.jpg b/semestr-2/analiza/zad8b2.jpg new file mode 100644 index 0000000..224a6e6 Binary files /dev/null and b/semestr-2/analiza/zad8b2.jpg differ diff --git a/semestr-2/analiza/zad8c.jpg b/semestr-2/analiza/zad8c.jpg new file mode 100644 index 0000000..91b1be1 Binary files /dev/null and b/semestr-2/analiza/zad8c.jpg differ diff --git a/semestr-2/racket/cnf.rkt b/semestr-2/racket/cnf.rkt new file mode 100644 index 0000000..67bd70f --- /dev/null +++ b/semestr-2/racket/cnf.rkt @@ -0,0 +1,188 @@ +#lang racket + +(define (var? t) (symbol? t)) + +(define (neg? t) + (and (list? t) + (= 2 (length t)) + (eq? 'neg (car t)))) + +(define (conj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'conj (car t)))) + +(define (disj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'disj (car t)))) + +(define (lit? t) + (or (var? t) + (and (neg? t) + (var? (neg-subf t))))) + +(define (prop? f) + (or (var? f) + (and (neg? f) + (prop? (neg-subf f))) + (and (disj? f) + (prop? (disj-left f)) + (prop? (disj-right f))) + (and (conj? f) + (prop? (conj-left f)) + (prop? (conj-right f))))) + +(define (make-conj left right) + (list 'conj left right)) + +(define (make-disj left right) + (list 'disj left right)) + +(define (make-neg f) + (list 'neg f)) + +(define (conj-left f) + (if (conj? f) + (cadr f) + (error "Złe dane ze znacznikiem -- CONJ-LEFT" f))) + +(define (conj-right f) + (if (conj? f) + (caddr f) + (error "Złe dane ze znacznikiem -- CONJ-RIGHT" f))) + +(define (disj-left f) + (if (disj? f) + (cadr f) + (error "Złe dane ze znacznikiem -- DISJ-LEFT" f))) + +(define (disj-right f) + (if (disj? f) + (caddr f) + (error "Złe dane ze znacznikiem -- DISJ-RIGHT" f))) + +(define (neg-subf f) + (if (neg? f) + (cadr f) + (error "Złe dane ze znacznikiem -- NEG-FORM" f))) + +(define (lit-var f) + (cond [(var? f) f] + [(neg? f) (neg-subf f)] + [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)])) + +(define (free-vars f) + (cond [(null? f) null] + [(var? f) (list f)] + [(neg? f) (free-vars (neg-subf f))] + [(conj? f) (append (free-vars (conj-left f)) + (free-vars (conj-right f)))] + [(disj? f) (append (free-vars (disj-left f)) + (free-vars (disj-right f)))] + [else (error "Zła formula -- FREE-VARS" f)])) + +(define (gen-vals xs) + (if (null? xs) + (list null) + (let* + ((vss (gen-vals (cdr xs))) + (x (car xs)) + (vst (map (λ (vs) (cons (list x true) vs)) vss)) + (vsf (map (λ (vs) (cons (list x false) vs)) vss))) + (append vst vsf)))) + +(define (eval-formula f evaluation) + (cond [(var? f) + (let ((val (assoc f evaluation))) + (if (not val) + (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation) + (cadr val)))] + [(neg? f) (not (eval-formula (neg-subf f) evaluation))] + [(disj? f) (or (eval-formula (disj-left f) evaluation) + (eval-formula (disj-right f) evaluation))] + [(conj? f) (and (eval-formula (conj-left f) evaluation) + (eval-formula (conj-right f) evaluation))] + [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)])) + +(define (falsifable-eval? f) + (let* ((evaluations (gen-vals (free-vars f))) + (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations))) + (ormap false? results))) + +(define (nff? f) + (cond [(lit? f) true] + [(neg? f) false] + [(conj? f) (and (nff? (conj-left f)) + (nff? (conj-right f)))] + [(disj? f) (and (nff? (disj-left f)) + (nff? (disj-right f)))] + [else (error "Zła formuła -- NFF?" f)])) + +(define (convert-to-nnf f) + (cond [(lit? f) f] + [(neg? f) (convert-negation (neg-subf f))] + [(conj? f) (make-conj (convert-to-nnf (conj-left f)) + (convert-to-nnf (conj-right f)))] + [(disj? f) (make-disj (convert-to-nnf (disj-left f)) + (convert-to-nnf (disj-right f)))] + [else (error "Zła formuła -- CONVERT" f)])) + +(define (convert-negation f) + (cond [(lit? f) + (if (var? f) + (make-neg f) + (neg-subf f))] + [(neg? f) (convert-to-nnf (neg-subf f))] + [(conj? f) (make-disj (convert-negation (conj-left f)) + (convert-negation (conj-right f)))] + [(disj? f) (make-conj (convert-negation (disj-left f)) + (convert-negation (disj-right f)))] + [else (error "Zła formuła -- CONVERT-NEGATION" f)])) + +(define (clause? x) + (and (list? x) + (andmap lit? x))) + +(define (clause-empty? x) + (and (clause? x) + (null? x))) + +(define (cnf? x) + (and (list? x) + (andmap clause? x))) + +(define (flatmap proc seq) + (foldl append null (map proc seq))) + +(define (convert-to-cnf f) + (define (convert f) + (cond [(lit? f) (list (list f))] + [(conj? f) (append (convert-to-cnf (conj-left f)) + (convert-to-cnf (conj-right f)))] + [(disj? f) + (let ((clause-left (convert-to-cnf (disj-left f))) + (clause-right (convert-to-cnf (disj-right f)))) + (flatmap (λ (clause) + (map (λ (clause2) + (append clause2 clause)) clause-left)) + clause-right))])) + (convert (convert-to-nnf f))) + +(define (falsifable-clause? clause) + (cond [(clause-empty? clause) true] + [(lit? (findf (λ (l) (equal? + l + (convert-to-nnf (make-neg (car clause))))) + clause)) false] + [else (falsifable-clause? (cdr clause))])) + +(define (falsifable-cnf? f) + (define (neg-value lit) + (if (var? lit) + (list lit false) + (list (neg-subf lit) true))) + (ormap (λ (clause) (if (falsifable-clause? clause) + (map neg-value clause) + false)) + (convert-to-cnf f))) \ No newline at end of file diff --git a/semestr-2/racket/cw.rkt b/semestr-2/racket/cw.rkt new file mode 100644 index 0000000..f1e706f --- /dev/null +++ b/semestr-2/racket/cw.rkt @@ -0,0 +1,57 @@ +#lang racket + +(define (accumulate op initial sequence) + (if (null? sequence) + initial + (op (car sequence) + (accumulate op initial (cdr sequence))))) + +(define (horner-eval x coefficient-sequence) + (accumulate (lambda (this-coeff higher-terms) + (+ this-coeff (* x higher-terms))) + 0 + coefficient-sequence)) + + +(define (accumulate-n op init seqs) + (if (null? (car seqs)) + null + (cons (accumulate op init (map car seqs)) + (accumulate-n op init (map cdr seqs))))) + +(define (count-leaves t) + (accumulate + 0 (map (lambda (x) + (if (not (pair? x)) + 1 + (count-leaves x))) t))) + +(define (flatmap proc seq) + (accumulate append null (map proc seq))) + +(define (prime? x) (= (modulo x 2) 1)) + +(define (prime-sum? pair) + (prime? (+ (car pair) (cadr pair)))) + +(define (make-pair-sum pair) + (list (car pair) (cadr pair) (+ (car pair) (cadr pair)))) + +(define (enumerate-interval low high) + (if (> low high) + null + (cons low (enumerate-interval (+ 1 low) high)))) + +(define (unique-pairs n) + (flatmap (lambda (i) + (map (lambda (j) (list j i)) + (enumerate-interval 1 (- i 1)))) + (enumerate-interval 1 n))) + +(define (prime-sum-pairs n) + (map make-pair-sum + (filter prime-sum? (unique-pairs n)))) + +(define (is-eq-s? s triplet) + (= s (accumulate + 0 triplet))) + +(define \ No newline at end of file diff --git a/semestr-2/racket/deriv.rkt b/semestr-2/racket/deriv.rkt new file mode 100644 index 0000000..0eef9d2 --- /dev/null +++ b/semestr-2/racket/deriv.rkt @@ -0,0 +1,47 @@ +#lang racket + +(define (variable? x) (symbol? x)) + +(define (same-variable? v1 v2) + (and (variable? v1) (variable? v2) (eq? v1 v2))) + +(define (=number? exp num) + (and (number? exp) (= exp num))) + +(define (make-sum a1 a2) + (cond ((=number? a1 0) a2) + ((=number? a2 0) a1) + ((and (number? a1) (number? a2) (+ a1 a2))) + (else (list '+ a1 a2)))) +(define (sum? x) + (and (pair? x) (eq? (car x) '+))) +(define (addend s) (cadr s)) +(define (augend s) (caddr s)) + +(define (make-product m1 m2) + (cond ((or (=number? m1 0) (=number? m2 0)) 0) + ((=number? m1 1) m2) + ((=number? m2 1) m1) + ((and (number? m1) (number? m2)) (* m1 m2)) + (else (list '* m1 m2)))) +(define (product? x) + (and (pair? x) (eq? (car x) '*))) +(define (multiplier p) (cadr p)) +(define (multiplicand p) (caddr p)) + +(define (deriv exp var) + (cond ((number? exp) 0) + ((variable? exp) + (if (same-variable? exp var) 1 0)) + ((sum? exp) + (make-sum (deriv (addend exp) var) + (deriv (augend exp) var))) + ((product? exp) + (make-sum + (make-product (multiplier exp) + (deriv (multiplicand exp) var)) + (make-product (deriv (multiplier exp) var) + (multiplicand exp)))) + (else + (error "Nieznany rodzaj wyrazenia -- DERIV" exp)))) + \ No newline at end of file diff --git a/semestr-2/racket/egzamin/rozw2.txt b/semestr-2/racket/egzamin/rozw2.txt new file mode 100644 index 0000000..a70232e --- /dev/null +++ b/semestr-2/racket/egzamin/rozw2.txt @@ -0,0 +1 @@ +Zasada indukcji dla \ No newline at end of file diff --git a/semestr-2/racket/egzamin/zad1.bak b/semestr-2/racket/egzamin/zad1.bak new file mode 100644 index 0000000..6f1f7b4 --- /dev/null +++ b/semestr-2/racket/egzamin/zad1.bak @@ -0,0 +1 @@ +#lang racket diff --git a/semestr-2/racket/egzamin/zad1.rkt b/semestr-2/racket/egzamin/zad1.rkt new file mode 100644 index 0000000..a90d2fd --- /dev/null +++ b/semestr-2/racket/egzamin/zad1.rkt @@ -0,0 +1,300 @@ +#lang racket + +;; ZADANIE 1 +;; ========= + +;; W tym zadaniu rozważamy język WHILE (w formie z grubsza +;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o +;; lokalnym zakresie. + +;; Zadanie polega na dodaniu do języka procedur definiowanych na +;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie +;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o +;; dowolnym wybranym przez siebie modelu działania. W tym celu należy: +;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów +;; · rozszerzyć procedurę parsowania +;; · rozszerzyć ewaluator +;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia +;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić +;; w komentarzu, podobnie jak niniejsze polecenie. + +;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele +;; sensownych rozwiązań które stosowały liczne języki imperatywne w +;; historii — nie jest treścią zadania znalezienie *najlepszego*, +;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur +;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto +;; pokazać że ma się tego świadomość w słownym opisie jego działania. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (name) #:transparent) +(struct call-expr (name args) #:transparent) +(struct return-expr (val) #:transparent) + +(define (operator? x) + (member x '(+ * - / > < = >= <=))) + +(define (keyword? x) + (member x '(skip while if := func call return))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(var-expr x) + (and (symbol? x) + (not (keyword? x)))] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + +(struct skip () #:transparent) +(struct assign (id exp) #:transparent) +(struct if-cmd (exp ct cf) #:transparent) +(struct while (exp cmd) #:transparent) +(struct comp (left right) #:transparent) +(struct var-in (name expr cmd) #:transparent) +(struct function (name args cmd) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))] + [(while e c) (and (expr? e) (cmd? c))] + [(comp c1 c2) (and (cmd? c1) (cmd? c2))] + [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))] + [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))])) + +(define (prog? p) + (cmd? p)) + +(define (parse-expr p) + (cond + [(number? p) (const p)] + [(and (symbol? p) + (not (keyword? p))) + (var-expr p)] + [(and (list? p) + (= 3 (length p)) + (operator? (car p))) + (binop (first p) + (parse-expr (second p)) + (parse-expr (third p)))] + [(and (list? p) ; <------ wywołanie funkcji + (= (length p) 3) + (eq? (first p) 'call) + (symbol? (second p)) + (list? (third p))) + (call-expr (second p) (map parse-expr (third p)))] + [else false])) + +(define (parse-cmd q) + (cond + [(eq? q 'skip) (skip)] + [(and (list? q) + (= (length q) 3) + (eq? (second q) ':=)) + (assign (first q) (parse-expr (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'while)) + (while (parse-expr (second q)) (parse-cmd (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'var) + (list? (second q)) + (= (length (second q)) 2)) + (var-in (first (second q)) + (parse-expr (second (second q))) + (parse-cmd (third q)))] + [(and (list? q) ; <------ funkcje + (= (length q) 4) + (eq? (first q) 'func) + (symbol? (second q)) + (list? (third q)) + (andmap symbol? (third q))) + (function (second q) (third q) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 2) + (eq? (first q) 'return)) + (return-expr (parse-expr (second q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-comp (map parse-cmd q))] + [else false])) + +(define (desugar-comp cs) + (if (null? (cdr cs)) + (car cs) + (comp (car cs) + (desugar-comp (cdr cs))))) + +(define (value? v) + (number? v)) + +(struct mem (xs) #:transparent) + +(define (mem-lookup x m) + (define (assoc-lookup xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cdar xs)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane + (define (assoc-lookup xs) + (cond + [(null? xs) #f] + [(eq? x (caar xs) #t)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-update x v m) + (define (assoc-update xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cons (cons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (mem (assoc-update (mem-xs m)))) + +(define (mem-alloc x v m) + (mem (cons (cons x v) (mem-xs m)))) + +(define (mem-drop-last m) + (cond + [(null? (mem-xs m)) + (error "Deallocating from empty memory")] + [else + (mem (cdr (mem-xs m)))])) + +(define empty-mem + (mem null)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /] + ['< (lambda (x y) (if (< x y) 1 0))] + ['> (lambda (x y) (if (> x y) 1 0))] + ['= (lambda (x y) (if (= x y) 1 0))] + ['<= (lambda (x y) (if (<= x y) 1 0))] + ['>= (lambda (x y) (if (>= x y) 1 0))] + )) + +;; zał: (expr? e) i (mem? m) jest prawdą +;; (value? (eval e m)) jest prawdą +(define (eval e m) + (match e + [(const v) v] + [(var-expr x) (mem-lookup x m)] + [(binop op l r) + (let ((vl (eval l m)) + (vr (eval r m)) + (p (op->proc op))) + (p vl vr))] + [(call-expr name args) + (match (mem-lookup name m) + [(clo func-args cmd) + (if (= (length args) (length func-args)) + (let* ([func-mem (assign-values args func-args m)] + [final-mem (eval-cmd cmd func-mem)] + [ret (mem-lookup 'RETURN final-mem)]) + (if ret + ret + (error "No return statement in function" name))) + (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))] + [else (error "Undefined function" name)])])) + +(define (assign-values args func-args mem) + (if (null? args) + mem + (assign-values (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) mem)))) + + +(struct clo (args cmd)) + +;; zał: (cmd? c) (mem? m) +;; (mem? (eval-cmd c m)) +(define (eval-cmd c m) + (if (mem-lookup 'RETURN m) + m + (match c + [(skip) m] + [(assign x e) (mem-update x (eval e m) m)] + [(if-cmd e ct cf) (if (= (eval e m) 0) + (eval-cmd cf m) + (eval-cmd ct m))] + [(while e cw) (if (= (eval e m) 0) + m + (let* ((m1 (eval-cmd cw m)) + (m2 (eval-cmd c m1))) + m2))] + [(comp c1 c2) (let* ((m1 (eval-cmd c1 m)) + (m2 (eval-cmd c2 m1))) + m2)] + [(var-in x e c) (let* ((v (eval e m)) + (m1 (mem-alloc x v m)) + (m2 (eval-cmd c m1))) + (mem-drop-last m2))] + [(function name args cmd) + (mem-alloc name (clo args cmd) m)] + [(return-expr val) + (mem-update 'RETURN (eval val m) m)] + [_ (error "Unknown command" c "— likely a syntax error")]))) + + +(define (eval-prog p m) + (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m)))) + (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))]) + (match (mem-lookup 'main final-mem) + [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))])))) + +(define WHILE_FACT + '({func decr (x) + {(x := (- x 1)) + (return x)}} + {func main () + {(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (call decr (t)))}) + (return i)}} + )) + +(define TEST + '({func decr (x) (return (- x 1))} + {func main () + (var (x 1) + {(x := (+ x 1)) + (return (call decr (x)))})})) + +(define TEST2 + '({func decr (x) (return (- x 1))} + {func main () (return (call decr (3)))})) + +(define TEST3 + '({func sth (x) + {(i := -1) + (return x)}} + {func main () + {(i := 2) + (return (call sth (i)))}})) + +(define TEST4 + '(func f () + {return 1})) + +(define (fact n) + (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))]) + (eval-prog (parse-cmd WHILE_FACT) init-env))) + diff --git a/semestr-2/racket/egzamin/zad1a.bak b/semestr-2/racket/egzamin/zad1a.bak new file mode 100644 index 0000000..a90d2fd --- /dev/null +++ b/semestr-2/racket/egzamin/zad1a.bak @@ -0,0 +1,300 @@ +#lang racket + +;; ZADANIE 1 +;; ========= + +;; W tym zadaniu rozważamy język WHILE (w formie z grubsza +;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o +;; lokalnym zakresie. + +;; Zadanie polega na dodaniu do języka procedur definiowanych na +;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie +;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o +;; dowolnym wybranym przez siebie modelu działania. W tym celu należy: +;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów +;; · rozszerzyć procedurę parsowania +;; · rozszerzyć ewaluator +;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia +;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić +;; w komentarzu, podobnie jak niniejsze polecenie. + +;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele +;; sensownych rozwiązań które stosowały liczne języki imperatywne w +;; historii — nie jest treścią zadania znalezienie *najlepszego*, +;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur +;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto +;; pokazać że ma się tego świadomość w słownym opisie jego działania. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (name) #:transparent) +(struct call-expr (name args) #:transparent) +(struct return-expr (val) #:transparent) + +(define (operator? x) + (member x '(+ * - / > < = >= <=))) + +(define (keyword? x) + (member x '(skip while if := func call return))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(var-expr x) + (and (symbol? x) + (not (keyword? x)))] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + +(struct skip () #:transparent) +(struct assign (id exp) #:transparent) +(struct if-cmd (exp ct cf) #:transparent) +(struct while (exp cmd) #:transparent) +(struct comp (left right) #:transparent) +(struct var-in (name expr cmd) #:transparent) +(struct function (name args cmd) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))] + [(while e c) (and (expr? e) (cmd? c))] + [(comp c1 c2) (and (cmd? c1) (cmd? c2))] + [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))] + [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))])) + +(define (prog? p) + (cmd? p)) + +(define (parse-expr p) + (cond + [(number? p) (const p)] + [(and (symbol? p) + (not (keyword? p))) + (var-expr p)] + [(and (list? p) + (= 3 (length p)) + (operator? (car p))) + (binop (first p) + (parse-expr (second p)) + (parse-expr (third p)))] + [(and (list? p) ; <------ wywołanie funkcji + (= (length p) 3) + (eq? (first p) 'call) + (symbol? (second p)) + (list? (third p))) + (call-expr (second p) (map parse-expr (third p)))] + [else false])) + +(define (parse-cmd q) + (cond + [(eq? q 'skip) (skip)] + [(and (list? q) + (= (length q) 3) + (eq? (second q) ':=)) + (assign (first q) (parse-expr (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'while)) + (while (parse-expr (second q)) (parse-cmd (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'var) + (list? (second q)) + (= (length (second q)) 2)) + (var-in (first (second q)) + (parse-expr (second (second q))) + (parse-cmd (third q)))] + [(and (list? q) ; <------ funkcje + (= (length q) 4) + (eq? (first q) 'func) + (symbol? (second q)) + (list? (third q)) + (andmap symbol? (third q))) + (function (second q) (third q) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 2) + (eq? (first q) 'return)) + (return-expr (parse-expr (second q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-comp (map parse-cmd q))] + [else false])) + +(define (desugar-comp cs) + (if (null? (cdr cs)) + (car cs) + (comp (car cs) + (desugar-comp (cdr cs))))) + +(define (value? v) + (number? v)) + +(struct mem (xs) #:transparent) + +(define (mem-lookup x m) + (define (assoc-lookup xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cdar xs)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane + (define (assoc-lookup xs) + (cond + [(null? xs) #f] + [(eq? x (caar xs) #t)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-update x v m) + (define (assoc-update xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cons (cons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (mem (assoc-update (mem-xs m)))) + +(define (mem-alloc x v m) + (mem (cons (cons x v) (mem-xs m)))) + +(define (mem-drop-last m) + (cond + [(null? (mem-xs m)) + (error "Deallocating from empty memory")] + [else + (mem (cdr (mem-xs m)))])) + +(define empty-mem + (mem null)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /] + ['< (lambda (x y) (if (< x y) 1 0))] + ['> (lambda (x y) (if (> x y) 1 0))] + ['= (lambda (x y) (if (= x y) 1 0))] + ['<= (lambda (x y) (if (<= x y) 1 0))] + ['>= (lambda (x y) (if (>= x y) 1 0))] + )) + +;; zał: (expr? e) i (mem? m) jest prawdą +;; (value? (eval e m)) jest prawdą +(define (eval e m) + (match e + [(const v) v] + [(var-expr x) (mem-lookup x m)] + [(binop op l r) + (let ((vl (eval l m)) + (vr (eval r m)) + (p (op->proc op))) + (p vl vr))] + [(call-expr name args) + (match (mem-lookup name m) + [(clo func-args cmd) + (if (= (length args) (length func-args)) + (let* ([func-mem (assign-values args func-args m)] + [final-mem (eval-cmd cmd func-mem)] + [ret (mem-lookup 'RETURN final-mem)]) + (if ret + ret + (error "No return statement in function" name))) + (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))] + [else (error "Undefined function" name)])])) + +(define (assign-values args func-args mem) + (if (null? args) + mem + (assign-values (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) mem)))) + + +(struct clo (args cmd)) + +;; zał: (cmd? c) (mem? m) +;; (mem? (eval-cmd c m)) +(define (eval-cmd c m) + (if (mem-lookup 'RETURN m) + m + (match c + [(skip) m] + [(assign x e) (mem-update x (eval e m) m)] + [(if-cmd e ct cf) (if (= (eval e m) 0) + (eval-cmd cf m) + (eval-cmd ct m))] + [(while e cw) (if (= (eval e m) 0) + m + (let* ((m1 (eval-cmd cw m)) + (m2 (eval-cmd c m1))) + m2))] + [(comp c1 c2) (let* ((m1 (eval-cmd c1 m)) + (m2 (eval-cmd c2 m1))) + m2)] + [(var-in x e c) (let* ((v (eval e m)) + (m1 (mem-alloc x v m)) + (m2 (eval-cmd c m1))) + (mem-drop-last m2))] + [(function name args cmd) + (mem-alloc name (clo args cmd) m)] + [(return-expr val) + (mem-update 'RETURN (eval val m) m)] + [_ (error "Unknown command" c "— likely a syntax error")]))) + + +(define (eval-prog p m) + (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m)))) + (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))]) + (match (mem-lookup 'main final-mem) + [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))])))) + +(define WHILE_FACT + '({func decr (x) + {(x := (- x 1)) + (return x)}} + {func main () + {(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (call decr (t)))}) + (return i)}} + )) + +(define TEST + '({func decr (x) (return (- x 1))} + {func main () + (var (x 1) + {(x := (+ x 1)) + (return (call decr (x)))})})) + +(define TEST2 + '({func decr (x) (return (- x 1))} + {func main () (return (call decr (3)))})) + +(define TEST3 + '({func sth (x) + {(i := -1) + (return x)}} + {func main () + {(i := 2) + (return (call sth (i)))}})) + +(define TEST4 + '(func f () + {return 1})) + +(define (fact n) + (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))]) + (eval-prog (parse-cmd WHILE_FACT) init-env))) + diff --git a/semestr-2/racket/egzamin/zad1a.rkt b/semestr-2/racket/egzamin/zad1a.rkt new file mode 100644 index 0000000..a587359 --- /dev/null +++ b/semestr-2/racket/egzamin/zad1a.rkt @@ -0,0 +1,314 @@ +#lang racket + +;; ZADANIE 1 +;; ========= + +;; W tym zadaniu rozważamy język WHILE (w formie z grubsza +;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o +;; lokalnym zakresie. + +;; Zadanie polega na dodaniu do języka procedur definiowanych na +;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie +;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o +;; dowolnym wybranym przez siebie modelu działania. W tym celu należy: +;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów +;; · rozszerzyć procedurę parsowania +;; · rozszerzyć ewaluator +;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia +;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić +;; w komentarzu, podobnie jak niniejsze polecenie. + +;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele +;; sensownych rozwiązań które stosowały liczne języki imperatywne w +;; historii — nie jest treścią zadania znalezienie *najlepszego*, +;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur +;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto +;; pokazać że ma się tego świadomość w słownym opisie jego działania. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (name) #:transparent) +(struct call-expr (name args) #:transparent) +(struct return-expr (val) #:transparent) + +(define (operator? x) + (member x '(+ * - / > < = >= <=))) + +(define (keyword? x) + (member x '(skip while if := func call return))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(var-expr x) + (and (symbol? x) + (not (keyword? x)))] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + +(struct skip () #:transparent) +(struct assign (id exp) #:transparent) +(struct if-cmd (exp ct cf) #:transparent) +(struct while (exp cmd) #:transparent) +(struct comp (left right) #:transparent) +(struct var-in (name expr cmd) #:transparent) +(struct function (name args cmd) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))] + [(while e c) (and (expr? e) (cmd? c))] + [(comp c1 c2) (and (cmd? c1) (cmd? c2))] + [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))] + [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))])) + +(define (prog? p) + (cmd? p)) + +(define (parse-expr p) + (cond + [(number? p) (const p)] + [(and (symbol? p) + (not (keyword? p))) + (var-expr p)] + [(and (list? p) + (= 3 (length p)) + (operator? (car p))) + (binop (first p) + (parse-expr (second p)) + (parse-expr (third p)))] + [(and (list? p) ; <------ wywołanie funkcji + (= (length p) 3) + (eq? (first p) 'call) + (symbol? (second p)) + (list? (third p))) + (call-expr (second p) (map parse-expr (third p)))] + [else false])) + +(define (parse-cmd q) + (cond + [(eq? q 'skip) (skip)] + [(and (list? q) + (= (length q) 3) + (eq? (second q) ':=)) + (assign (first q) (parse-expr (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'while)) + (while (parse-expr (second q)) (parse-cmd (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'var) + (list? (second q)) + (= (length (second q)) 2)) + (var-in (first (second q)) + (parse-expr (second (second q))) + (parse-cmd (third q)))] + [(and (list? q) ; <------ funkcje + (= (length q) 4) + (eq? (first q) 'func) + (symbol? (second q)) + (list? (third q)) + (andmap symbol? (third q))) + (function (second q) (third q) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 2) + (eq? (first q) 'return)) + (return-expr (parse-expr (second q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-comp (map parse-cmd q))] + [else false])) + +(define (desugar-comp cs) + (if (null? (cdr cs)) + (car cs) + (comp (car cs) + (desugar-comp (cdr cs))))) + +(define (value? v) + (number? v)) + +(struct mem (xs) #:transparent) + +(define (mem-lookup x m) + (define (assoc-lookup xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cdar xs)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane + (define (assoc-lookup xs) + (cond + [(null? xs) #f] + [(eq? x (caar xs) #t)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-update x v m) + (define (assoc-update xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cons (cons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (mem (assoc-update (mem-xs m)))) + +(define (mem-alloc x v m) + (mem (cons (cons x v) (mem-xs m)))) + +(define (mem-drop-last m) + (cond + [(null? (mem-xs m)) + (error "Deallocating from empty memory")] + [else + (mem (cdr (mem-xs m)))])) + +(define empty-mem + (mem null)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /] + ['< (lambda (x y) (if (< x y) 1 0))] + ['> (lambda (x y) (if (> x y) 1 0))] + ['= (lambda (x y) (if (= x y) 1 0))] + ['<= (lambda (x y) (if (<= x y) 1 0))] + ['>= (lambda (x y) (if (>= x y) 1 0))] + )) + +;; zał: (expr? e) i (mem? m) jest prawdą +;; (value? (eval e m)) jest prawdą +(define (eval e m) + (match e + [(const v) v] + [(var-expr x) (mem-lookup x m)] + [(binop op l r) + (let ((vl (eval l m)) + (vr (eval r m)) + (p (op->proc op))) + (p vl vr))] + [(call-expr name args) + (match (mem-lookup name m) + [(clo func-args cmd) + (if (= (length args) (length func-args)) + (let* ([func-mem (assign-values args func-args m)] + [final-mem (eval-cmd cmd func-mem)] + [ret (mem-lookup 'RETURN final-mem)]) + (if ret + ret + (error "No return statement in function" name))) + (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))] + [else (error "Undefined function" name)])])) + +(define (assign-values args func-args mem) + (define (iter args func-args new-mem) + (if (null? args) + new-mem + (iter (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) new-mem)))) + (iter args func-args mem)) + + +(struct clo (args cmd)) + +;; zał: (cmd? c) (mem? m) +;; (mem? (eval-cmd c m)) +(define (eval-cmd c m) + (if (mem-lookup 'RETURN m) + m + (match c + [(skip) m] + [(assign x e) (mem-update x (eval e m) m)] + [(if-cmd e ct cf) (if (= (eval e m) 0) + (eval-cmd cf m) + (eval-cmd ct m))] + [(while e cw) (if (= (eval e m) 0) + m + (let* ((m1 (eval-cmd cw m)) + (m2 (eval-cmd c m1))) + m2))] + [(comp c1 c2) (let* ((m1 (eval-cmd c1 m)) + (m2 (eval-cmd c2 m1))) + m2)] + [(var-in x e c) (let* ((v (eval e m)) + (m1 (mem-alloc x v m)) + (m2 (eval-cmd c m1))) + (mem-drop-last m2))] + [(function name args cmd) + (mem-alloc name (clo args cmd) m)] + [(return-expr val) + (mem-update 'RETURN (eval val m) m)] + [_ (error "Unknown command" c "— likely a syntax error")]))) + + +(define (eval-prog p m) + (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m)))) + (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))]) + (match (mem-lookup 'main final-mem) + [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))])))) + +(define WHILE_FACT + '({func decr (x) + {(x := (- x 1)) + (return x)}} + {func main () + {(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (call decr (t)))}) + (return i)}} + )) + +(define (fact n) + (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))]) + (eval-prog (parse-cmd WHILE_FACT) init-env))) + +(define TEST + '({func decr (x) (return (- x 1))} + {func main () + (var (x 1) + {(x := (+ x 1)) + (return (call decr (x)))})})) + +(define TEST2 + '({func decr (x) (return (- x 1))} + {func main () (return (call decr (3)))})) + +(define TEST3 + '({func sth (x) + {(i := -1) + (return x)}} + {func main () + {(i := 2) + (return (call sth (i)))}})) + +(define TEST4 + '(func f () + {return 1})) + +(define TEST5 + '({func f1 (x y z) + (return y)} + {func f2 (x y z) + (return (+ (+ x y) z))} + {func main () + {(if (> 4 3) + (var (x 2) + (return (call f1 (1 x 3)))) + (x := 5)) + (return (call f2 (x 3 4)))}})) + \ No newline at end of file diff --git a/semestr-2/racket/egzamin/zad1b.bak b/semestr-2/racket/egzamin/zad1b.bak new file mode 100644 index 0000000..a587359 --- /dev/null +++ b/semestr-2/racket/egzamin/zad1b.bak @@ -0,0 +1,314 @@ +#lang racket + +;; ZADANIE 1 +;; ========= + +;; W tym zadaniu rozważamy język WHILE (w formie z grubsza +;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o +;; lokalnym zakresie. + +;; Zadanie polega na dodaniu do języka procedur definiowanych na +;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie +;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o +;; dowolnym wybranym przez siebie modelu działania. W tym celu należy: +;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów +;; · rozszerzyć procedurę parsowania +;; · rozszerzyć ewaluator +;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia +;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić +;; w komentarzu, podobnie jak niniejsze polecenie. + +;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele +;; sensownych rozwiązań które stosowały liczne języki imperatywne w +;; historii — nie jest treścią zadania znalezienie *najlepszego*, +;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur +;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto +;; pokazać że ma się tego świadomość w słownym opisie jego działania. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (name) #:transparent) +(struct call-expr (name args) #:transparent) +(struct return-expr (val) #:transparent) + +(define (operator? x) + (member x '(+ * - / > < = >= <=))) + +(define (keyword? x) + (member x '(skip while if := func call return))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(var-expr x) + (and (symbol? x) + (not (keyword? x)))] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + +(struct skip () #:transparent) +(struct assign (id exp) #:transparent) +(struct if-cmd (exp ct cf) #:transparent) +(struct while (exp cmd) #:transparent) +(struct comp (left right) #:transparent) +(struct var-in (name expr cmd) #:transparent) +(struct function (name args cmd) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))] + [(while e c) (and (expr? e) (cmd? c))] + [(comp c1 c2) (and (cmd? c1) (cmd? c2))] + [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))] + [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))])) + +(define (prog? p) + (cmd? p)) + +(define (parse-expr p) + (cond + [(number? p) (const p)] + [(and (symbol? p) + (not (keyword? p))) + (var-expr p)] + [(and (list? p) + (= 3 (length p)) + (operator? (car p))) + (binop (first p) + (parse-expr (second p)) + (parse-expr (third p)))] + [(and (list? p) ; <------ wywołanie funkcji + (= (length p) 3) + (eq? (first p) 'call) + (symbol? (second p)) + (list? (third p))) + (call-expr (second p) (map parse-expr (third p)))] + [else false])) + +(define (parse-cmd q) + (cond + [(eq? q 'skip) (skip)] + [(and (list? q) + (= (length q) 3) + (eq? (second q) ':=)) + (assign (first q) (parse-expr (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'while)) + (while (parse-expr (second q)) (parse-cmd (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'var) + (list? (second q)) + (= (length (second q)) 2)) + (var-in (first (second q)) + (parse-expr (second (second q))) + (parse-cmd (third q)))] + [(and (list? q) ; <------ funkcje + (= (length q) 4) + (eq? (first q) 'func) + (symbol? (second q)) + (list? (third q)) + (andmap symbol? (third q))) + (function (second q) (third q) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 2) + (eq? (first q) 'return)) + (return-expr (parse-expr (second q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-comp (map parse-cmd q))] + [else false])) + +(define (desugar-comp cs) + (if (null? (cdr cs)) + (car cs) + (comp (car cs) + (desugar-comp (cdr cs))))) + +(define (value? v) + (number? v)) + +(struct mem (xs) #:transparent) + +(define (mem-lookup x m) + (define (assoc-lookup xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cdar xs)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane + (define (assoc-lookup xs) + (cond + [(null? xs) #f] + [(eq? x (caar xs) #t)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-update x v m) + (define (assoc-update xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cons (cons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (mem (assoc-update (mem-xs m)))) + +(define (mem-alloc x v m) + (mem (cons (cons x v) (mem-xs m)))) + +(define (mem-drop-last m) + (cond + [(null? (mem-xs m)) + (error "Deallocating from empty memory")] + [else + (mem (cdr (mem-xs m)))])) + +(define empty-mem + (mem null)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /] + ['< (lambda (x y) (if (< x y) 1 0))] + ['> (lambda (x y) (if (> x y) 1 0))] + ['= (lambda (x y) (if (= x y) 1 0))] + ['<= (lambda (x y) (if (<= x y) 1 0))] + ['>= (lambda (x y) (if (>= x y) 1 0))] + )) + +;; zał: (expr? e) i (mem? m) jest prawdą +;; (value? (eval e m)) jest prawdą +(define (eval e m) + (match e + [(const v) v] + [(var-expr x) (mem-lookup x m)] + [(binop op l r) + (let ((vl (eval l m)) + (vr (eval r m)) + (p (op->proc op))) + (p vl vr))] + [(call-expr name args) + (match (mem-lookup name m) + [(clo func-args cmd) + (if (= (length args) (length func-args)) + (let* ([func-mem (assign-values args func-args m)] + [final-mem (eval-cmd cmd func-mem)] + [ret (mem-lookup 'RETURN final-mem)]) + (if ret + ret + (error "No return statement in function" name))) + (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))] + [else (error "Undefined function" name)])])) + +(define (assign-values args func-args mem) + (define (iter args func-args new-mem) + (if (null? args) + new-mem + (iter (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) new-mem)))) + (iter args func-args mem)) + + +(struct clo (args cmd)) + +;; zał: (cmd? c) (mem? m) +;; (mem? (eval-cmd c m)) +(define (eval-cmd c m) + (if (mem-lookup 'RETURN m) + m + (match c + [(skip) m] + [(assign x e) (mem-update x (eval e m) m)] + [(if-cmd e ct cf) (if (= (eval e m) 0) + (eval-cmd cf m) + (eval-cmd ct m))] + [(while e cw) (if (= (eval e m) 0) + m + (let* ((m1 (eval-cmd cw m)) + (m2 (eval-cmd c m1))) + m2))] + [(comp c1 c2) (let* ((m1 (eval-cmd c1 m)) + (m2 (eval-cmd c2 m1))) + m2)] + [(var-in x e c) (let* ((v (eval e m)) + (m1 (mem-alloc x v m)) + (m2 (eval-cmd c m1))) + (mem-drop-last m2))] + [(function name args cmd) + (mem-alloc name (clo args cmd) m)] + [(return-expr val) + (mem-update 'RETURN (eval val m) m)] + [_ (error "Unknown command" c "— likely a syntax error")]))) + + +(define (eval-prog p m) + (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m)))) + (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))]) + (match (mem-lookup 'main final-mem) + [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))])))) + +(define WHILE_FACT + '({func decr (x) + {(x := (- x 1)) + (return x)}} + {func main () + {(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (call decr (t)))}) + (return i)}} + )) + +(define (fact n) + (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))]) + (eval-prog (parse-cmd WHILE_FACT) init-env))) + +(define TEST + '({func decr (x) (return (- x 1))} + {func main () + (var (x 1) + {(x := (+ x 1)) + (return (call decr (x)))})})) + +(define TEST2 + '({func decr (x) (return (- x 1))} + {func main () (return (call decr (3)))})) + +(define TEST3 + '({func sth (x) + {(i := -1) + (return x)}} + {func main () + {(i := 2) + (return (call sth (i)))}})) + +(define TEST4 + '(func f () + {return 1})) + +(define TEST5 + '({func f1 (x y z) + (return y)} + {func f2 (x y z) + (return (+ (+ x y) z))} + {func main () + {(if (> 4 3) + (var (x 2) + (return (call f1 (1 x 3)))) + (x := 5)) + (return (call f2 (x 3 4)))}})) + \ No newline at end of file diff --git a/semestr-2/racket/egzamin/zad1b.rkt b/semestr-2/racket/egzamin/zad1b.rkt new file mode 100644 index 0000000..628619f --- /dev/null +++ b/semestr-2/racket/egzamin/zad1b.rkt @@ -0,0 +1,482 @@ +#lang racket + + + +;; Oświadczam, że rozwiązanie zadania egzaminacyjnego przygotowałem +;; w pełni samodzielnie, korzystając wyłącznie z materiałów do wykładu, +;; notatek, podręcznika, oraz materiałów zacytowanych w treści rozwiązania. +;; Oświadczam że nie korzystałem w żadnej formie z pomocy osób trzecich +;; w przygotowaniu rozwiązania ani też takiej pomocy nie udzielałem +;; i nie udostępniałem nikomu swojego rozwiązania. + +;; ZADANIE 1 +;; ========= + +;; W tym zadaniu rozważamy język WHILE (w formie z grubsza +;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o +;; lokalnym zakresie. + +;; Zadanie polega na dodaniu do języka procedur definiowanych na +;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie +;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o +;; dowolnym wybranym przez siebie modelu działania. W tym celu należy: +;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów +;; · rozszerzyć procedurę parsowania +;; · rozszerzyć ewaluator +;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia +;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić +;; w komentarzu, podobnie jak niniejsze polecenie. + +;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele +;; sensownych rozwiązań które stosowały liczne języki imperatywne w +;; historii — nie jest treścią zadania znalezienie *najlepszego*, +;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur +;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto +;; pokazać że ma się tego świadomość w słownym opisie jego działania. + + + + + + + +;; Postanowiłem, że struktura programów w moim języku będzie miała trochę z pythona i trochę z C. +;; Istotną decyzją którą podjąłem jest to, że wszystkie funkcje w naszym języku muszą zwracać +;; jakąś wartość (zawsze zwracają inta), łącznie z funkcją main, przy pomocy dyrektywy "return". +;; To, co zwraca main, jest tym co zwraca +;; cały program (z małym wyjątkiem, ale o tym później). Okazało się, że takie podejście +;; do sprawy jest bardzo wygodne -- nie musiałem się dzięki temu nawet przejmować +;; osobnym implementowaniem funkcji rekurencyjnych, wzajemnie rekurencyjnych +;; czy nawet zagnieżdżonych, a do tego można definiować funkcje w dowolnej kolejności! +;; Co więcej, funkcje przyjmują dowolnie wiele argumentów, również 0. +;; On top of that, do funkcji można przekazywać cokolwiek co ewaluuje się do wartości +;; Czyli mozna przekazywać wartości zmiennych, jak i dowolne wyrażenia! + +;; Oto przykładowy kod, po którym raczej jasno widać w jak wygląda nowa składnia: +(define BINOM '({func main () + (return (call binom (N K)))} + {func fact (t) + (if (= t 0) + (return 1) + ({func decr (x) (return (- x 1))} + (return (* t (call fact ((call decr (t))))))))} + {func binom (n k) + (if (= k 0) + (return 1) + (var (num (call fact (n))) + (var (den (* (call fact (k)) (call fact ((- n k))))) + (return (/ num den)))))} + )) +(define (bin n k) + (eval-prog (parse-cmd BINOM) (mem-alloc 'i 1 (mem-alloc 'N n (mem-alloc 'K k empty-mem))))) +;; Specjalnie trochę pokomplikowałem, ale widać featury naszego języka. + +;; Jak to w ogóle działa? + +;; Za każdym razem, kiedy definiuję funkcję, to do środowiska dodaję parę (nazwa funkcji . clo), +;; gdzie clo jest takim quasi-domknięciem, jest to po prostu struktura trzymająca nazwy +;; argumentów funkcji oraz jej ciało. Właśnie takie podejście bardzo dobrze +;; załatwiło łatwość w definiowaniu funkcji rekurencyjnych oraz wzajemnie rekurencyjnych i +;; zagnieżdżonych -- żadna funkcja nie zostanie wywołana, dopóki nie wywołam maina, +;; a tego wywołam dopiero po zewaluowaniu wszystkich definicji (tym samym dodaniu ich do środowiska). + +;; Takie podejście ma trochę problemów, chyba największym z nich jest to, że nie ma możliwości +;; zmiany wartości globalnych wewnątrz funkcji. Tj. możemy je zmieniać, ale zmiany będą +;; widoczne jedynie w jej lokalnym zakresie. +;; W zasadzie nie jest to aż tak bolesne -- globalne zmienne możemy traktować po prostu +;; jak argumenty wywołania funkcji main. + +;; Wywoływać funkcję mogę tylko za pomocą specjalnego wyrażenia call, +;; które jako pierwszy argument +;; przyjmuje nazwę funkcji, a jako drugi przyjmuje listę argumentów. +;; Żeby wiedzieć jak działa call, spójrzmy najpierw jak działa return. + +;; return napisane jest tak, że jeśli w jakimkolwiek miejscu funkcji +;; się na niego trafi, to reszta funkcji nie jest już wywoływana +;; (czyli tak jakbyśmy sie spodziewali). Jak on w sumie działa? +;; Na samym początku eval-prog, zanim zacznę w ogóle ewaluować definicje funkcji, +;; dodaje do środowiska specjalną zmienną o nazwie RETURN o wartości #f. +;; Jeśli w funkcji gdziekolwiek wywołam returna, to +;; zmieniam wartość RETURN w środowisku na to, co chcę zwrócić. +;; W eval-cmd za każdym razem sprawdzam jaka jest wartość RETURN. +;; Jeśli jest to #f, to pracuje jakby nigdy nic, a jeśli jest to coś innego, +;; to po prostu zwracam aktualne środowisko. +;; Zatem funkcja zwraca środowisko, w którym zmienna RETURN +;; ustawiona jest na wynik jej obliczenia. + +;; Teraz już prosto widać, że jedyne co robi call, to szuka ciała funkcji +;; w środowisku i wywołuje ją dla podanych argumentów, dostaje od tej +;; funkcji środowisko, a następnie odzyskuje wartość RETURN w zwróconym +;; przez nią środowisku. Dzięki temu po wywołaniu funkcji +;; wewnątrz innej funkcji nie zmienią się wartości żadnych zmiennych (w tym globalnych). +;; Jest to dosyć podobne do pythona -- tam inty są immutable i nie można ich wysłać przez +;; referencję. Ale możemy to robić jeśli się uprzemy np. tak: +;; {func decr (x) +;; (return (- x 1))} +;; {func main () +;; {(i := (call decr (i))) +;; (return i)} +;; Uruchomienie takiego programu ze zmienną globalną i zwróci oczywiście i-1. + +;; Mały problem którego za bardzo nie umiem rozwiązać jest taki, że jeśli gdzieś poza +;; jakąkolwiek funkcją wywołam return, to wartość którą tam zwrócę będzie +;; wartością dla całego programu, bo zmienna RETURN w środowisku zmieni swoją wartość +;; na coś innego od #f i niestety main nawet się nie wykona (na samym wstępie stwierdzi, +;; że coś zostało już zwrócone). Widać to w TEST10. Generalnie co za tym idzie, +;; między definicjami funkcji mogą być jakieś instrukcje, które zostaną +;; wywołane razem z ewaluacją programu, zanim zostanie wywołany main. + +;; Dodatkowe informacje umieściłem w komentarzach w odpowiednich miejscach pliku. +;; Na dole umieściłem kilka testów które pokazują co jak działa. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (name) #:transparent) +(struct call-expr (name args) #:transparent) ;; wywołanie funkcji + +(define (operator? x) + (member x '(+ * - / > < = >= <=))) + +(define (keyword? x) + (member x '(skip while if := func func-rec call return))) ;; kilka nowych słów kluczowych + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(var-expr x) + (and (symbol? x) + (not (keyword? x)))] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [(call-expr n a) + (and (symbol? n) + (list? a) + (andmap expr? a))] + [_ false])) + +(struct skip () #:transparent) +(struct assign (id exp) #:transparent) +(struct if-cmd (exp ct cf) #:transparent) +(struct while (exp cmd) #:transparent) +(struct comp (left right) #:transparent) +(struct var-in (name expr cmd) #:transparent) +(struct function (name args cmd) #:transparent) ;; dodane funkcje, funkcje rekurencyjne oraz return +(struct funcrec (name args cmd) #:transparent) +(struct return-stat (exp) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))] + [(while e c) (and (expr? e) (cmd? c))] + [(comp c1 c2) (and (cmd? c1) (cmd? c2))] + [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))] + [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))] + [(funcrec f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))] + [(return-stat exp) (expr? exp)])) + +(define (prog? p) + (cmd? p)) + +(define (parse-expr p) + (cond + [(number? p) (const p)] + [(and (symbol? p) + (not (keyword? p))) + (var-expr p)] + [(and (list? p) + (= 3 (length p)) + (operator? (car p))) + (binop (first p) + (parse-expr (second p)) + (parse-expr (third p)))] + [(and (list? p) ; <------ wywołanie funkcji + (= (length p) 3) + (eq? (first p) 'call) + (symbol? (second p)) + (list? (third p))) + (call-expr (second p) (map parse-expr (third p)))] + [else false])) + +(define (parse-cmd q) + (cond + [(eq? q 'skip) (skip)] + [(and (list? q) + (= (length q) 3) + (eq? (second q) ':=)) + (assign (first q) (parse-expr (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'while)) + (while (parse-expr (second q)) (parse-cmd (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'var) + (list? (second q)) + (= (length (second q)) 2)) + (var-in (first (second q)) + (parse-expr (second (second q))) + (parse-cmd (third q)))] + [(and (list? q) ; <------ funkcje + (= (length q) 4) + (eq? (first q) 'func) + (symbol? (second q)) + (list? (third q)) + (andmap symbol? (third q))) + (function (second q) (third q) (parse-cmd (fourth q)))] + [(and (list? q) ; <------ return + (= (length q) 2) + (eq? (first q) 'return)) + (return-stat (parse-expr (second q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-comp (map parse-cmd q))] + [else false])) + +(define (desugar-comp cs) + (if (null? (cdr cs)) + (car cs) + (comp (car cs) + (desugar-comp (cdr cs))))) + +(define (value? v) + (number? v)) + +(struct mem (xs) #:transparent) + +(define (mem-lookup x m) + (define (assoc-lookup xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cdar xs)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-update x v m) + (define (assoc-update xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cons (cons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (mem (assoc-update (mem-xs m)))) + +(define (mem-alloc x v m) + (mem (cons (cons x v) (mem-xs m)))) + +(define (mem-drop-last m) + (cond + [(null? (mem-xs m)) + (error "Deallocating from empty memory")] + [else + (mem (cdr (mem-xs m)))])) + +(define empty-mem + (mem null)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /] + ['< (lambda (x y) (if (< x y) 1 0))] + ['> (lambda (x y) (if (> x y) 1 0))] + ['= (lambda (x y) (if (= x y) 1 0))] + ['<= (lambda (x y) (if (<= x y) 1 0))] + ['>= (lambda (x y) (if (>= x y) 1 0))] + )) + +;; zał: (expr? e) i (mem? m) jest prawdą +;; (value? (eval e m)) jest prawdą +(define (eval e m) + (match e + [(const v) v] + [(var-expr x) (mem-lookup x m)] + [(binop op l r) + (let ((vl (eval l m)) + (vr (eval r m)) + (p (op->proc op))) + (p vl vr))] + [(call-expr name args) ;; <------ ewaluacja wywołania funkcji + (match (mem-lookup name m) + [(clo func-args cmd) + (if (= (length args) (length func-args)) ;; <------ sprawdzanie arnosci + (let* ([func-mem (assign-values args func-args m)] + [final-mem (eval-cmd cmd func-mem)] + [ret (mem-lookup 'RETURN final-mem)]) + (if ret + ret + (error "No return statement in function" name))) + (error "Arity mismatch, function" name "takes" (length func-args) "arguments, got" (length args)))] + [else (error "Undefined function" name)])])) + +(define (assign-values args func-args mem) ;; <------ przypisanie wartosci do argumentow funkcji + (define (iter args func-args new-mem) + (if (null? args) + new-mem + (iter (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) new-mem)))) + (iter args func-args mem)) + + +(struct clo (args cmd)) ; <----- tak trzymana jest funkcja w środowisku, tj. jako lista nazw argumentow i cialo funkcji + +;; zał: (cmd? c) (mem? m) +;; (mem? (eval-cmd c m)) +(define (eval-cmd c m) + (if (mem-lookup 'RETURN m) ; <----- jeśli RETURN jest na coś ustawione, to chcemy zrwócic pamięc + m + (match c + [(skip) m] + [(assign x e) (mem-update x (eval e m) m)] + [(if-cmd e ct cf) (if (= (eval e m) 0) + (eval-cmd cf m) + (eval-cmd ct m))] + [(while e cw) (if (= (eval e m) 0) + m + (let* ((m1 (eval-cmd cw m)) + (m2 (eval-cmd c m1))) + m2))] + [(comp c1 c2) (let* ((m1 (eval-cmd c1 m)) + (m2 (eval-cmd c2 m1))) + m2)] + [(var-in x e c) (let* ((v (eval e m)) + (m1 (mem-alloc x v m)) + (m2 (eval-cmd c m1))) + (mem-drop-last m2))] + [(function name args cmd) ; <------ dodanie ciała funkcji do środowiska + (mem-alloc name (clo args cmd) m)] + [(return-stat val) ; <------ zmiana wartości zmiennej RETURN + (mem-update 'RETURN (eval val m) m)] + [_ (error "Unknown command" c "— likely a syntax error")]))) + + +;; program ewaluowany jest tak +;; ewaluowane są wszystkie definicje funkcji, wtedy +;; ręcznie szukam definicji main i ewaluuje jej ciało i zwracam to co zwróci main. +;; zakładam, że main nie przyjmuje żadnych argumentów. +(define (eval-prog p m) + (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m)))) + (match (mem-lookup 'main final-mem) + [(clo args cmd) + (let ((res (mem-lookup 'RETURN (eval-cmd cmd final-mem)))) + (if res res (error "No return statement in main")))]))) + +(define WHILE_FACT + '({func decr (x) + {(x := (- x 1)) + (return x)}} + {func main () + {(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (call decr (t)))}) + (return i)}} + )) + +(define (fact n) + (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))]) + (eval-prog (parse-cmd WHILE_FACT) init-env))) + +(define TEST + '({func decr (x) (return (- x 1))} + {func main () + (var (x 1) + {(x := (+ x 2)) + (return (call decr (x)))})})) +(define (test) (eval-prog (parse-cmd TEST) empty-mem)) + +(define TEST2 + '({func decr (x) (return (- x 1))} + {func main () (return (call decr (3)))})) +(define (test2) (eval-prog (parse-cmd TEST2) empty-mem)) + +; nie da się zmienić wartości zmiennej globalnej, zmienne są wysyłane przez kopie +(define TEST3 + '({func sth (x) + {(i := -1) + (return x)}} + {func main () + {(i := 2) + (return (call sth (i)))}})) +(define (test3) (eval-prog (parse-cmd TEST3) (mem-alloc 'i 3 empty-mem))) + +; nie ma maina, wywala błąd +(define TEST4 + '(func f () + {return 1})) +(define (test4) (eval-prog (parse-cmd TEST4) empty-mem)) + +; funkcje wieloargumentowe +(define TEST5 + '({func f1 (x y z) + (return y)} + {func f2 (x y z) + (return (+ (+ x y) z))} + {func main () + {(if (> X 3) + (var (x 2) + (return (call f1 (1 x 3)))) + (x := 5)) + (return (call f2 (x 3 4)))}})) +(define (test5) (eval-prog (parse-cmd TEST5) (mem-alloc 'x -1 (mem-alloc 'X 4 empty-mem)))) + +; Działa rekurencja!! +(define TEST6 + '({func f (x) + (if (= x 0) + (return 1) + (return (* x (call f ((- x 1))))))} + {func main () + (return (call f (X)))})) +(define (test6) (eval-prog (parse-cmd TEST6) (mem-alloc 'X 5 empty-mem))) + +; kolejnośc deklaracji funkcji nie ma znaczenia, można zagnieżdżać funkcje +(define TEST7 + '( + {func main () + (return (call f (2)))} + {func f (x) + (return (call f1 (x)))} + {func f1 (x) + {{func local-fun (x) + (return (+ 1 x))} + (return (call local-fun (x)))}})) +(define (test7) (eval-prog (parse-cmd TEST7) empty-mem)) + +; instrukcje poza jakimikolwiek funkcjami sa wykonywane przed wywołaniem main +(define TEST8 + '({func main () + (return i)} + (i := 2))) +(define (test8) (eval-prog (parse-cmd TEST8) (mem-alloc 'i 1 empty-mem))) + +; nic nie zwraca main, wywala błąd +(define TEST9 + '(func main () + (i := 1))) +(define (test9) (eval-prog (parse-cmd TEST9) (mem-alloc 'i 1 empty-mem))) + +; return poza jakąkolwiek funkcją jest wynikiem programu +(define TEST10 + '({func main () + (return i)} + (i := 2) + (return -1))) +(define (test10) (eval-prog (parse-cmd TEST10) (mem-alloc 'i 1 empty-mem))) + + +; arity mismatch +(define TEST11 + '({func main () + (return (call decr ()))} + {func decr (x) + (return (- x 1))})) +(define (test11) (eval-prog (parse-cmd TEST11) empty-mem)) diff --git a/semestr-2/racket/egzamin/zad2.bak b/semestr-2/racket/egzamin/zad2.bak new file mode 100644 index 0000000..02e2ae0 --- /dev/null +++ b/semestr-2/racket/egzamin/zad2.bak @@ -0,0 +1,119 @@ +#lang racket + +;; ZADANIE 2 +;; ========= + +;; W tym zadaniu przyjrzymy się pierwszemu "językowi programowania" +;; który widzieliśmy na zajęciach: wyrażeniom arytmetycznym. Ich +;; prostota przejawia się przede wszystkim tym że nie występują w nich +;; zmienne (a w szczególności ich wiązanie) — dlatego możemy o nich +;; wnioskować nie używając narzędzi cięższych niż te poznane na +;; wykładzie. + +;; W tym zadaniu będziemy chcieli udowodnić że nasza prosta kompilacja +;; do odwrotnej notacji polskiej jest poprawna. Konkretniej, należy +;; · sformułować zasady indukcji dla obydwu typów danych +;; reprezentujących wyrażenia (expr? i rpn-expr?) +;; · sformułować i udowodnić twierdzenie mówiące że kompilacja +;; zachowuje wartość programu, tj. że obliczenie wartości programu +;; jest równoważne skompilowaniu go do RPN i obliczeniu. +;; · sformułować i udowodnić twierdzenie mówiące że translacja z RPN +;; do wyrażeń arytmetycznych (ta która była zadaniem domowym; +;; implementacja jest poniżej) jest (prawą) odwrotnością translacji +;; do RPN (czyli że jak zaczniemy od wyrażenia i przetłumaczymy do +;; RPN i z powrotem, to dostaniemy to samo wyrażenie). +;; Swoje rozwiązanie należy wpisać na końcu tego szablonu w +;; komentarzu, podobnie do niniejszej treści zadania; proszę zadbać o +;; czytelność dowodów! + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (operator? x) + (member x '(+ * - /))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + + +(define (value? v) + (number? v)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /])) + +;; zał: (expr? e) jest prawdą +;; (value? (eval e)) jest prawdą +(define (eval e) + (match e + [(const v) v] + [(binop op l r) + (let ((vl (eval l)) + (vr (eval r)) + (p (op->proc op))) + (p vl vr))])) + +(define (rpn-expr? e) + (and (list? e) + (pair? e) + (andmap (lambda (x) (or (number? x) (operator? x))) e))) + + +(struct stack (xs)) + +(define empty-stack (stack null)) +(define (empty-stack? s) (null? (stack-xs s))) +(define (top s) (car (stack-xs s))) +(define (push a s) (stack (cons a (stack-xs s)))) +(define (pop s) (stack (cdr (stack-xs s)))) + + +(define (eval-am e s) + (cond + [(null? e) (top s)] + [(number? (car e)) (eval-am (cdr e) (push (car e) s))] + [(operator? (car e)) + (let* ((vr (top s)) + (s (pop s)) + (vl (top s)) + (s (pop s)) + (v ((op->proc (car e)) vl vr))) + (eval-am (cdr e) (push v s)))])) + +(define (rpn-eval e) + (eval-am e empty-stack)) + +(define (arith->rpn e) + (match e + [(const v) (list v)] + [(binop op l r) (append (arith->rpn l) (arith->rpn r) (list op))])) + +(define (rpn-translate e s) + (cond + [(null? e) + (top s)] + + [(number? (car e)) + (rpn-translate (cdr e) (push (const (car e)) s))] + + [(operator? (car e)) + (let* ((er (top s)) + (s (pop s)) + (el (top s)) + (s (pop s)) + (en (binop (car e) el er))) + (rpn-translate (cdr e) (push en s)))])) + +(define (rpn->arith e) + (rpn-translate e empty-stack)) \ No newline at end of file diff --git a/semestr-2/racket/egzamin/zad2.rkt b/semestr-2/racket/egzamin/zad2.rkt new file mode 100644 index 0000000..e549f07 --- /dev/null +++ b/semestr-2/racket/egzamin/zad2.rkt @@ -0,0 +1,186 @@ +#lang racket + +;; Oświadczam, że rozwiązanie zadania egzaminacyjnego przygotowałem +;; w pełni samodzielnie, korzystając wyłącznie z materiałów do wykładu, +;; notatek, podręcznika, oraz materiałów zacytowanych w treści rozwiązania. +;; Oświadczam że nie korzystałem w żadnej formie z pomocy osób trzecich +;; w przygotowaniu rozwiązania ani też takiej pomocy nie udzielałem +;; i nie udostępniałem nikomu swojego rozwiązania. + +;; ZADANIE 2 +;; ========= + +;; W tym zadaniu przyjrzymy się pierwszemu "językowi programowania" +;; który widzieliśmy na zajęciach: wyrażeniom arytmetycznym. Ich +;; prostota przejawia się przede wszystkim tym że nie występują w nich +;; zmienne (a w szczególności ich wiązanie) — dlatego możemy o nich +;; wnioskować nie używając narzędzi cięższych niż te poznane na +;; wykładzie. + +;; W tym zadaniu będziemy chcieli udowodnić że nasza prosta kompilacja +;; do odwrotnej notacji polskiej jest poprawna. Konkretniej, należy +;; · sformułować zasady indukcji dla obydwu typów danych +;; reprezentujących wyrażenia (expr? i rpn-expr?) +;; · sformułować i udowodnić twierdzenie mówiące że kompilacja +;; zachowuje wartość programu, tj. że obliczenie wartości programu +;; jest równoważne skompilowaniu go do RPN i obliczeniu. +;; · sformułować i udowodnić twierdzenie mówiące że translacja z RPN +;; do wyrażeń arytmetycznych (ta która była zadaniem domowym; +;; implementacja jest poniżej) jest (prawą) odwrotnością translacji +;; do RPN (czyli że jak zaczniemy od wyrażenia i przetłumaczymy do +;; RPN i z powrotem, to dostaniemy to samo wyrażenie). +;; Swoje rozwiązanie należy wpisać na końcu tego szablonu w +;; komentarzu, podobnie do niniejszej treści zadania; proszę zadbać o +;; czytelność dowodów! + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (operator? x) + (member x '(+ * - /))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + + +(define (value? v) + (number? v)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /])) + +;; zał: (expr? e) jest prawdą +;; (value? (eval e)) jest prawdą +(define (eval e) + (match e + [(const v) v] + [(binop op l r) + (let ((vl (eval l)) + (vr (eval r)) + (p (op->proc op))) + (p vl vr))])) + +(define (rpn-expr? e) + (and (list? e) + (pair? e) + (andmap (lambda (x) (or (number? x) (operator? x))) e))) + +;; mój kod +(define (parse-expr q) + (cond + [(integer? q) (const q)] + [(and (list? q) (= (length q) 3) (operator? (first q))) + (binop (first q) (parse-expr (second q)) (parse-expr (third q)))])) + +(struct stack (xs)) + +(define empty-stack (stack null)) +(define (empty-stack? s) (null? (stack-xs s))) +(define (top s) (car (stack-xs s))) +(define (push a s) (stack (cons a (stack-xs s)))) +(define (pop s) (stack (cdr (stack-xs s)))) + + +(define (eval-am e s) + (cond + [(null? e) (top s)] + [(number? (car e)) (eval-am (cdr e) (push (car e) s))] + [(operator? (car e)) + (let* ((vr (top s)) + (s (pop s)) + (vl (top s)) + (s (pop s)) + (v ((op->proc (car e)) vl vr))) + (eval-am (cdr e) (push v s)))])) + +(define (rpn-eval e) + (eval-am e empty-stack)) + +(define (arith->rpn e) + (match e + [(const v) (list v)] + [(binop op l r) (append (arith->rpn l) (arith->rpn r) (list op))])) + +(define (rpn-translate e s) + (cond + [(null? e) + (top s)] + + [(number? (car e)) + (rpn-translate (cdr e) (push (const (car e)) s))] + + [(operator? (car e)) + (let* ((er (top s)) + (s (pop s)) + (el (top s)) + (s (pop s)) + (en (binop (car e) el er))) + (rpn-translate (cdr e) (push en s)))])) + +(define (rpn->arith e) + (rpn-translate e empty-stack)) + + +;; W kilku miejscach pozwoliłem sobie zapomnieć że symbol operatora i operator +;; to nie to samo, ale nie ma to znaczenia w kontekście dowodów. +;; Przez ES oznaczam empty-stack +;; +;; Zasada indukcji dla expr: +;; Dla dowolnej własności P, jeśli +;; · zachodzi P((const x)) dla dowolnego x oraz +;; · dla dowolnych e1, e2 oraz operator op jeśli zachodzi P(e1), P(e2) +;; to zachodzi P((binop op e1 e2)) +;; to dla dowolnego e, jeśli zachodzi (expr? e) to zachodzi P(e) +;; +;; Zasada indukcji dla rpn (ale tego wg rpn-expr?): +;; Dla dowolnej własności P, jeśli +;; · zachodzi P(x) dla dowolnej liczby lub opeartora x oraz +;; · dla dowolnej listy liczb lub operatorów xs oraz dowolnej liczby lub +;; operatora x, jesli zachodzi P(xs), to zachodzi P((cons x xs)) +;; to dla dowolnej listy xs liczb lub operatorów zachodzi P(xs) +;; +;; +;; Tw. 1: Jeśli spełnione jest (expr? e), to (eval e) ≡ (rpn-eval (arith->rpn e)) +;; +;; D-d. Skorzystamy z zasady indukcji dla wyrażeń. +;; · Weźmy dowolną liczbę x. Wtedy jeśli e ≡ (const x), to zachodzi +;; (eval (const x)) ≡ x ≡ (rpn-eval '(x)) ≡ (rpn-eval (arith->rpn (const x))) +;; · Weźmy dowolne e1, e2 spełniające naszą tezę oraz jakiś operator op. Wtedy +;; (eval (binop op e1 e2)) ≡ +;; (op (eval e1) (eval e2)) ≡ [Z definicji eval-am] +;; (eval-am '() (push (op (eval e1) (eval e2)) ES)) ≡ +;; (eval-am '(op) (push (eval e2) (push (eval e1) ES))) ≡ [Z założenia indukcyjnego] +;; (eval-am '(op) (push (rpn-eval (arith->rpn e2)) (push (eval e1) ES))) ≡ +;; (eval-am (append (arith->rpn e2) '(op)) (push (eval e1) ES)) ≡ [Z założenia indukcyjnego] +;; (eval-am (append (arith->rpn e1) (arith->rpn e2) '(op)) ES) ≡ +;; (rpn-eval (append (arith->rpn e1) (arith->rpn e2) '(op))) ≡ [Z definicji arith->rpn] +;; (rpn-eval (arith->rpn (binop op e1 e2))) +;; Pokazaliśmy oba warunki indukcji dla wyrażeń, zatem twierdzenie prawdziwe jest +;; dla dowolnego wyrażenia e spełniającego (expr? e). +;; +;; Tw. 2: Jeśli spełnione jest (expr? e), to (rpn->arith (arith->rpn e)) ≡ e +;; +;; D-d. Skoryzstamy z indukcji dla wyrażeń. +;; · Weźmy dowolną liczbę x. Wtedy dla e ≡ (const x) zachodzi +;; (rpn->arith (arith->rpn e)) ≡ (rpn->arith '(x)) ≡ (const x) +;; · Weźmy dowolne e1, e2 dla których twierdzenie zachodzi oraz operator op. Wtedy +;; (rpn->arith (arith->rpn (binop op e1 e2))) ≡ [Z definicji arith->rpn] +;; (rpn->arith (append (arith->rpn e1) (arith->rpn e2) '(op))) ≡ +;; (rpn-translate (append (arith->rpn e1) (arith->rpn e2) '(op)) ES) ≡ [Z zał. (arith->rpn e1) ewaluuje się do liczby] +;; (rpn-translate (append (arith->rpn e2) '(op)) (push e1 ES)) ≡ [Z zał. (arith->rpn e2) ewaluuje się do liczby] +;; (rpn-translate '(op) (push e2 (push e1 ES))) ≡ [Z definicji rpn-translate] +;; (rpn-translate '() (push (binop op e1 e2) ES)) ≡ +;; (binop op e1 e2) +;; Pokazaliśmy oba warunki indukcji dla wyrażeń, zatem twierdzenie jest prawdziwe +;; dla dowolnego e spełniającego (expr? e). diff --git a/semestr-2/racket/egzamin/zad3.bak b/semestr-2/racket/egzamin/zad3.bak new file mode 100644 index 0000000..20115e9 --- /dev/null +++ b/semestr-2/racket/egzamin/zad3.bak @@ -0,0 +1,4 @@ +#lang racket + + + diff --git a/semestr-2/racket/egzamin/zad3.rkt b/semestr-2/racket/egzamin/zad3.rkt new file mode 100644 index 0000000..9bfed02 --- /dev/null +++ b/semestr-2/racket/egzamin/zad3.rkt @@ -0,0 +1,347 @@ +#lang racket + +;; Oświadczam, że rozwiązanie zadania egzaminacyjnego przygotowałem +;; w pełni samodzielnie, korzystając wyłącznie z materiałów do wykładu, +;; notatek, podręcznika, oraz materiałów zacytowanych w treści rozwiązania. +;; Oświadczam że nie korzystałem w żadnej formie z pomocy osób trzecich +;; w przygotowaniu rozwiązania ani też takiej pomocy nie udzielałem +;; i nie udostępniałem nikomu swojego rozwiązania. + +;; ZADANIE 3 +;; ========= + +;; Z gramatykami bezkontekstowymi spotkaliście się już na Wstępie do +;; Informatyki. W tym zadaniu potraktujemy je jako dane dla naszych +;; programów. + +;; Przypomnijmy, że gramatyka bezkontekstowa składa się z +;; · skończonego zbioru *symboli nieterminalnych* +;; · skończonego zbioru *symboli terminalnych* +;; · wybranego nieterminalnego symbolu startowego +;; · zbioru *produkcji*, czyli par symbol nieterminalny - lista +;; (potencjalnie pusta) symboli terminalnych lub nieterminalnych + +;; Słowo (ciąg symboli terminalnych) możemy wyprowadzić z gramatyki, +;; jeśli możemy zacząć od ciągu składającego się z symbolu startowego +;; możemy użyć skończonej liczby produkcji z gramatyki przepisując +;; symbol nieterminalny na ciąg symboli mu odpowiadających (w danej +;; produkcji). + + +;; Przykład: poprawne nawiasowania + +;; Gramatyka składa się z jednego symbolu nieterminalnego, S (który +;; jest oczywiście symbolem startowym) i dwóch symboli terminalnych +;; "(" i ")", i zawiera następujące produkcje (zwyczajowo zapisywane +;; przy użyciu strzałki; zwróćcie uwagę że pierwszy ciąg jest pusty!): +;; S -> +;; S -> SS +;; S -> (S) + +;; W często spotykanej, bardziej zwięzłej, postaci BNF moglibyśmy tę +;; gramatykę zapisać tak (dbając trochę bardziej o wizualne +;; oddzielenie symboli terminalnych i nieterminalnych): +;; S ::= "" | SS | "(" S ")" +;; Mamy tu te same produkcje, ale tylko raz zapisujemy każdą z +;; powtarzających się lewych stron. + +;; Z gramatyki tej da się wyprowadzić wszystkie poprawnie rozstawione +;; ciągi nawiasów — zobaczmy jak wyprowadzić (na jeden ze sposobów) +;; ciąg "(()())". Zaczynamy, jak zawsze, od słowa złożonego z symbolu +;; startowego i przepisujemy: +;; S -> (S) -> (SS) -> ((S)S) -> ((S)(S)) -> (()(S)) -> (()()) + + +;; Zadanie cz. 1 + +;; Zdefiniuj reprezentację gramatyki jako typu danych w +;; Rackecie. Warto zastanowić się co można uprościć względem definicji +;; matematycznej — w szczególności możemy założyć że dowolne napisy +;; (typu string) są ciągami symboli terminalnych, i że nie musimy +;; podawać jawnie zbioru nieterminali; również reprezentacja produkcji +;; gramatyki jako worka z parami wejście-wyjście niekoniecznie jest +;; najwygodniejsza. + +;; Uwaga: w tym zadaniu nie wymagamy definiowania składni konkretnej i +;; parsowania, ale bardzo polecamy wybranie jakiejś formy, żeby móc +;; sensownie przetestować swoje rozwiązanie! + + +;; "Optymalizacja" gramatyk + +;; Gramatyki, podobnie jak programy, piszą ludzie — może więc zdarzyć +;; się że znajdą się tam śmieci. Mogą one mieć dwojaką formę: symboli +;; nieterminalnych, których nie da się wyprowadzić z symbolu +;; startowego, lub symboli nieterminalnych z których nie da się +;; wyprowadzić żadnego słowa terminalnego (tj. niezawierającego +;; symboli nieterminalnych). Przykładowo, do naszej gramatyki +;; moglibyśmy dodać symbole P i Q, i produkcje: +;; S -> ")(" P +;; P -> PP "qed" +;; Q -> "abc" + +;; Mimo że nasza gramatyka wygląda inaczej na pierwszy rzut oka, tak +;; naprawdę się nie zmieniła: do symbolu Q nie możemy dojść z symbolu +;; S, a więc "abc" nigdy nie wystąpi w słowie wyprowadzalnym z +;; gramatyki. Analogicznie, z P nie da się wyprowadzić żadnego słowa, +;; które nie zawierałoby symbolu P — a zatem żadnego słowa złożonego +;; tylko z symboli terminalnych. To znaczy, że naszą gramatykę możemy +;; uprościć wyrzucając z niej symbole nieterminalne (i produkcje które +;; ich używają) do których nie da się dojść (tj. są *nieosiągalne*) i +;; te, z których nie da się ułożyć słowa terminalnego (tj. są +;; *nieproduktywne*). Jeśli z naszej rozszerzonej gramatyki wyrzucimy +;; takie symbole, dostaniemy oczywiście gramatykę początkową. + + +;; Zadanie cz. 2 + +;; Dla swojej reprezentacji gramatyki z poprzedniej części zadania +;; napisz dwie procedury: cfg-unreachable, znajdującą symbole +;; nieterminalne które są nieosiągalne z symbolu startowego, i +;; cfg-unproductive, znajdującą symbole nieterminalne które nie są +;; produktywne. Następnie użyj tych procedur żeby zdefiniować +;; procedurę cfg-optimize, która uprości daną gramatykę usuwając z +;; niej symbole nieosiągalne i nieproduktywne, a także odpowiednie +;; produkcje. + +;; Rozwiązanie wpisz w poniższym pliku, i opatrz komentarzem +;; opisującym wybraną reprezentację (i podjęte przy jej projektowaniu +;; decyzje), a także zaimplementowane w cz. 2. algorytmy. + + + + + + +;; Zadanie 1 + +;; Reprezentacja jest docyś prosta, mianowicie stworzyłem struktury +;; terminal, non-terminal, rule oraz grammar. Dwa pierwsze to +;; po prostu jednoelementowe struktury utrzymujące nazwę symboli. +;; grammar to dwuelementowa struktura, jej pierwszym elementem +;; jest symbol startowy, a następnym produkcja, czyli lista reguł (listof rule), +;; a reguły to dwuelementowe struktury (symbol niterminalny - lista nonterminali lub termianli). +;; Generalnie dzięki temu, że mam te struktury terminal oraz non-terminal +;; to symbol nieterminalne i temrinalne mogą być czykolwiek. Dodatkowo +;; dla uproszczenia w miejscach, gdzie mam pewność że chodzi mi o +;; symbol nieterminalny, to nie opakowuję go w strukturę. +;; Przykładowo rules w gramatyce może wyglądać tak: +;; (list +;; (rule 'S (list (terminal ""))) +;; (rule 'S (list (non-terminal 'S) (non-terminal 'S))) +;; (rule 'S (list (terminal "(") (non-terminal 'S) (terminal ")")))) +;; Oczywiście symbol nieterminalny nie musi być racketowym symbolem, może być czymkolwiek. +;; Podobnie z symbolami terminalnymi. Proszę również zauważyć, że dzięki +;; strukturom non-terminal oraz terminal te same racketowe obiekty mogą być jednocześnie +;; terminalami oraz nieterminalami! +;; W tych parach na pierwszym miejscu nie jest non-terminal, tylko po prostu cokolwiek +;; no i oczywiście mam wtedy pewność że musi być to non-terminal, nie ma potrzeby +;; żeby pakować go również w tę strukturę. + + +;; Postanowiłem napisać parser (make-cfg q), generuje on gramatyki w bardzo konkretny sposób, +;; trochę ograniczo to czym mogą być symbole nieterminalne oraz terminalne, +;; ale nie wydaje mi się że i tak składnia jest bardzo wygodna i mało ograniczająca. + +;; Składnia konkretna naszych gramatyk wygląda bardzo podobnie do zapisu +;; przedstawionego w treści zadania. +;; np. gramatyka nawiasowania będzie wyglądać następująco: +;; '(grammar S (S ::= "" -- SS -- "(" S ")")) +;; ale mogłaby wyglądać też tak: +;; '(grammar S (S ::= "") (S ::= SS -- "(" S ")")) +;; a np. ta nieciekawa gramatyka przedstawiona w treści zadania: +;; '(grammar S (S ::= "] [" P) (P ::= PP "qed") (Q ::= "abc")) +;; Zatem będzie to lista, która na pierwszym miejscu ma symbol 'grammar +;; na drugim miejscu ma symbol startowy +;; następnie następuje lista produkcji w formacie: +;; ::= +;; Zalety: +;; - rozróżnienie w składni konkretnej symboli nieterminalnych i terminalnych +;; przez użycie symboli i stringów pozwala na to, aby symbole terminalne nazywały się tak +;; jak terminalne, tj. "S" nie jest tym samym co 'S. +;; - składnia wydaje się bardzo wygodna w użyciu, nie ma też problemu, żeby później dopisać +;; dodatkowe reguły dla jakiegoś nieterminala, +;; - parser jest całkiem łatwy w implementacji +;; Wady: +;; - symbole nieterminalne mogą składać się jedynie z jednego symbolu, zatem nie możemy robić ich +;; zbyt wiele. Jest tak dlatego, że np. tutaj (S ::= SS) nie chodzi mi o symbol SS, tylko +;; o sąsiadujące symbole SS (jednak gdyby nie używać parsera to normalnie moglibyśmy +;; mieć wieloznakowe symbole nieterminalne!). + +;; Dla przykładu taka gramatyka: +;; '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QS -- "[" Q "]")) +;; będzie reprezentowana następująco: +;; (grammar +;; 'S +;; (list +;; (rule 'S (list (terminal ""))) +;; (rule 'S (list (non-terminal 'S) (non-terminal 'S))) +;; (rule 'S (list (terminal "(") (non-terminal 'S) (terminal ")"))) +;; (rule 'S (list (non-terminal 'Q))) +;; (rule 'Q (list (terminal ""))) +;; (rule 'Q (list (non-terminal 'Q) (non-terminal 'S))) +;; (rule 'Q (list (terminal "[") (non-terminal 'Q) (terminal "]"))))) + +;; Cała reprezentacja :D +(struct non-terminal (sym) #:transparent) +(struct terminal (sym) #:transparent) +(struct rule (nt xs) #:transparent) +(struct grammar (start rules) #:transparent) + + +;; PARSER +(define SEPARATOR '--) + +(define (split-at-symb symb xs) + (define (iter left right) + (cond + [(null? right) (cons left null)] + [(eq? symb (car right)) (cons left (cdr right))] + [else (iter (cons (car right) left) (cdr right))])) + (let ([res (iter null xs)]) + (cons (reverse (car res)) (cdr res)))) + +(define (split-by-separator xs) + (let ([res (split-at-symb SEPARATOR xs)]) + (if (null? (cdr res)) + res + (cons (car res) (split-by-separator (cdr res)))))) + +;; PARSER SKŁADNI KONKRETNEJ DO JEJ REPREZENTACJI +(define (make-cfg q) + (cond + [(and (list? q) (eq? 'grammar (first q))) + (grammar (second q) (append-map make-cfg (cddr q)))] + [(and (list? q) (eq? '::= (second q))) + (let ([nt (first q)] + [rules (split-by-separator (cddr q))]) + (map (lambda (x) (rule nt x)) (map make-prod rules)))])) + +(define (symbol->list s) + (map string->symbol + (map string + (string->list (symbol->string s))))) + +(define (make-prod xs) + (cond + [(null? xs) null] + [(string? (car xs)) (cons (terminal (car xs)) (make-prod (cdr xs)))] + [(symbol? (car xs)) (append (map non-terminal (symbol->list (car xs))) (make-prod (cdr xs)))] + [else (error "Invalid syntax in production" xs)])) + + +(define sample '(S ::= "" -- SS -- "(" S ")")) +(define sample2 '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QQ -- "[" Q "]"))) +(define sample3 '(grammar S + (S ::= A B -- D E) + (A ::= "a") + (B ::= "b" C) + (C ::= "c") + (D ::= "d" F) + (E ::= "e") + (F ::= "f" D))) + +(define (sample-grammar) (make-cfg sample3)) + +;; zadanie 2 + +;; korzystam z algorytmów przedstawionych w tej książce: +;; https://bit.ly/3ev0NUA, konkretnie te ze stron 50-51 +;; Pozwoliłem sobie trochę zmienić przeznaczenie funkcji cfg-unreachable oraz cfg-unproductive +;; Zamiast zwracać nieproduktywne nieterminale, zwracają właśnie produktywne +;; i analogicznie w tym drugim. Po prostu taka implementacja jest dla mnie wygodniejsza, +;; a jest bardzo nieistotną zmianą koncepcyjną. +;; Stąd zmiana nazwy na cfg-productive oraz cfg-reachable + +;; cfg-productive działa w ten sposób: +;; Jakiś nieterminal nazywamy produktywnym, jeśli ma co najmniej jedną produktywną zasadę +;; Jakąś regułę nazywamy produktywną, jeśli składa się z terminali lub produktywnych nieterminali +;; Jasno widać, że wg tej definicji te nieterminale, które nie są produktywne, są nieproduktywne +;; wg definicji zadania, a cała reszta jest produktwna. + +;; Algorytm znajdowania produktywnych nieterminali: +;; Mamy listę produktywnych nieterminali P, początkowo pustą +;; 1. Stwórz nową listę P' +;; 2. Przejdź po liście reguł +;; -> jeśli dana reguła jest produktywna (wg P), dodaj jej nieterminal do P' +;; 3. Jeśli P != P', zrób P := P' i wróć do 1. +;; 4. Zwróć P + +;; Fajne w tym algorytmie jest to, że jeśli mamy jakiś nieterminal, którego +;; używamy w jakiejś regule, ale ten nieterminal nie ma zdefiniowanej żadnej reguły, +;; to nie zostanie oznaczony jako produktywny, co jest dla nas korzystne. + +;; Algorytm znajdowania osiągalnych nieterminali: +;; Traktujemy nitereminale jak wierzchołki w grafie a reguły jako listy sąsiedztwa. +;; Terminale są liśćmi, a nieterminale węzłami. Robimy po prostu DFSa z nieterminala +;; startowego i węzły do których dotrzemy oznaczamy jako osiągalne. + +;; Wg papierka który tutaj podałem, jeśli najpierw usuniemy nieproduktywne nieterminale, +;; a w następnej kolejności nieosiągalne, to nasza gramatyka stanie się regularna. +;; Wydaje się to w miarę sensowne -- pierszy algorytm to takie odcinanie liści i odcyklanie +;; grafu, a ten drugi to po prostu DFS. + +;; przydatne predykaty -- na productive-nt mam listę symboli niterminalnych +;; (nie struktury non-terminal, tylko te symbole!) +;; które wiem że są produktywne. +;; productive? sprawdza, czy nietermial jest produktywny +;; to drugie sprawdza czy reguła jest produktywna +;; (czyli czy składa się z produktywnych nonterminali lub terminali) +(define (productive? p productive-nt) + (or (terminal? p) (member (non-terminal-sym p) productive-nt))) +(define (rule-productive? r productive-nt) + (andmap (lambda (x) (productive? x productive-nt)) r)) + +;; zwraca listę produktywnych symboli (nie nonterminali!) +(define (cfg-productive g) + (define (find-productive-nt productive-nt rules) + (cond + [(null? rules) (remove-duplicates productive-nt)] + [(rule-productive? (rule-xs (car rules)) productive-nt) + (find-productive-nt (cons (rule-nt (car rules)) productive-nt) (cdr rules))] + [else (find-productive-nt productive-nt (cdr rules))])) + (define (iter productive-nt) + (let ([new-prod-nt (find-productive-nt productive-nt (grammar-rules g))]) + (if (equal? productive-nt new-prod-nt) + productive-nt + (iter new-prod-nt)))) + (iter null)) + +;; zwraca listę osiągalnych symboli +(define (cfg-reachable g) + (define (iter verts vis) + (cond + [(null? verts) vis] + [(member (car verts) vis) (iter (cdr verts) vis)] + [else (iter (cdr verts) (dfs (car verts) vis))])) + (define (dfs v vis) + (let* ([rules (filter (lambda (r) (eq? (rule-nt r) v)) (grammar-rules g))] + [verts (append-map (lambda (r) (rule-xs r)) rules)] + [verts (filter non-terminal? verts)] + [verts (map non-terminal-sym verts)]) + (iter verts (cons v vis)))) + (dfs (grammar-start g) null)) + + +;; robi z gramatyki g gramatykę regularną +(define (cfg-optimize g) + (let* ([productive-nt (cfg-productive g)] + [productive-rules (filter (lambda (r) + (rule-productive? (rule-xs r) productive-nt)) + (grammar-rules g))] + [new-g (grammar (grammar-start g) productive-rules)] ; <----- nowa gramatyka, bez nieproduktywnych + [reachable-nt (cfg-reachable new-g)] ; reguł i symboli nieterminalnych + [res-g (grammar (grammar-start new-g) (filter ; <----- dobra gramatyka + (lambda (r) (member (rule-nt r) reachable-nt)) + (grammar-rules new-g)))]) + res-g)) + +(define (test) (cfg-optimize (make-cfg sample3))) + +;; Pokazanie że symbole nie muszą być racketowymi symbolami :) +(define (test2) (cfg-optimize + (grammar '() + (list (cons '() (list (terminal '()))) + (cons '() (list (terminal "(") (non-terminal '()) (terminal ")"))) + (cons '() (list (non-terminal '()) (non-terminal '()))))))) + \ No newline at end of file diff --git a/semestr-2/racket/egzamin/zad3a.bak b/semestr-2/racket/egzamin/zad3a.bak new file mode 100644 index 0000000..81570d0 --- /dev/null +++ b/semestr-2/racket/egzamin/zad3a.bak @@ -0,0 +1,298 @@ +#lang racket + +;; ZADANIE 3 +;; ========= + +;; Z gramatykami bezkontekstowymi spotkaliście się już na Wstępie do +;; Informatyki. W tym zadaniu potraktujemy je jako dane dla naszych +;; programów. + +;; Przypomnijmy, że gramatyka bezkontekstowa składa się z +;; · skończonego zbioru *symboli nieterminalnych* +;; · skończonego zbioru *symboli terminalnych* +;; · wybranego nieterminalnego symbolu startowego +;; · zbioru *produkcji*, czyli par symbol nieterminalny - lista +;; (potencjalnie pusta) symboli terminalnych lub nieterminalnych + +;; Słowo (ciąg symboli terminalnych) możemy wyprowadzić z gramatyki, +;; jeśli możemy zacząć od ciągu składającego się z symbolu startowego +;; możemy użyć skończonej liczby produkcji z gramatyki przepisując +;; symbol nieterminalny na ciąg symboli mu odpowiadających (w danej +;; produkcji). + + +;; Przykład: poprawne nawiasowania + +;; Gramatyka składa się z jednego symbolu nieterminalnego, S (który +;; jest oczywiście symbolem startowym) i dwóch symboli terminalnych +;; "(" i ")", i zawiera następujące produkcje (zwyczajowo zapisywane +;; przy użyciu strzałki; zwróćcie uwagę że pierwszy ciąg jest pusty!): +;; S -> +;; S -> SS +;; S -> (S) + +;; W często spotykanej, bardziej zwięzłej, postaci BNF moglibyśmy tę +;; gramatykę zapisać tak (dbając trochę bardziej o wizualne +;; oddzielenie symboli terminalnych i nieterminalnych): +;; S ::= "" | SS | "(" S ")" +;; Mamy tu te same produkcje, ale tylko raz zapisujemy każdą z +;; powtarzających się lewych stron. + +;; Z gramatyki tej da się wyprowadzić wszystkie poprawnie rozstawione +;; ciągi nawiasów — zobaczmy jak wyprowadzić (na jeden ze sposobów) +;; ciąg "(()())". Zaczynamy, jak zawsze, od słowa złożonego z symbolu +;; startowego i przepisujemy: +;; S -> (S) -> (SS) -> ((S)S) -> ((S)(S)) -> (()(S)) -> (()()) + + +;; Zadanie cz. 1 + +;; Zdefiniuj reprezentację gramatyki jako typu danych w +;; Rackecie. Warto zastanowić się co można uprościć względem definicji +;; matematycznej — w szczególności możemy założyć że dowolne napisy +;; (typu string) są ciągami symboli terminalnych, i że nie musimy +;; podawać jawnie zbioru nieterminali; również reprezentacja produkcji +;; gramatyki jako worka z parami wejście-wyjście niekoniecznie jest +;; najwygodniejsza. + +;; Uwaga: w tym zadaniu nie wymagamy definiowania składni konkretnej i +;; parsowania, ale bardzo polecamy wybranie jakiejś formy, żeby móc +;; sensownie przetestować swoje rozwiązanie! + + +;; "Optymalizacja" gramatyk + +;; Gramatyki, podobnie jak programy, piszą ludzie — może więc zdarzyć +;; się że znajdą się tam śmieci. Mogą one mieć dwojaką formę: symboli +;; nieterminalnych, których nie da się wyprowadzić z symbolu +;; startowego, lub symboli nieterminalnych z których nie da się +;; wyprowadzić żadnego słowa terminalnego (tj. niezawierającego +;; symboli nieterminalnych). Przykładowo, do naszej gramatyki +;; moglibyśmy dodać symbole P i Q, i produkcje: +;; S -> ")(" P +;; P -> PP "qed" +;; Q -> "abc" + +;; Mimo że nasza gramatyka wygląda inaczej na pierwszy rzut oka, tak +;; naprawdę się nie zmieniła: do symbolu Q nie możemy dojść z symbolu +;; S, a więc "abc" nigdy nie wystąpi w słowie wyprowadzalnym z +;; gramatyki. Analogicznie, z P nie da się wyprowadzić żadnego słowa, +;; które nie zawierałoby symbolu P — a zatem żadnego słowa złożonego +;; tylko z symboli terminalnych. To znaczy, że naszą gramatykę możemy +;; uprościć wyrzucając z niej symbole nieterminalne (i produkcje które +;; ich używają) do których nie da się dojść (tj. są *nieosiągalne*) i +;; te, z których nie da się ułożyć słowa terminalnego (tj. są +;; *nieproduktywne*). Jeśli z naszej rozszerzonej gramatyki wyrzucimy +;; takie symbole, dostaniemy oczywiście gramatykę początkową. + + +;; Zadanie cz. 2 + +;; Dla swojej reprezentacji gramatyki z poprzedniej części zadania +;; napisz dwie procedury: cfg-unreachable, znajdującą symbole +;; nieterminalne które są nieosiągalne z symbolu startowego, i +;; cfg-unproductive, znajdującą symbole nieterminalne które nie są +;; produktywne. Następnie użyj tych procedur żeby zdefiniować +;; procedurę cfg-optimize, która uprości daną gramatykę usuwając z +;; niej symbole nieosiągalne i nieproduktywne, a także odpowiednie +;; produkcje. + +;; Rozwiązanie wpisz w poniższym pliku, i opatrz komentarzem +;; opisującym wybraną reprezentację (i podjęte przy jej projektowaniu +;; decyzje), a także zaimplementowane w cz. 2. algorytmy. + + + + + + +;; Zadanie 1 + +;; Postanowiłem napisać parser, bo bez tego zadanie wydaje mi się dosyć ubogie +;; Składnia konkretna naszych gramatyk wygląda bardzo podobnie do zapisu +;; przedstawionego w treści zadania. +;; np. gramatyka nawiasowania będzie wyglądać następująco: +;; '(grammar S (S ::= "" -- SS -- "(" S ")")) +;; ale mogłaby wyglądać też tak: +;; '(grammar S (S ::= "") (S ::= SS -- "(" S ")")) +;; a np. ta nieciekawa gramatyka przedstawiona w treści zadania: +;; '(grammar S (S ::= "] [" P) (P ::= PP "qed") (Q ::= "abc")) +;; Zatem będzie to lista, która na pierwszym miejscu ma symbol 'grammar +;; na drugim miejscu ma symbol startowy +;; następnie następuje lista produkcji w formacie: +;; ::= +;; Zalety: +;; - rozróżnienie w składni konkretnej symboli nieterminalnych i terminalnych +;; przez użycie symboli i stringów pozwala na to, aby symbole terminalne nazywały się tak +;; jak terminalne, tj. "S" nie jest tym samym co 'S. +;; - składnia wydaje się bardzo wygodna w użyciu, nie ma też problemu, żeby później dopisać +;; dodatkowe produkcje dla jednego symbolu nieterminalnego, np. (S ::= "") (S ::= SS) +;; - parser jest łatwy w implementacji +;; Wady: +;; - symbole nieterminalne mogą składać się jedynie z jednego symbolu, zatem nie możemy robić ich +;; zbyt wiele + +;; Reprezentacja gramatyki: podczas parsowania gramatyki symbole i stringi wewnątrz produkcji +;; reprezentowane są przez struktury terminal oraz non-terminal. Cała gramatyka to +;; struktura dwuelementowa - pierwszym jest symbol startowy, a drugim lista par +;; Taka decyzja właśnie pozwoliła na to, że zaproponowana przeze mnie składania konkretna jest +;; bardzo prosta do sparsowania - wystarczy każdą produkcję podzielić ze względu na separator '-- +;; i do czegoś podobnego do środowisk dodawać po prostu odpowiednie pary. +;; dla przykładu taka gramatyka: +;; '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QS -- "[" Q "]")) +;; będzie reprezentowana następująco: +;; (grammar +;; 'S +;; (production +;; (list +;; (list 'S (terminal "")) +;; (list 'S (non-terminal 'S) (non-terminal 'S)) +;; (list 'S (terminal "(") (non-terminal 'S) (terminal ")")) +;; (list 'S (non-terminal 'Q)) +;; (list 'Q (terminal "")) +;; (list 'Q (non-terminal 'Q) (non-terminal 'S)) +;; (list 'Q (terminal "[") (non-terminal 'Q) (terminal "]"))))) +;; Prosze zauważyć, że np. SS zostało zamienione na dwa sąsiednie nieterminalne symbole S +;; (to właśnie powód, dlaczego symbole nieterminalne mogą być jedynie jednoznakowe). + +;; Zdecydowałem się dodać strukturę production, bo wtedy łatwo można na niej operować +;; pisząc funkcje production-add, czy production-lookup itp. + + +(struct non-terminal (sym) #:transparent) +(struct terminal (sym) #:transparent) +(struct grammar (start rules) #:transparent) + +(define SEPARATOR '--) + +(define (split-at-symb symb xs) + (define (iter left right) + (cond + [(null? right) (cons left null)] + [(eq? symb (car right)) (cons left (cdr right))] + [else (iter (cons (car right) left) (cdr right))])) + (let ([res (iter null xs)]) + (cons (reverse (car res)) (cdr res)))) + +(define (split-by-separator xs) + (let ([res (split-at-symb SEPARATOR xs)]) + (if (null? (cdr res)) + res + (cons (car res) (split-by-separator (cdr res)))))) + +(define (make-cfg q) + (cond + [(and (list? q) (eq? 'grammar (first q))) + (grammar (second q) (append-map make-cfg (cddr q)))] + [(and (list? q) (eq? '::= (second q))) + (let ([nt (first q)] + [rules (split-by-separator (cddr q))]) + (map (lambda (x) (cons nt x)) (map make-prod rules)))])) + +(define (symbol->list s) + (map string->symbol + (map string + (string->list (symbol->string s))))) + +(define (make-prod xs) + (cond + [(null? xs) null] + [(string? (car xs)) (cons (terminal (car xs)) (make-prod (cdr xs)))] + [(symbol? (car xs)) (append (map non-terminal (symbol->list (car xs))) (make-prod (cdr xs)))] + [else (error "Invalid syntax in production" xs)])) + + +(define sample '(S ::= "" -- SS -- "(" S ")")) +(define sample2 '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QQ -- "[" Q "]"))) +(define sample3 '(grammar S + (S ::= A B -- D E) + (A ::= "a") + (B ::= "b" C) + (C ::= "c") + (D ::= "d" F) + (E ::= "e") + (F ::= "f" D))) + +;; zadanie 2 + +;; korzystam z algorytmów przedstawionych w tej książce: +;; https://bit.ly/3ev0NUA, konkretnie te ze stron 50-51 +;; Pozwoliłem sobie trochę zmienić przeznaczenie funkcji cfg-unreachable oraz cfg-unproductive +;; Zamiast zwracać nieproduktywne nieterminale, zwracają właśnie produktywne +;; i analogicznie w tym drugim. Po prostu taka implementacja jest dla mnie wygodniejsza, +;; a jest bardzo nieistotną zmianą koncepcyjną. +;; Stąd zmiana nazwy na cfg-productive oraz cfg-reachable + +;; cfg-productive działa w ten sposób: +;; Jakiś nieterminal nazywamy produktywnym, jeśli ma co najmniej jedną produktywną zasadę +;; Jakąś zasadę nazywamy produktywną, jeśli składa się z terminali oraz produktywnych nieterminali +;; Jasno widać, że wg tej definicji te nieterminale, które nie są produktywne, są nieproduktywne +;; wg definicji zadania, a cała reszta jest produktwna. + +;; Algorytm znajdowania produktywnych nieterminali: +;; Mamy listę produktywnych nieterminali P, początkowo pustą +;; 1. Stwórz nową listę P' +;; 2. Przejdź po liście produkcji +;; -> jeśli dana produkcja jest produktywna (wg P), dodaj jej nieterminal do P' +;; 3. Jeśli P != P', zrób P := P' i wróć do 1. +;; 4. Zwróć P + +;; Fajne w tym algorytmie jest to, że jeśli mamy jakiś nieterminal, którego +;; używamy w jakiejś produkcji, ale ten nieterminal nie ma zdefiniowanej swojej produkcji +;; to nie zostanie oznaczony jako produktywny, co jest dla nas korzystne + +;; Algorytm znajdowania osiągalnych nieterminali: +;; Traktujemy nitereminale jak wierzchołki w grafie a zasady jako listy sąsiedztwa. +;; Terminale są liśćmi, a nieterminale węzłami. Robimy po prostu DFSa z nieterminalu +;; startowego i węzły do których dotrzemy oznaczamy jako osiągalne. + +;; Wg papierka który tutaj podałem, jeśli najpierw usuniemy nieproduktywne nieterminale, +;; a w następnej kolejności nieosiągalne, to nasza gramatyka stanie się regularna. + +(define (productive? p productive-nt) + (or (terminal? p) (member (non-terminal-sym p) productive-nt))) +(define (rule-productive? r productive-nt) + (andmap (lambda (x) (productive? x productive-nt)) r)) + +(define (cfg-productive g) + (define (find-productive-nt productive-nt rules) + (cond + [(null? rules) (remove-duplicates productive-nt)] + [(rule-productive? (cdar rules) productive-nt) + (find-productive-nt (cons (caar rules) productive-nt) (cdr rules))] + [else (find-productive-nt productive-nt (cdr rules))])) + (define (iter productive-nt) + (let ([new-prod-nt (find-productive-nt productive-nt (grammar-rules g))]) + (if (equal? productive-nt new-prod-nt) + productive-nt + (iter new-prod-nt)))) + (iter null)) + +(define (cfg-reachable g) + (define (iter verts vis) + (cond + [(null? verts) vis] + [(member (car verts) vis) (iter (cdr verts) vis)] + [else (iter (cdr verts) (dfs (car verts) vis))])) + (define (dfs v vis) + (display v) + (newline) + (let* ([rules (filter (lambda (r) (eq? (car r) v)) (grammar-rules g))] + [verts (append-map (lambda (r) (cdr r)) rules)] + [verts (filter non-terminal? verts)] + [verts (map non-terminal-sym verts)]) + (iter verts (cons v vis)))) + (dfs (grammar-start g) null)) + +(define (cfg-optimize g) + (let* ([productive-nt (cfg-productive g)] + [productive-rules (filter (lambda (r) + (rule-productive? (cdr r) productive-nt)) + (grammar-rules g))] + [new-g (grammar (grammar-start g) productive-rules)] + [reachable-nt (cfg-reachable new-g)] + [res-g (grammar (grammar-start new-g) (filter + (lambda (r) (member (car r) reachable-nt)) + (grammar-rules new-g)))]) + res-g)) + \ No newline at end of file diff --git a/semestr-2/racket/egzamin/zad3a.rkt b/semestr-2/racket/egzamin/zad3a.rkt new file mode 100644 index 0000000..eaa6645 --- /dev/null +++ b/semestr-2/racket/egzamin/zad3a.rkt @@ -0,0 +1,301 @@ +#lang racket + +;; ZADANIE 3 +;; ========= + +;; Z gramatykami bezkontekstowymi spotkaliście się już na Wstępie do +;; Informatyki. W tym zadaniu potraktujemy je jako dane dla naszych +;; programów. + +;; Przypomnijmy, że gramatyka bezkontekstowa składa się z +;; · skończonego zbioru *symboli nieterminalnych* +;; · skończonego zbioru *symboli terminalnych* +;; · wybranego nieterminalnego symbolu startowego +;; · zbioru *produkcji*, czyli par symbol nieterminalny - lista +;; (potencjalnie pusta) symboli terminalnych lub nieterminalnych + +;; Słowo (ciąg symboli terminalnych) możemy wyprowadzić z gramatyki, +;; jeśli możemy zacząć od ciągu składającego się z symbolu startowego +;; możemy użyć skończonej liczby produkcji z gramatyki przepisując +;; symbol nieterminalny na ciąg symboli mu odpowiadających (w danej +;; produkcji). + + +;; Przykład: poprawne nawiasowania + +;; Gramatyka składa się z jednego symbolu nieterminalnego, S (który +;; jest oczywiście symbolem startowym) i dwóch symboli terminalnych +;; "(" i ")", i zawiera następujące produkcje (zwyczajowo zapisywane +;; przy użyciu strzałki; zwróćcie uwagę że pierwszy ciąg jest pusty!): +;; S -> +;; S -> SS +;; S -> (S) + +;; W często spotykanej, bardziej zwięzłej, postaci BNF moglibyśmy tę +;; gramatykę zapisać tak (dbając trochę bardziej o wizualne +;; oddzielenie symboli terminalnych i nieterminalnych): +;; S ::= "" | SS | "(" S ")" +;; Mamy tu te same produkcje, ale tylko raz zapisujemy każdą z +;; powtarzających się lewych stron. + +;; Z gramatyki tej da się wyprowadzić wszystkie poprawnie rozstawione +;; ciągi nawiasów — zobaczmy jak wyprowadzić (na jeden ze sposobów) +;; ciąg "(()())". Zaczynamy, jak zawsze, od słowa złożonego z symbolu +;; startowego i przepisujemy: +;; S -> (S) -> (SS) -> ((S)S) -> ((S)(S)) -> (()(S)) -> (()()) + + +;; Zadanie cz. 1 + +;; Zdefiniuj reprezentację gramatyki jako typu danych w +;; Rackecie. Warto zastanowić się co można uprościć względem definicji +;; matematycznej — w szczególności możemy założyć że dowolne napisy +;; (typu string) są ciągami symboli terminalnych, i że nie musimy +;; podawać jawnie zbioru nieterminali; również reprezentacja produkcji +;; gramatyki jako worka z parami wejście-wyjście niekoniecznie jest +;; najwygodniejsza. + +;; Uwaga: w tym zadaniu nie wymagamy definiowania składni konkretnej i +;; parsowania, ale bardzo polecamy wybranie jakiejś formy, żeby móc +;; sensownie przetestować swoje rozwiązanie! + + +;; "Optymalizacja" gramatyk + +;; Gramatyki, podobnie jak programy, piszą ludzie — może więc zdarzyć +;; się że znajdą się tam śmieci. Mogą one mieć dwojaką formę: symboli +;; nieterminalnych, których nie da się wyprowadzić z symbolu +;; startowego, lub symboli nieterminalnych z których nie da się +;; wyprowadzić żadnego słowa terminalnego (tj. niezawierającego +;; symboli nieterminalnych). Przykładowo, do naszej gramatyki +;; moglibyśmy dodać symbole P i Q, i produkcje: +;; S -> ")(" P +;; P -> PP "qed" +;; Q -> "abc" + +;; Mimo że nasza gramatyka wygląda inaczej na pierwszy rzut oka, tak +;; naprawdę się nie zmieniła: do symbolu Q nie możemy dojść z symbolu +;; S, a więc "abc" nigdy nie wystąpi w słowie wyprowadzalnym z +;; gramatyki. Analogicznie, z P nie da się wyprowadzić żadnego słowa, +;; które nie zawierałoby symbolu P — a zatem żadnego słowa złożonego +;; tylko z symboli terminalnych. To znaczy, że naszą gramatykę możemy +;; uprościć wyrzucając z niej symbole nieterminalne (i produkcje które +;; ich używają) do których nie da się dojść (tj. są *nieosiągalne*) i +;; te, z których nie da się ułożyć słowa terminalnego (tj. są +;; *nieproduktywne*). Jeśli z naszej rozszerzonej gramatyki wyrzucimy +;; takie symbole, dostaniemy oczywiście gramatykę początkową. + + +;; Zadanie cz. 2 + +;; Dla swojej reprezentacji gramatyki z poprzedniej części zadania +;; napisz dwie procedury: cfg-unreachable, znajdującą symbole +;; nieterminalne które są nieosiągalne z symbolu startowego, i +;; cfg-unproductive, znajdującą symbole nieterminalne które nie są +;; produktywne. Następnie użyj tych procedur żeby zdefiniować +;; procedurę cfg-optimize, która uprości daną gramatykę usuwając z +;; niej symbole nieosiągalne i nieproduktywne, a także odpowiednie +;; produkcje. + +;; Rozwiązanie wpisz w poniższym pliku, i opatrz komentarzem +;; opisującym wybraną reprezentację (i podjęte przy jej projektowaniu +;; decyzje), a także zaimplementowane w cz. 2. algorytmy. + + + + + + +;; Zadanie 1 + +;; Postanowiłem napisać parser, bo bez tego zadanie wydaje mi się dosyć ubogie +;; Składnia konkretna naszych gramatyk wygląda bardzo podobnie do zapisu +;; przedstawionego w treści zadania. +;; np. gramatyka nawiasowania będzie wyglądać następująco: +;; '(grammar S (S ::= "" -- SS -- "(" S ")")) +;; ale mogłaby wyglądać też tak: +;; '(grammar S (S ::= "") (S ::= SS -- "(" S ")")) +;; a np. ta nieciekawa gramatyka przedstawiona w treści zadania: +;; '(grammar S (S ::= "] [" P) (P ::= PP "qed") (Q ::= "abc")) +;; Zatem będzie to lista, która na pierwszym miejscu ma symbol 'grammar +;; na drugim miejscu ma symbol startowy +;; następnie następuje lista produkcji w formacie: +;; ::= +;; Zalety: +;; - rozróżnienie w składni konkretnej symboli nieterminalnych i terminalnych +;; przez użycie symboli i stringów pozwala na to, aby symbole terminalne nazywały się tak +;; jak terminalne, tj. "S" nie jest tym samym co 'S. +;; - składnia wydaje się bardzo wygodna w użyciu, nie ma też problemu, żeby później dopisać +;; dodatkowe produkcje dla jednego symbolu nieterminalnego, np. (S ::= "") (S ::= SS) +;; - parser jest łatwy w implementacji +;; Wady: +;; - symbole nieterminalne mogą składać się jedynie z jednego symbolu, zatem nie możemy robić ich +;; zbyt wiele + +;; Reprezentacja gramatyki: podczas parsowania gramatyki symbole i stringi wewnątrz produkcji +;; reprezentowane są przez struktury terminal oraz non-terminal. Cała gramatyka to +;; struktura dwuelementowa - pierwszym jest symbol startowy, a drugim lista par +;; Taka decyzja właśnie pozwoliła na to, że zaproponowana przeze mnie składania konkretna jest +;; bardzo prosta do sparsowania - wystarczy każdą produkcję podzielić ze względu na separator '-- +;; i do czegoś podobnego do środowisk dodawać po prostu odpowiednie pary. +;; dla przykładu taka gramatyka: +;; '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QS -- "[" Q "]")) +;; będzie reprezentowana następująco: +;; (grammar +;; 'S +;; (production +;; (list +;; (list 'S (terminal "")) +;; (list 'S (non-terminal 'S) (non-terminal 'S)) +;; (list 'S (terminal "(") (non-terminal 'S) (terminal ")")) +;; (list 'S (non-terminal 'Q)) +;; (list 'Q (terminal "")) +;; (list 'Q (non-terminal 'Q) (non-terminal 'S)) +;; (list 'Q (terminal "[") (non-terminal 'Q) (terminal "]"))))) +;; Prosze zauważyć, że np. SS zostało zamienione na dwa sąsiednie nieterminalne symbole S +;; (to właśnie powód, dlaczego symbole nieterminalne mogą być jedynie jednoznakowe). + +;; Zdecydowałem się dodać strukturę production, bo wtedy łatwo można na niej operować +;; pisząc funkcje production-add, czy production-lookup itp. + + +(struct non-terminal (sym) #:transparent) +(struct terminal (sym) #:transparent) +(struct grammar (start rules) #:transparent) + +(define SEPARATOR '--) + +(define (make-cfg q) + (cond + [(and (list? q) (eq? 'grammar (first q))) + (grammar (second q) (append-map make-cfg (cddr q)))] + [(and (list? q) (eq? '::= (second q))) + (let ([nt (first q)] + [rules (split-by-separator (cddr q))]) + (map (lambda (x) (cons nt x)) (map make-rules rules)))] + [else (error "MAKE-CFG -- Parse error, unknown token" q)])) + +(define (make-cfg start rules) + (grammar start (make-rules rules))) + +(define (make-rules xs) + (cond + [(null? xs) null] + [(string? (car xs)) (cons (terminal (car xs)) (make-rules (cdr xs)))] + [(symbol? (car xs)) (append (map non-terminal (symbol->list (car xs))) (make-rules (cdr xs)))] + [else (error "Invalid syntax in production" xs)])) + +(define (split-at-symb symb xs) + (define (iter left right) + (cond + [(null? right) (cons left null)] + [(eq? symb (car right)) (cons left (cdr right))] + [else (iter (cons (car right) left) (cdr right))])) + (let ([res (iter null xs)]) + (cons (reverse (car res)) (cdr res)))) + +(define (split-by-separator xs) + (let ([res (split-at-symb SEPARATOR xs)]) + (if (null? (cdr res)) + res + (cons (car res) (split-by-separator (cdr res)))))) + +(define (symbol->list s) + (map string->symbol + (map string + (string->list (symbol->string s))))) + +(define sample '(S ::= "" -- SS -- "(" S ")")) +(define sample2 '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QQ -- "[" Q "]"))) +(define sample3 '(grammar S + (S ::= A B -- D E) + (A ::= "a") + (B ::= "b" C) + (C ::= "c") + (D ::= "d" F) + (E ::= "e") + (F ::= "f" D))) + +;; zadanie 2 + +;; korzystam z algorytmów przedstawionych w tej książce: +;; https://bit.ly/3ev0NUA, konkretnie te ze stron 50-51 +;; Pozwoliłem sobie trochę zmienić przeznaczenie funkcji cfg-unreachable oraz cfg-unproductive +;; Zamiast zwracać nieproduktywne nieterminale, zwracają właśnie produktywne +;; i analogicznie w tym drugim. Po prostu taka implementacja jest dla mnie wygodniejsza, +;; a jest bardzo nieistotną zmianą koncepcyjną. +;; Stąd zmiana nazwy na cfg-productive oraz cfg-reachable + +;; cfg-productive działa w ten sposób: +;; Jakiś nieterminal nazywamy produktywnym, jeśli ma co najmniej jedną produktywną zasadę +;; Jakąś zasadę nazywamy produktywną, jeśli składa się z terminali oraz produktywnych nieterminali +;; Jasno widać, że wg tej definicji te nieterminale, które nie są produktywne, są nieproduktywne +;; wg definicji zadania, a cała reszta jest produktwna. + +;; Algorytm znajdowania produktywnych nieterminali: +;; Mamy listę produktywnych nieterminali P, początkowo pustą +;; 1. Stwórz nową listę P' +;; 2. Przejdź po liście produkcji +;; -> jeśli dana produkcja jest produktywna (wg P), dodaj jej nieterminal do P' +;; 3. Jeśli P != P', zrób P := P' i wróć do 1. +;; 4. Zwróć P + +;; Fajne w tym algorytmie jest to, że jeśli mamy jakiś nieterminal, którego +;; używamy w jakiejś produkcji, ale ten nieterminal nie ma zdefiniowanej swojej produkcji +;; to nie zostanie oznaczony jako produktywny, co jest dla nas korzystne + +;; Algorytm znajdowania osiągalnych nieterminali: +;; Traktujemy nitereminale jak wierzchołki w grafie a zasady jako listy sąsiedztwa. +;; Terminale są liśćmi, a nieterminale węzłami. Robimy po prostu DFSa z nieterminalu +;; startowego i węzły do których dotrzemy oznaczamy jako osiągalne. + +;; Wg papierka który tutaj podałem, jeśli najpierw usuniemy nieproduktywne nieterminale, +;; a w następnej kolejności nieosiągalne, to nasza gramatyka stanie się regularna. + +(define (productive? p productive-nt) + (or (terminal? p) (member (non-terminal-sym p) productive-nt))) +(define (rule-productive? r productive-nt) + (andmap (lambda (x) (productive? x productive-nt)) r)) + +(define (cfg-productive g) + (define (find-productive-nt productive-nt rules) + (cond + [(null? rules) (remove-duplicates productive-nt)] + [(rule-productive? (cdar rules) productive-nt) + (find-productive-nt (cons (caar rules) productive-nt) (cdr rules))] + [else (find-productive-nt productive-nt (cdr rules))])) + (define (iter productive-nt) + (let ([new-prod-nt (find-productive-nt productive-nt (grammar-rules g))]) + (if (equal? productive-nt new-prod-nt) + productive-nt + (iter new-prod-nt)))) + (iter null)) + +(define (cfg-reachable g) + (define (iter verts vis) + (cond + [(null? verts) vis] + [(member (car verts) vis) (iter (cdr verts) vis)] + [else (iter (cdr verts) (dfs (car verts) vis))])) + (define (dfs v vis) + (display v) + (newline) + (let* ([rules (filter (lambda (r) (eq? (car r) v)) (grammar-rules g))] + [verts (append-map (lambda (r) (cdr r)) rules)] + [verts (filter non-terminal? verts)] + [verts (map non-terminal-sym verts)]) + (iter verts (cons v vis)))) + (dfs (grammar-start g) null)) + +(define (cfg-optimize g) + (let* ([productive-nt (cfg-productive g)] + [productive-rules (filter (lambda (r) + (rule-productive? (cdr r) productive-nt)) + (grammar-rules g))] + [new-g (grammar (grammar-start g) productive-rules)] + [reachable-nt (cfg-reachable new-g)] + [res-g (grammar (grammar-start new-g) (filter + (lambda (r) (member (car r) reachable-nt)) + (grammar-rules new-g)))]) + res-g)) + \ No newline at end of file diff --git a/semestr-2/racket/l10z18/solution.bak b/semestr-2/racket/l10z18/solution.bak new file mode 100644 index 0000000..02eb770 --- /dev/null +++ b/semestr-2/racket/l10z18/solution.bak @@ -0,0 +1,363 @@ +#lang racket + +;; Składnia abstrakcyjna +(struct const (val) #:transparent) +(struct var-expr (name) #:transparent) +(struct let-expr (id bound body) #:transparent) +(struct letrec-expr (id bound body) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct lambda-expr (arg body) #:transparent) +(struct app-expr (fun arg) #:transparent) + +(define (keyword s) + (member s '(true false null and or if cond else lambda let letrec))) + +(define (expr? e) + (match e + [(const n) (or (number? n) + (boolean? n) + (null? n) + (string? n))] + [(var-expr id) (symbol? id)] + [(let-expr x e1 e2 ) (and (symbol? x) + (expr? e1) + (expr? e2))] + [(letrec-expr x e1 e2) (and (symbol? x) + (expr? e1) + (expr? e2))] + [(if-expr eb et ef) (and (expr? eb) + (expr? et) + (expr? ef))] + [(lambda-expr x e) (and (symbol? x) + (expr? e))] + [(app-expr ef ea) (and (expr? ef) + (expr? ea))] + [_ false])) + +;; Parsowanie (zacytowane wyrażenie -> składnia abstrakcyjna) +(define (parse q) + (cond + [(number? q) (const q)] + [(string? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (const null)] + [(and (symbol? q) + (not (keyword q))) + (var-expr q)] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'let) + (list? (second q)) + (= (length (second q)) 2) + (symbol? (first (second q)))) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'letrec) + (list? (second q)) + (= (length (second q)) 2) + (symbol? (first (second q)))) + (letrec-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) + (pair? q) + (eq? (first q) 'and)) + (desugar-and (map parse (cdr q)))] + [(and (list? q) + (pair? q) + (eq? (first q) 'or)) + (desugar-or (map parse (cdr q)))] + [(and (list? q) + (>= (length q) 2) + (eq? (first q) 'cond)) + (parse-cond (cdr q))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'lambda) + (list? (second q)) + (andmap symbol? (second q)) + (cons? (second q))) + (desugar-lambda (second q) (parse (third q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-app (parse (first q)) (map parse (cdr q)))] + [else (error "Unrecognized token:" q)])) + +(define (parse-cond qs) + (match qs + [(list (list 'else q)) + (parse q)] + + [(list (list q _)) + (error "Expected 'else' in last branch but found:" q)] + + [(cons (list qb qt) qs) + (if-expr (parse qb) (parse qt) (parse-cond qs))])) + +(define (desugar-and es) + (if (null? es) + (const true) + (if-expr (car es) (desugar-and (cdr es)) (const false)))) + +(define (desugar-or es) + (if (null? es) + (const false) + (if-expr (car es) (const true) (desugar-or (cdr es))))) + +(define (desugar-lambda xs e) + (if (null? xs) + e + (lambda-expr (car xs) (desugar-lambda (cdr xs) e)))) + +(define (desugar-app e es) + (if (null? es) + e + (desugar-app (app-expr e (car es)) (cdr es)))) + +;; Środowiska +(struct blackhole ()) +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (mcons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) + (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (let ((v (mcdr (car xs)))) + (if (blackhole? v) + (error "Jumped into blackhole at" x) + v))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) +(define (env-update! x v env) + (define (assoc-update xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (set-mcdr! (car xs) v)] + [else (assoc-update (cdr xs))])) + (assoc-update (environ-xs env))) + +;; Domknięcia +(struct clo (arg body env)) + +;; Procedury wbudowane, gdzie +;; proc — Racketowa procedura którą należy uruchomić +;; args — lista dotychczas dostarczonych argumentów +;; pnum — liczba brakujących argumentów (> 0) +;; W ten sposób pozwalamy na częściową aplikację Racketowych procedur +;; — zauważmy że zawsze znamy pnum, bo w naszym języku arność +;; procedury jest ustalona z góry +(struct builtin (proc args pnum) #:transparent) + +;; Pomocnicze konstruktory procedur unarnych i binarnych +(define (builtin/1 p) + (builtin (lambda (x) (return (p x))) null 1)) +(define (builtin/2 p) + (builtin (lambda (x y) (return (p x y))) null 2)) + +;; Procedury +(define (proc? v) + (or (and (clo? v) + (symbol? (clo-arg v)) + (expr? (clo-body v)) + (environ? (clo-env v))) + (and (builtin? v) + (procedure? (builtin-proc v)) + (andmap value? (builtin-args v)) + (natural? (builtin-pnum v)) + (> (builtin-pnum v) 0)))) + +;; Definicja typu wartości +(define (value? v) + (or (number? v) + (boolean? v) + (null? v) + (string? v) + (and (cons? v) + (value? (car v)) + (value? (cdr v))) + (proc? v))) + +;; Środowisko początkowe (przypisujące procedury wbudowane ich nazwom) + +(define start-env + (foldl (lambda (p env) (env-add (first p) (second p) env)) + env-empty + `((+ ,(builtin/2 +)) + (- ,(builtin/2 -)) + (* ,(builtin/2 *)) + (/ ,(builtin/2 /)) + (~ ,(builtin/1 -)) + (< ,(builtin/2 <)) + (> ,(builtin/2 >)) + (= ,(builtin/2 =)) + (<= ,(builtin/2 <=)) + (>= ,(builtin/2 >=)) + (not ,(builtin/1 not)) + (cons ,(builtin/2 cons)) + (car ,(builtin/1 car)) + (cdr ,(builtin/1 cdr)) + (pair? ,(builtin/1 cons?)) + (null? ,(builtin/1 null?)) + (boolean? ,(builtin/1 boolean?)) + (number? ,(builtin/1 number?)) + (procedure? ,(builtin/1 (lambda (x) (or (clo? x) (builtin? x))))) + (string? ,(builtin/1 string?)) + (string-= ,(builtin/2 string=?)) + ;; and so on, and so on + ))) + +;; Efekt + +(define (effect-builtin/1 p) + (builtin p null 1)) +(define (effect-builtin/2 p) + (builtin p null 2)) + +(define effect-env + (foldl (lambda (p env) (env-add (first p) (second p) env)) + start-env + `((choose ,(effect-builtin/2 (lambda (x y) (list x y)))) + ))) + +(define (bind c k) (append-map k c)) + +(define (return x) (list x)) + +;; Ewaluator +(define (eval-env e env) + (match e + [(const n) + (return n)] + + [(var-expr x) + (return (env-lookup x env))] + + [(let-expr x e1 e2) + (bind (eval-env e1 env) (lambda (v1) + (eval-env e2 (env-add x v1 env))))] + + [(letrec-expr f ef eb) + (let ((new-env (env-add f (blackhole) env))) + (bind (eval-env ef new-env) (lambda (vf) + (env-update! f vf new-env) + (eval-env eb new-env))))] + + [(if-expr eb et ef) + (bind (eval-env eb env) (lambda (vb) + (match vb + [#t (eval-env et env)] + [#f (eval-env ef env)] + [v (error "Not a boolean:" v)])))] + + [(lambda-expr x e) + (return (clo x e env))] + + [(app-expr ef ea) + (bind (eval-env ef env) (lambda (vf) + (bind (eval-env ea env) (lambda (va) + (match vf + [(clo x e env) + (eval-env e (env-add x va env))] + [(builtin p args nm) + (if (= nm 1) + (apply p (reverse (cons va args))) + (return (builtin p (cons va args) (- nm 1))))] + [_ (error "Not a function:" vf)])))))])) + +(define (eval e) + (eval-env e effect-env)) + + +;; Przykladowy program + +(define PROGRAM + '((if (choose true false) (lambda (x) x) (lambda (x) (+ x 1))) (choose 1 2))) + + +;; REPL — interpreter interaktywny (read-eval-print loop) + +;; dodajemy składnię na wiązanie zmiennych "na poziomie interpretera" +;; i komendę wyjścia "exit" ... +(struct letrec-repl (id expr)) +(struct let-repl (id expr)) +(struct exit-repl ()) + +;; ... a także rozszerzoną procedurę parsującą te dodatkowe komendy i +;; prostą obsługę błędów +(define (parse-repl q) + (with-handlers + ([exn? (lambda (exn) + (display "Parse error! ") + (displayln (exn-message exn)))]) + (cond + [(eq? q 'exit) (exit-repl)] + [(and (list? q) + (= 3 (length q)) + (eq? (first q) 'let)) + (let-repl (second q) (parse (third q)))] + [(and (list? q) + (= 3 (length q)) + (eq? (first q) 'letrec)) + (letrec-repl (second q) (parse (third q)))] + [else (parse q)]))) + +;; trochę zamieszania w procedurze eval-repl wynika z rudymentarnej +;; obsługi błędów: nie chcemy żeby błąd w interpretowanym programie +;; kończył działanie całego interpretera! +(define (eval-repl c env continue) + (define (eval-with-err e env) + (with-handlers + ([exn? (lambda (exn) + (display "Error! ") + (displayln (exn-message exn)))]) + (eval-env e env))) + (match c + [(exit-repl) + (void)] + + [(let-repl x e) + (let ((v (eval-with-err e env))) + (if (void? v) + (continue env) + (continue (env-add x v env))))] + + [(letrec-repl f e) + (let* ((new-env (env-add f (blackhole) env)) + (v (eval-with-err e new-env))) + (if (void? v) + (continue env) + (begin + (env-update! f v new-env) + (continue new-env))))] + + [_ + (let ((v (eval-with-err c env))) + (unless (void? v) + (displayln v)) + (continue env))])) + +;; I w końcu interaktywny interpreter +(define (repl) + (define (go env) + (display "FUN > ") + (let* ((q (read)) + (c (parse-repl q))) + (if (void? c) + (go env) + (eval-repl c env go)))) + (displayln "Welcome to the FUN functional language interpreter!") + (go start-env)) \ No newline at end of file diff --git a/semestr-2/racket/l10z18/solution.rkt b/semestr-2/racket/l10z18/solution.rkt new file mode 100644 index 0000000..7adcea4 --- /dev/null +++ b/semestr-2/racket/l10z18/solution.rkt @@ -0,0 +1,409 @@ +#lang racket + +;; Składnia abstrakcyjna +(struct const (val) #:transparent) +(struct var-expr (name) #:transparent) +(struct let-expr (id bound body) #:transparent) +(struct letrec-expr (id bound body) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct lambda-expr (arg body) #:transparent) +(struct app-expr (fun arg) #:transparent) + +(provide parse eval norm) + +(define (keyword s) + (member s '(true false null and or if cond else lambda let letrec))) + +(define (expr? e) + (match e + [(const n) (or (number? n) + (boolean? n) + (null? n) + (string? n))] + [(var-expr id) (symbol? id)] + [(let-expr x e1 e2 ) (and (symbol? x) + (expr? e1) + (expr? e2))] + [(letrec-expr x e1 e2) (and (symbol? x) + (expr? e1) + (expr? e2))] + [(if-expr eb et ef) (and (expr? eb) + (expr? et) + (expr? ef))] + [(lambda-expr x e) (and (symbol? x) + (expr? e))] + [(app-expr ef ea) (and (expr? ef) + (expr? ea))] + [_ false])) + +;; Parsowanie (zacytowane wyrażenie -> składnia abstrakcyjna) +(define (parse q) + (cond + [(number? q) (const q)] + [(string? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (const null)] + [(and (symbol? q) + (not (keyword q))) + (var-expr q)] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'let) + (list? (second q)) + (= (length (second q)) 2) + (symbol? (first (second q)))) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'letrec) + (list? (second q)) + (= (length (second q)) 2) + (symbol? (first (second q)))) + (letrec-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) + (pair? q) + (eq? (first q) 'and)) + (desugar-and (map parse (cdr q)))] + [(and (list? q) + (pair? q) + (eq? (first q) 'or)) + (desugar-or (map parse (cdr q)))] + [(and (list? q) + (>= (length q) 2) + (eq? (first q) 'cond)) + (parse-cond (cdr q))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'lambda) + (list? (second q)) + (andmap symbol? (second q)) + (cons? (second q))) + (desugar-lambda (second q) (parse (third q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-app (parse (first q)) (map parse (cdr q)))] + [else (error "Unrecognized token:" q)])) + +(define (parse-cond qs) + (match qs + [(list (list 'else q)) + (parse q)] + + [(list (list q _)) + (error "Expected 'else' in last branch but found:" q)] + + [(cons (list qb qt) qs) + (if-expr (parse qb) (parse qt) (parse-cond qs))])) + +(define (desugar-and es) + (if (null? es) + (const true) + (if-expr (car es) (desugar-and (cdr es)) (const false)))) + +(define (desugar-or es) + (if (null? es) + (const false) + (if-expr (car es) (const true) (desugar-or (cdr es))))) + +(define (desugar-lambda xs e) + (if (null? xs) + e + (lambda-expr (car xs) (desugar-lambda (cdr xs) e)))) + +(define (desugar-app e es) + (if (null? es) + e + (desugar-app (app-expr e (car es)) (cdr es)))) + +;; Środowiska +(struct blackhole ()) +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (mcons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) + (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (let ((v (mcdr (car xs)))) + (if (blackhole? v) + (error "Jumped into blackhole at" x) + v))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) +(define (env-update! x v env) + (define (assoc-update xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (set-mcdr! (car xs) v)] + [else (assoc-update (cdr xs))])) + (assoc-update (environ-xs env))) + +;; Domknięcia +(struct clo (arg body env)) + +;; Procedury wbudowane, gdzie +;; proc — Racketowa procedura którą należy uruchomić +;; args — lista dotychczas dostarczonych argumentów +;; pnum — liczba brakujących argumentów (> 0) +;; W ten sposób pozwalamy na częściową aplikację Racketowych procedur +;; — zauważmy że zawsze znamy pnum, bo w naszym języku arność +;; procedury jest ustalona z góry +(struct builtin (proc args pnum) #:transparent) + +;; Pomocnicze konstruktory procedur unarnych i binarnych +(define (builtin/1 p) + (builtin (lambda (x) (return (p x))) null 1)) +(define (builtin/2 p) + (builtin (lambda (x y) (return (p x y))) null 2)) + +;; Procedury +(define (proc? v) + (or (and (clo? v) + (symbol? (clo-arg v)) + (expr? (clo-body v)) + (environ? (clo-env v))) + (and (builtin? v) + (procedure? (builtin-proc v)) + (andmap value? (builtin-args v)) + (natural? (builtin-pnum v)) + (> (builtin-pnum v) 0)))) + +;; Definicja typu wartości +(define (value? v) + (or (number? v) + (boolean? v) + (null? v) + (string? v) + (and (cons? v) + (value? (car v)) + (value? (cdr v))) + (proc? v))) + +;; Środowisko początkowe (przypisujące procedury wbudowane ich nazwom) + +(define start-env + (foldl (lambda (p env) (env-add (first p) (second p) env)) + env-empty + `((+ ,(builtin/2 +)) + (- ,(builtin/2 -)) + (* ,(builtin/2 *)) + (/ ,(builtin/2 /)) + (~ ,(builtin/1 -)) + (< ,(builtin/2 <)) + (> ,(builtin/2 >)) + (= ,(builtin/2 =)) + (<= ,(builtin/2 <=)) + (>= ,(builtin/2 >=)) + (not ,(builtin/1 not)) + (cons ,(builtin/2 cons)) + (car ,(builtin/1 car)) + (cdr ,(builtin/1 cdr)) + (pair? ,(builtin/1 cons?)) + (null? ,(builtin/1 null?)) + (boolean? ,(builtin/1 boolean?)) + (number? ,(builtin/1 number?)) + (procedure? ,(builtin/1 (lambda (x) (or (clo? x) (builtin? x))))) + (string? ,(builtin/1 string?)) + (string-= ,(builtin/2 string=?)) + ;; and so on, and so on + ))) + +;; Efekt + +(define (effect-builtin/1 p) + (builtin p null 1)) +(define (effect-builtin/2 p) + (builtin p null 2)) +(define (effect-builtin/3 p) + (builtin p null 3)) + + +(define effect-env + (foldl (lambda (p env) (env-add (first p) (second p) env)) + start-env + `((flip ,(effect-builtin/3 (lambda (p x y) (list (cons p x) (cons (- 1 p) y))))) + (uniform ,(effect-builtin/1 (lambda (x) (let ((l (/ 1 (length x)))) + (map (lambda (x) (cons l x)) x))))) + ))) + +;; c to lista par (pstwo, wartość) +;; k to funkcja która przyjmuje wartość i coś z nią robi sobie i zwraca listę par (pstwo, wartość) + +(define (bind c k) + (append-map + (lambda (x) (let ((pstwo (car x)) + (val (cdr x))) + (map + (lambda (x) (cons (* pstwo (car x)) (cdr x))) + (k (cdr x))))) + c)) + +(define (return x) (list (cons 1 x))) + +;; Ewaluator +(define (eval-env e env) + (match e + [(const n) + (return n)] + + [(var-expr x) + (return (env-lookup x env))] + + [(let-expr x e1 e2) + (bind (eval-env e1 env) (lambda (v1) + (eval-env e2 (env-add x v1 env))))] + + [(letrec-expr f ef eb) + (let ((new-env (env-add f (blackhole) env))) + (bind (eval-env ef new-env) (lambda (vf) + (env-update! f vf new-env) + (eval-env eb new-env))))] + + [(if-expr eb et ef) + (bind (eval-env eb env) (lambda (vb) + (match vb + [#t (eval-env et env)] + [#f (eval-env ef env)] + [v (error "Not a boolean:" v)])))] + + [(lambda-expr x e) + (return (clo x e env))] + + [(app-expr ef ea) + (bind (eval-env ef env) (lambda (vf) + (bind (eval-env ea env) (lambda (va) + (match vf + [(clo x e env) + (eval-env e (env-add x va env))] + [(builtin p args nm) + (if (= nm 1) + (apply p (reverse (cons va args))) + (return (builtin p (cons va args) (- nm 1))))] + [_ (error "Not a function:" vf)])))))])) + +(define (eval e) + (eval-env e effect-env)) + + +;; Przykladowy program + +(define PROGRAM + '((if (choose true false) (lambda (x) x) (lambda (x) (+ x 1))) (choose 1 2))) + + +;; REPL — interpreter interaktywny (read-eval-print loop) + +;; dodajemy składnię na wiązanie zmiennych "na poziomie interpretera" +;; i komendę wyjścia "exit" ... +(struct letrec-repl (id expr)) +(struct let-repl (id expr)) +(struct exit-repl ()) + +;; ... a także rozszerzoną procedurę parsującą te dodatkowe komendy i +;; prostą obsługę błędów +(define (parse-repl q) + (with-handlers + ([exn? (lambda (exn) + (display "Parse error! ") + (displayln (exn-message exn)))]) + (cond + [(eq? q 'exit) (exit-repl)] + [(and (list? q) + (= 3 (length q)) + (eq? (first q) 'let)) + (let-repl (second q) (parse (third q)))] + [(and (list? q) + (= 3 (length q)) + (eq? (first q) 'letrec)) + (letrec-repl (second q) (parse (third q)))] + [else (parse q)]))) + +;; trochę zamieszania w procedurze eval-repl wynika z rudymentarnej +;; obsługi błędów: nie chcemy żeby błąd w interpretowanym programie +;; kończył działanie całego interpretera! +(define (eval-repl c env continue) + (define (eval-with-err e env) + (with-handlers + ([exn? (lambda (exn) + (display "Error! ") + (displayln (exn-message exn)))]) + (eval-env e env))) + (match c + [(exit-repl) + (void)] + + [(let-repl x e) + (let ((v (eval-with-err e env))) + (if (void? v) + (continue env) + (continue (env-add x v env))))] + + [(letrec-repl f e) + (let* ((new-env (env-add f (blackhole) env)) + (v (eval-with-err e new-env))) + (if (void? v) + (continue env) + (begin + (env-update! f v new-env) + (continue new-env))))] + + [_ + (let ((v (eval-with-err c env))) + (unless (void? v) + (displayln v)) + (continue env))])) + +;; I w końcu interaktywny interpreter +(define (repl) + (define (go env) + (display "FUN > ") + (let* ((q (read)) + (c (parse-repl q))) + (if (void? c) + (go env) + (eval-repl c env go)))) + (displayln "Welcome to the FUN functional language interpreter!") + (go start-env)) + + +(define prog '(if (flip 0.3 true false) "wygrana" "przegrana")) + + +(define (norm xs) + (define sum (lambda (xs) (foldl + 0 xs))) + (define carlist (lambda (xs) (map car xs))) + (define (iter xs res) + (cond + [(null? xs) res] + [(member (cdar xs) (map cdr res)) (iter (cdr xs) res)] + [else (let* ((cur (cdar xs)) + (pstwa (filter (lambda (x) (equal? (cdr x) cur)) xs))) + (iter (cdr xs) (cons (cons (sum (carlist pstwa)) cur) res)))])) + (iter xs null)) + + +(define DICE-MANY + '(letrec [from-to (lambda (x n) + (cons x + (if (= x n) + null + (from-to (+ 1 x) n))))] + (let [dice (lambda (x) (uniform (from-to 1 6)))] + (letrec [dice-many (lambda (n) (if (= n 0) + 0 + (+ (dice 0) (dice-many (- n 1)))))] + (dice-many (dice 0)))))) \ No newline at end of file diff --git a/semestr-2/racket/l11/rozw.bak b/semestr-2/racket/l11/rozw.bak new file mode 100644 index 0000000..cda82ce --- /dev/null +++ b/semestr-2/racket/l11/rozw.bak @@ -0,0 +1,2 @@ +#lang racket + diff --git a/semestr-2/racket/l11/rozw.rkt b/semestr-2/racket/l11/rozw.rkt new file mode 100644 index 0000000..e45e403 --- /dev/null +++ b/semestr-2/racket/l11/rozw.rkt @@ -0,0 +1,776 @@ +#reader(lib"read.ss""wxme")WXME0109 ## +#| + This file uses the GRacket editor format. + Open this file in DrRacket version 7.6 or later to read it. + + Most likely, it was created by saving a program in DrRacket, + and it probably contains a program with non-text elements + (such as images or comment boxes). + + http://racket-lang.org/ +|# + 33 7 #"wxtext\0" +3 1 6 #"wxtab\0" +1 1 8 #"wximage\0" +2 0 8 #"wxmedia\0" +4 1 34 #"(lib \"syntax-browser.ss\" \"mrlib\")\0" +1 0 36 #"(lib \"cache-image-snip.ss\" \"mrlib\")\0" +1 0 68 +(0 + #"((lib \"image-core.ss\" \"mrlib\") (lib \"image-core-wxme.rkt\" \"mr" + #"lib\"))\0" +) 1 0 16 #"drscheme:number\0" +3 0 44 #"(lib \"number-snip.ss\" \"drscheme\" \"private\")\0" +1 0 36 #"(lib \"comment-snip.ss\" \"framework\")\0" +1 0 93 +(1 + #"((lib \"collapsed-snipclass.ss\" \"framework\") (lib \"collapsed-sni" + #"pclass-wxme.ss\" \"framework\"))\0" +) 0 0 43 #"(lib \"collapsed-snipclass.ss\" \"framework\")\0" +0 0 19 #"drscheme:sexp-snip\0" +0 0 29 #"drscheme:bindings-snipclass%\0" +1 0 101 +(2 + #"((lib \"ellipsis-snip.rkt\" \"drracket\" \"private\") (lib \"ellipsi" + #"s-snip-wxme.rkt\" \"drracket\" \"private\"))\0" +) 2 0 88 +(3 + #"((lib \"pict-snip.rkt\" \"drracket\" \"private\") (lib \"pict-snip.r" + #"kt\" \"drracket\" \"private\"))\0" +) 0 0 55 +#"((lib \"snip.rkt\" \"pict\") (lib \"snip-wxme.rkt\" \"pict\"))\0" +1 0 34 #"(lib \"bullet-snip.rkt\" \"browser\")\0" +0 0 25 #"(lib \"matrix.ss\" \"htdp\")\0" +1 0 22 #"drscheme:lambda-snip%\0" +1 0 29 #"drclickable-string-snipclass\0" +0 0 26 #"drracket:spacer-snipclass\0" +0 0 57 +#"(lib \"hrule-snip.rkt\" \"macro-debugger\" \"syntax-browser\")\0" +1 0 26 #"drscheme:pict-value-snip%\0" +0 0 45 #"(lib \"image-snipr.ss\" \"slideshow\" \"private\")\0" +1 0 38 #"(lib \"pict-snipclass.ss\" \"slideshow\")\0" +2 0 55 #"(lib \"vertical-separator-snip.ss\" \"stepper\" \"private\")\0" +1 0 18 #"drscheme:xml-snip\0" +1 0 31 #"(lib \"xml-snipclass.ss\" \"xml\")\0" +1 0 21 #"drscheme:scheme-snip\0" +2 0 34 #"(lib \"scheme-snipclass.ss\" \"xml\")\0" +1 0 10 #"text-box%\0" +1 0 32 #"(lib \"text-snipclass.ss\" \"xml\")\0" +1 0 1 6 #"wxloc\0" + 0 0 81 0 1 #"\0" +0 75 1 #"\0" +0 10 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 0 9 +#"Standard\0" +0 75 12 #"Courier New\0" +0 16 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 -1 -1 2 24 +#"framework:default-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 15 +#"text:ports out\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 34 119 34 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1 +-1 2 15 #"text:ports err\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 17 +#"text:ports value\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 +-1 2 27 #"Matching Parenthesis Style\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 +-1 2 1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 37 +#"framework:syntax-color:scheme:symbol\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +38 #"framework:syntax-color:scheme:keyword\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 +38 #"framework:syntax-color:scheme:comment\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 204 221 170 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 37 +#"framework:syntax-color:scheme:string\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +35 #"framework:syntax-color:scheme:text\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +39 #"framework:syntax-color:scheme:constant\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 49 +#"framework:syntax-color:scheme:hash-colon-keyword\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +42 #"framework:syntax-color:scheme:parenthesis\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 178 178 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36 +#"framework:syntax-color:scheme:error\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 36 +#"framework:syntax-color:scheme:other\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +16 #"Misspelled Text\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 +38 #"drracket:check-syntax:lexically-bound\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 50 163 255 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 28 +#"drracket:check-syntax:set!d\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2 +37 #"drracket:check-syntax:unused-require\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2 +36 #"drracket:check-syntax:free-variable\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 31 +#"drracket:check-syntax:imported\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 166 0 255 0 0 0 -1 -1 2 47 +#"drracket:check-syntax:my-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 192 203 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 50 +#"drracket:check-syntax:their-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 50 205 50 0 0 0 -1 -1 2 48 +#"drracket:check-syntax:unk-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 +49 #"drracket:check-syntax:both-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 240 230 140 0 0 0 -1 -1 2 +26 #"plt:htdp:test-coverage-on\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 2 27 +#"plt:htdp:test-coverage-off\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 205 92 92 0 0 0 -1 -1 4 1 +#"\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 4 4 #"XML\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 2 37 #"plt:module-language:test-coverage-on\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2 +38 #"plt:module-language:test-coverage-off\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 205 92 92 0 0 0 -1 -1 0 36 +#"mrlib/syntax-browser:subtitle-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 100 149 237 0 0 0 -1 -1 0 +42 #"mrlib/syntax-browser:focused-syntax-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 50 205 50 0 0 0 -1 -1 4 1 +#"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 4 1 #"\0" +0 -1 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 191 255 0 0 0 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 191 255 0 0 0 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 152 251 152 0 0 0 +-1 -1 4 32 #"widget.rkt::browser-text% basic\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 4 59 +#"macro-debugger/syntax-browser/properties color-text% basic\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 58 1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 190 190 190 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 200 0 0 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 255 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 185 220 113 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 155 255 155 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 116 116 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 18 67 155 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 30 70 190 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 75 135 185 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 176 208 208 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 116 116 255 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 200 125 255 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 143 15 223 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 165 0 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 141 19 5 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 244 194 71 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 127 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 86 86 86 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 255 255 255 0 31 31 -1 -1 +4 1 #"\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 255 255 0 -1 -1 + 0 475 0 28 3 12 #"#lang racket" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 7 #"require" +0 0 24 3 1 #" " +0 0 14 3 15 #"racket/contract" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 17 3 13 #";;; Zadanie 1" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 8 #"suffixes" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 3 #") (" +0 0 14 3 6 #"listof" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 5 #")))) " +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 2 #"if" +0 0 24 3 2 #" (" +0 0 14 3 5 #"null?" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 6 #" " +0 0 14 3 4 #"null" +0 0 24 29 1 #"\n" +0 0 24 3 7 #" (" +0 0 14 3 4 #"cons" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 2 #" (" +0 0 14 3 8 #"suffixes" +0 0 24 3 2 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 5 #")))))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 17 3 13 #";;; Zadanie 2" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 8 #"sublists" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 3 #") (" +0 0 14 3 6 #"listof" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 6 #")))) " +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 2 #"if" +0 0 24 3 2 #" (" +0 0 14 3 5 #"null?" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 7 #" (" +0 0 14 3 4 #"list" +0 0 24 3 1 #" " +0 0 14 3 4 #"null" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 7 #" (" +0 0 14 3 10 #"append-map" +0 0 24 29 1 #"\n" +0 0 24 3 8 #" (" +0 0 15 3 6 #"lambda" +0 0 24 3 2 #" (" +0 0 14 3 2 #"ys" +0 0 24 3 3 #") (" +0 0 14 3 4 #"list" +0 0 24 3 2 #" (" +0 0 14 3 4 #"cons" +0 0 24 3 2 #" (" +0 0 14 3 3 #"car" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 2 #") " +0 0 14 3 2 #"ys" +0 0 24 3 2 #") " +0 0 14 3 2 #"ys" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 8 #" (" +0 0 14 3 8 #"sublists" +0 0 24 3 2 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 5 #")))))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 17 3 13 #";;; Zadanie 3" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 17 #"autistic-identity" +0 0 24 3 1 #" " +0 0 14 3 1 #"x" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 2 #" " +0 0 14 3 1 #"x" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 6 #"create" +0 0 24 3 1 #" " +0 0 14 3 4 #"comb" +0 0 24 3 1 #" " +0 0 14 3 4 #"next" +0 0 24 3 1 #" " +0 0 14 3 3 #"beg" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 3 #") (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 2 #") " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 4 #" ((" +0 0 14 3 4 #"comb" +0 0 24 3 2 #" (" +0 0 14 3 4 #"next" +0 0 24 3 1 #" " +0 0 14 3 3 #"beg" +0 0 24 3 2 #") " +0 0 14 3 3 #"beg" +0 0 24 3 3 #")))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 7 #"compose" +0 0 24 3 1 #" " +0 0 14 3 2 #"bc" +0 0 24 3 1 #" " +0 0 14 3 2 #"ab" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 3 #") (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 3 #") (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 3 #")))" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 15 3 6 #"lambda" +0 0 24 3 2 #" (" +0 0 14 3 1 #"x" +0 0 24 3 3 #") (" +0 0 14 3 2 #"bc" +0 0 24 3 2 #" (" +0 0 14 3 2 #"ab" +0 0 24 3 1 #" " +0 0 14 3 1 #"x" +0 0 24 3 4 #"))))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 5 #"ident" +0 0 24 3 1 #" " +0 0 14 3 1 #"f" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 2 #") " +0 0 14 3 1 #"a" +0 0 24 3 2 #") " +0 0 14 3 1 #"a" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 1 #"f" +0 0 24 3 1 #" " +0 0 14 3 8 #"identity" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 17 3 13 #";;; Zadanie 4" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 12 #"broken-contr" +0 0 24 3 1 #" " +0 0 14 3 1 #"x" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 12 #"broken-contr" +0 0 24 3 1 #" " +0 0 14 3 1 #"x" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 17 3 13 #";;; Zadanie 5" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 9 #"foldl-map" +0 0 24 3 1 #" " +0 0 14 3 1 #"f" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"F" +0 0 24 3 1 #" " +0 0 14 3 1 #"A" +0 0 24 3 1 #" " +0 0 14 3 1 #"L" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"L" +0 0 24 3 1 #" " +0 0 14 3 1 #"A" +0 0 24 3 2 #" (" +0 0 14 3 6 #"cons/c" +0 0 24 3 1 #" " +0 0 14 3 1 #"F" +0 0 24 3 1 #" " +0 0 14 3 1 #"A" +0 0 24 3 3 #")) " +0 0 14 3 1 #"A" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"L" +0 0 24 3 3 #") (" +0 0 14 3 6 #"cons/c" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"F" +0 0 24 3 2 #") " +0 0 14 3 1 #"A" +0 0 24 3 4 #"))) " +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 15 3 6 #"define" +0 0 24 3 2 #" (" +0 0 14 3 2 #"it" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #" " +0 0 14 3 2 #"ys" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 5 #" (" +0 0 14 3 2 #"if" +0 0 24 3 2 #" (" +0 0 14 3 5 #"null?" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 14 3 4 #"cons" +0 0 24 3 2 #" (" +0 0 14 3 7 #"reverse" +0 0 24 3 1 #" " +0 0 14 3 2 #"ys" +0 0 24 3 2 #") " +0 0 14 3 1 #"a" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 15 3 3 #"let" +0 0 24 3 3 #" [(" +0 0 14 3 1 #"p" +0 0 24 3 2 #" (" +0 0 14 3 1 #"f" +0 0 24 3 2 #" (" +0 0 14 3 3 #"car" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 2 #") " +0 0 14 3 1 #"a" +0 0 24 3 3 #"))]" +0 0 24 29 1 #"\n" +0 0 24 3 11 #" (" +0 0 14 3 2 #"it" +0 0 24 3 2 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 1 #"p" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 15 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 15 #" (" +0 0 14 3 4 #"cons" +0 0 24 3 2 #" (" +0 0 14 3 3 #"car" +0 0 24 3 1 #" " +0 0 14 3 1 #"p" +0 0 24 3 2 #") " +0 0 14 3 2 #"ys" +0 0 24 3 5 #")))))" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 2 #"it" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #" " +0 0 14 3 4 #"null" +0 0 24 3 2 #"))" +0 0 diff --git a/semestr-2/racket/l11/solution.bak b/semestr-2/racket/l11/solution.bak new file mode 100644 index 0000000..3ae167a --- /dev/null +++ b/semestr-2/racket/l11/solution.bak @@ -0,0 +1,18 @@ +#lang racket + +(require racket/contract) + +(provide (contract-out [square square/c])) +(provide square/c) + +(define square/c (-> number? (not/c negative?))) + +(define (square x) (* x x)) + + +(define with-labels/c (parametric->/c [a b] (-> (-> a b)) + +(define (with-labels f xs) + (if (null? xs) + null + (cons (list (f (car xs)) (car xs)) (with-labels f (cdr xs))))) \ No newline at end of file diff --git a/semestr-2/racket/l11/solution.rkt b/semestr-2/racket/l11/solution.rkt new file mode 100644 index 0000000..55e4ba6 --- /dev/null +++ b/semestr-2/racket/l11/solution.rkt @@ -0,0 +1,35 @@ +#lang racket + +(provide (contract-out + [with-labels with-labels/c] + [foldr-map foldr-map/c] + [pair-from pair-from/c])) +(provide with-labels/c foldr-map/c pair-from/c) + + +(define with-labels/c (parametric->/c [a b] (-> (-> a b) (listof a) (listof (cons/c b (cons/c a null?)))))) + +(define (with-labels f xs) + (if (null? xs) + null + (cons (list (f (car xs)) (car xs)) (with-labels f (cdr xs))))) + + + +(define foldr-map/c (parametric->/c [x a f] (-> (-> x a (cons/c f a)) a (listof x) (cons/c (listof f) a)))) + +(define (foldr-map f a xs) + (define (it a xs ys) + (if (null? xs) + (cons ys a) + (let [(p (f (car xs) a))] + (it (cdr p) + (cdr xs) + (cons (car p) ys))))) + (it a (reverse xs) null)) + + +(define pair-from/c (parametric->/c [x fx gx] (-> (-> x fx) (-> x gx) (-> x (cons/c fx gx))))) + +(define (pair-from f g) + (lambda (x) (cons (f x) (g x)))) \ No newline at end of file diff --git a/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep b/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep new file mode 100644 index 0000000..6d38ce0 --- /dev/null +++ b/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep @@ -0,0 +1 @@ +("7.6" racket ("b51d3a36a64d34c7978bfc22f2a5fe674cee1cb6" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zo b/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zo new file mode 100644 index 0000000..ef91f9a Binary files /dev/null and b/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zo differ diff --git a/semestr-2/racket/l11z20/graph.bak b/semestr-2/racket/l11z20/graph.bak new file mode 100644 index 0000000..9f4d79d --- /dev/null +++ b/semestr-2/racket/l11z20/graph.bak @@ -0,0 +1,97 @@ +#lang racket + +(provide bag^ graph^ simple-graph@ graph-search^ graph-search@) + +;; sygnatura dla struktury danych +(define-signature bag^ + ((contracted + [bag? (-> any/c boolean?)] + [empty-bag (and/c bag? bag-empty?)] + [bag-empty? (-> bag? boolean?)] + [bag-insert (-> bag? any/c (and/c bag? (not/c bag-empty?)))] + [bag-peek (-> (and/c bag? (not/c bag-empty?)) any/c)] + [bag-remove (-> (and/c bag? (not/c bag-empty?)) bag?)]))) + +;; sygnatura: grafy +(define-signature graph^ + ((contracted + [graph (-> list? (listof edge?) graph?)] + [graph? (-> any/c boolean?)] + [graph-nodes (-> graph? list?)] + [graph-edges (-> graph? (listof edge?))] + [edge (-> any/c any/c edge?)] + [edge? (-> any/c boolean?)] + [edge-start (-> edge? any/c)] + [edge-end (-> edge? any/c)] + [has-node? (-> graph? any/c boolean?)] + [outnodes (-> graph? any/c list?)] + [remove-node (-> graph? any/c graph?)] + ))) + +;; prosta implementacja grafów +(define-unit simple-graph@ + (import) + (export graph^) + + (define (graph? g) + (and (list? g) + (eq? (length g) 3) + (eq? (car g) 'graph))) + + (define (edge? e) + (and (list? e) + (eq? (length e) 3) + (eq? (car e) 'edge))) + + (define (graph-nodes g) (cadr g)) + + (define (graph-edges g) (caddr g)) + + (define (graph n e) (list 'graph n e)) + + (define (edge n1 n2) (list 'edge n1 n2)) + + (define (edge-start e) (cadr e)) + + (define (edge-end e) (caddr e)) + + (define (has-node? g n) (not (not (member n (graph-nodes g))))) + + (define (outnodes g n) + (filter-map + (lambda (e) + (and (eq? (edge-start e) n) + (edge-end e))) + (graph-edges g))) + + (define (remove-node g n) + (graph + (remove n (graph-nodes g)) + (filter + (lambda (e) + (not (eq? (edge-start e) n))) + (graph-edges g))))) + +;; sygnatura dla przeszukiwania grafu +(define-signature graph-search^ + (search)) + +;; implementacja przeszukiwania grafu +;; uzależniona od implementacji grafu i struktury danych +(define-unit graph-search@ + (import bag^ graph^) + (export graph-search^) + (define (search g n) + (define (it g b l) + (cond + [(bag-empty? b) (reverse l)] + [(has-node? g (bag-peek b)) + (it (remove-node g (bag-peek b)) + (foldl + (lambda (n1 b1) (bag-insert b1 n1)) + (bag-remove b) + (outnodes g (bag-peek b))) + (cons (bag-peek b) l))] + [else (it g (bag-remove b) l)])) + (it g (bag-insert empty-bag n) '())) + ) diff --git a/semestr-2/racket/l11z20/graph.rkt b/semestr-2/racket/l11z20/graph.rkt new file mode 100644 index 0000000..ec19576 --- /dev/null +++ b/semestr-2/racket/l11z20/graph.rkt @@ -0,0 +1,100 @@ +#lang racket + +(provide bag^ graph^ simple-graph@ graph-search^ graph-search@) + +;; sygnatura dla struktury danych +(define-signature bag^ + ((contracted + [bag? (-> any/c boolean?)] + [empty-bag (and/c bag? bag-empty?)] + [bag-empty? (-> bag? boolean?)] + [bag-insert (-> bag? any/c (and/c bag? (not/c bag-empty?)))] + [bag-peek (-> (and/c bag? (not/c bag-empty?)) any/c)] + [bag-remove (-> (and/c bag? (not/c bag-empty?)) bag?)]))) + +;; sygnatura: grafy +(define-signature graph^ + ((contracted + [graph (-> list? (listof edge?) graph?)] + [graph? (-> any/c boolean?)] + [graph-nodes (-> graph? list?)] + [graph-edges (-> graph? (listof edge?))] + [edge (-> any/c any/c edge?)] + [edge? (-> any/c boolean?)] + [edge-start (-> edge? any/c)] + [edge-end (-> edge? any/c)] + [has-node? (-> graph? any/c boolean?)] + [outnodes (-> graph? any/c list?)] + [remove-node (-> graph? any/c graph?)] + ))) + +;; prosta implementacja grafów +(define-unit simple-graph@ + (import) + (export graph^) + + (define (graph? g) + (and (list? g) + (eq? (length g) 3) + (eq? (car g) 'graph))) + + (define (edge? e) + (and (list? e) + (eq? (length e) 3) + (eq? (car e) 'edge))) + + (define (graph-nodes g) (cadr g)) + + (define (graph-edges g) (caddr g)) + + (define (graph n e) (list 'graph n e)) + + (define (edge n1 n2) (list 'edge n1 n2)) + + (define (edge-start e) (cadr e)) + + (define (edge-end e) (caddr e)) + + (define (has-node? g n) (not (not (member n (graph-nodes g))))) + + (define (outnodes g n) + (filter-map + (lambda (e) + (and (eq? (edge-start e) n) + (edge-end e))) + (graph-edges g))) + + (define (remove-node g n) + (graph + (remove n (graph-nodes g)) + (filter + (lambda (e) + (not (eq? (edge-start e) n))) + (graph-edges g))))) + +;; sygnatura dla przeszukiwania grafu +(define-signature graph-search^ + (search)) + +;; implementacja przeszukiwania grafu +;; uzależniona od implementacji grafu i struktury danych +(define-unit graph-search@ + (import bag^ graph^) + (export graph-search^) + (define (search g n) + (define (it g b l) + (cond + [(bag-empty? b) (reverse l)] + [(has-node? g (bag-peek b)) + (it (remove-node g (bag-peek b)) + (foldl + (lambda (n1 b1) (bag-insert b1 n1)) + (bag-remove b) + (outnodes g (bag-peek b))) + (cons (bag-peek b) l))] + [else (it g (bag-remove b) l)])) + (it g (bag-insert empty-bag n) '())) + ) + +;; otwarcie komponentu grafu +(define-values/invoke-unit/infer simple-graph@) \ No newline at end of file diff --git a/semestr-2/racket/l11z20/solution.bak b/semestr-2/racket/l11z20/solution.bak new file mode 100644 index 0000000..6f1f7b4 --- /dev/null +++ b/semestr-2/racket/l11z20/solution.bak @@ -0,0 +1 @@ +#lang racket diff --git a/semestr-2/racket/l11z20/solution.rkt b/semestr-2/racket/l11z20/solution.rkt new file mode 100644 index 0000000..e3ad81f --- /dev/null +++ b/semestr-2/racket/l11z20/solution.rkt @@ -0,0 +1,245 @@ +#lang racket + +(require "graph.rkt") +(provide bag-stack@ bag-fifo@) + +;; struktura danych - stos +(define-unit bag-stack@ + (import) + (export bag^) + + (define (bag? b) + (and (cons? b) + (eq? (car b) 'stack))) + + (define empty-bag (cons 'stack null)) + + (define (bag-empty? b) + (null? (cdr b))) + + (define (bag-insert b val) + (cons 'stack (cons val (cdr b)))) + + (define (bag-peek b) + (cadr b)) + + (define (bag-remove b) + (cons 'stack (cddr b))) +) + +;; struktura danych - kolejka FIFO +(define-unit bag-fifo@ + (import) + (export bag^) + + (define (bag? b) + (and (list? b) + (eq? (length b) 3) + (eq? (first b) 'queue))) + + (define empty-bag + (list 'queue null null)) + + (define (bag-empty? b) + (and (null? (second b)) (null? (third b)))) + + (define (bag-insert b val) + (list 'queue (cons val (second b)) (third b))) + + (define (bag-peek b) + (let ((insq (second b)) + (popq (third b))) + (cond + [(null? popq) (last insq)] + [else (first popq)]))) + + (define (bag-remove b) + (let ((insq (second b)) + (popq (third b))) + (cond + [(null? popq) (list 'queue null (cdr (reverse insq)))] + [else (list 'queue insq (cdr popq))]))) +) + +;; otwarcie komponentów stosu i kolejki + +(define-values/invoke-unit bag-stack@ + (import) + (export (prefix stack: bag^))) + +(define-values/invoke-unit bag-fifo@ + (import) + (export (prefix fifo: bag^))) + +;; testy w Quickchecku +(require quickcheck) + +;; liczba zapytań na test quickchecka +(define TESTS 1000) + + +;; TESTY DO KOLEJKI + +;; xs to lista jakichś liczb, queries to rodzaj wykonywanych operacji +;; 0 - popuje na listę pops +;; 1 - insertuje na queue +;; jest nie ma nic na kolejce/stosie i dostajemy 0, to nic nie robimy +;; jesli queries albo xs są puste to po prostu kończymy obsługiwanie zapytań +;; na koncu sprawdzamy, czy (reverse pops) jest prefiksem xs + + +(define (check-queue xs queries) + (define (iter xs queries queue pops) + ;; (display queue) + ;; (newline) + (if (or (null? queries) (null? xs)) + (reverse pops) + (cond + [(and (eq? (car queries) 0) (not (fifo:bag-empty? queue))) + (iter xs (cdr queries) (fifo:bag-remove queue) (cons (fifo:bag-peek queue) pops))] + [else (iter (cdr xs) (cdr queries) (fifo:bag-insert queue (car xs)) pops)]))) + (define (is-prefix? xs ys) + (if (null? xs) + #t + (and (equal? (car xs) (car ys)) (is-prefix? (cdr xs) (cdr ys))))) + (is-prefix? (iter xs queries fifo:empty-bag null) xs)) + +;; sprawdzenie czy nasza funkcja testująca w ogóle działa +(define check-queue-test (lambda () (check-queue (list 1 2 3 4 5 6 7 8) (list 0 1 1 1 0 0 0 1 1 0 1 0 1 0 0)))) + +;; testowanie kolejki +(define-unit queue-tests@ + (import bag^) + (export) + + (quickcheck + (property ([xs (choose-list (choose-real -100000 100000) TESTS)] + [ops (choose-list (choose-integer 0 1) TESTS)]) + (check-queue xs ops)))) + +(invoke-unit queue-tests@ (import (prefix fifo: bag^))) + + +;; TESTY DO STOSU + +;; niestety tutaj nie jest tak kolorowo, na kolejce +;; dokładnie wiemy jaka jest koljeność popowanych, na stosie to dosyć dowolne. +;; Z drugiej strony jego implementacja jest dużo prostsza, więc testy też nie muszą +;; być bardzo rygorystyczne. + +(define (check-stack xs) + (define (insert-list stack xs) + (if (null? xs) + stack + (insert-list (stack:bag-insert stack (car xs)) (cdr xs)))) + (define (clear-stack stack pops) + (if (stack:bag-empty? stack) + pops + (clear-stack (stack:bag-remove stack) (cons (stack:bag-peek stack) pops)))) + (equal? xs (clear-stack (insert-list stack:empty-bag xs) null))) + + +;; testowanie stacka +(define-unit stack-tests@ + (import bag^) + (export) + (quickcheck + (property ([xs (choose-list (choose-real -100000 100000) TESTS)]) + (check-stack xs)))) + +(invoke-unit stack-tests@ (import (prefix stack: bag^))) + + + +;; testy kolejek i stosów +(define-unit bag-tests@ + (import bag^) + (export) + + ;; test przykładowy: jeśli do pustej struktury dodamy element + ;; i od razu go usuniemy, wynikowa struktura jest pusta + (quickcheck + (property ([s arbitrary-symbol]) + (bag-empty? (bag-remove (bag-insert empty-bag s))))) + + ;; Sprawdzenie własności wspólnych dla obu struktur + (quickcheck + (property ([s arbitrary-symbol]) + (equal? s (bag-peek (bag-insert empty-bag s))))) +) + +;; uruchomienie testów dla obu struktur danych + +(invoke-unit bag-tests@ (import (prefix stack: bag^))) +(invoke-unit bag-tests@ (import (prefix fifo: bag^))) + + + +;; TESTOWANIE PRZESZUKIWAŃ + +;; otwarcie komponentu grafu +(define-values/invoke-unit/infer simple-graph@) + +;; otwarcie komponentów przeszukiwania +;; w głąb i wszerz +(define-values/invoke-unit graph-search@ + (import graph^ (prefix stack: bag^)) + (export (prefix dfs: graph-search^))) + +(define-values/invoke-unit graph-search@ + (import graph^ (prefix fifo: bag^)) + (export (prefix bfs: graph-search^))) + +;; graf testowy +(define test-graph + (graph + (list 1 2 3 4) + (list (edge 1 3) + (edge 1 2) + (edge 2 4)))) + +(define test-graph2 + (graph (list 1) null)) + +(define test-graph3 + (graph (list 1 2 3 4 5 6 7 8 9 10) + (list (edge 1 2) + (edge 1 3) + (edge 2 3) + (edge 3 2) + (edge 3 5) + (edge 6 5) + (edge 5 7) + (edge 5 8) + (edge 7 9) + (edge 8 9) + (edge 9 10) + (edge 1 10) + (edge 10 1)))) + + +(define test-graph4 + (graph (list 1 2 3 4 5 6) + (list (edge 1 2) + (edge 2 3) + (edge 3 4) + (edge 4 5) + (edge 5 6)))) + +;; uruchomienie przeszukiwania na przykładowym grafie +(bfs:search test-graph 1) +(dfs:search test-graph 1) + +(bfs:search test-graph2 1) +(dfs:search test-graph2 1) + +(bfs:search test-graph3 1) +(dfs:search test-graph3 1) + +(bfs:search test-graph3 6) +(dfs:search test-graph3 6) + +(bfs:search test-graph4 1) +(dfs:search test-graph4 1) + + diff --git a/semestr-2/racket/l13/oceny.txt b/semestr-2/racket/l13/oceny.txt new file mode 100644 index 0000000..9f17cad --- /dev/null +++ b/semestr-2/racket/l13/oceny.txt @@ -0,0 +1,18 @@ +1 sem + +MDM - 5 5 +AO - 5 +AM 1 - 5 5 +LDI - 5 5 +MIA - 5 + +8 * 5 + + +2 sem + +Topologia - 5 3 +Analiza - 4 4 +MP - 5 5 +PPS - 5 +Algebra - 5 5 \ No newline at end of file diff --git a/semestr-2/racket/l13/rozw.rkt b/semestr-2/racket/l13/rozw.rkt new file mode 100644 index 0000000..b4094db --- /dev/null +++ b/semestr-2/racket/l13/rozw.rkt @@ -0,0 +1,79 @@ +#lang typed/racket + + +;;; zadanie 1 + +(: prefixes (All (a) (-> (Listof a) (Listof (Listof a))))) +(define (prefixes xs) + (if (null? xs) + (list null) + (cons xs (prefixes (cdr xs))))) + + + +;;; zadanie 2 + +(struct vector2 ([x : Real] [y : Real]) #:transparent) +(struct vector3 ([x : Real] [y : Real] [z : Real]) #:transparent) + +(define-type Vector (U vector2 vector3)) +(define-predicate vector? Vector) + + +(: square (-> Real Nonnegative-Real)) +(define (square x) + (if (< x 0) (* x x) (* x x))) + + +;;; pierwsza wersja + +(: vector-length (-> Vector Nonnegative-Real)) +(define (vector-length v) + (if (vector2? v) + (match v [(vector2 x y) (sqrt (+ (square x) (square y)))]) + (match v [(vector3 x y z) (sqrt (+ (square x) (square y) (square z)))]))) + + +;;; druga wersja + +(: vector-length-match (-> Vector Nonnegative-Real)) +(define (vector-length-match v) + (match v + [(vector2 x y) (sqrt (+ (square x) (square y)))] + [(vector3 x y z) (sqrt (+ (square x) (square y) (square z)))])) + + + +;;; zadanie 4 + +(struct leaf () #:transparent) +(struct [a] node ([v : a] [xs : (Listof (Tree a))]) #:transparent) + +(define-type (Tree a) (node a)) +(define-predicate tree? (Tree Any)) + + +(: flat-map (All (a) (-> (-> (Tree a) (Listof a)) (Listof (Tree a)) (Listof a)))) +(define (flat-map f xs) + (if (null? xs) + null + (append (f (car xs)) (flat-map f (cdr xs))))) + +(: preorder (All (a) (-> (Tree a) (Listof a)))) +(define (preorder t) + (match t + [(node v xs) + (cons v (flat-map preorder xs))])) + +;;; (preorder (node 1 (list +;;; (node 2 (list +;;; (node 3 '()) +;;; (node 4 '()))) +;;; (node 5 '()) +;;; (node 'x (list +;;; (node 't (list +;;; (node 'z '())))))))) + + +;;; zadanie 6 + diff --git a/semestr-2/racket/l13/solution.rkt b/semestr-2/racket/l13/solution.rkt new file mode 100644 index 0000000..61804b3 --- /dev/null +++ b/semestr-2/racket/l13/solution.rkt @@ -0,0 +1,124 @@ +#lang typed/racket + +; --------- ; +; Wyrazenia ; +; --------- ; + +(provide parse typecheck) + +(define-type Expr (U const binop var-expr let-expr if-expr)) +(define-type Value (U Real Boolean)) +(define-type ArithOp (U '+ '- '/ '* '%)) +;;; (define-type ModOp '%) +(define-type CompOp (U '= '> '>= '< '<=)) +(define-type LogicOp (U 'and 'or)) +(define-type BinopSym (U ArithOp CompOp LogicOp)) + +(struct const ([val : Value]) #:transparent) +(struct binop ([op : BinopSym] [l : Expr] [r : Expr]) #:transparent) +(struct var-expr ([id : Symbol]) #:transparent) +(struct let-expr ([id : Symbol] [e1 : Expr] [e2 : Expr]) #:transparent) +(struct if-expr ([eb : Expr] [et : Expr] [ef : Expr]) #:transparent) + +(define-predicate expr? Expr) +(define-predicate value? Value) +(define-predicate arith-op? ArithOp) +;;; (define-predicate mod-op? ModOp) +(define-predicate comp-op? CompOp) +(define-predicate logic-op? LogicOp) +(define-predicate binop-sym? BinopSym) +(define-predicate let-list? (List Symbol Any)) + +(: parse (-> Any Expr)) +(define (parse q) + (match q + [_ #:when (value? q) (const q)] + [_ #:when (eq? q 'true) (const true)] + [_ #:when (eq? q 'false) (const false)] ; <---------------------------- !!! + [_ #:when (symbol? q) (var-expr q)] + [`(,s ,e1 ,e2) + #:when (and (eq? s 'let) (let-list? e1)) + (let-expr (car e1) + (parse (cadr e1)) + (parse e2))] + [`(,s ,eb ,et ,ef) + #:when (eq? s 'if) + (if-expr (parse eb) + (parse et) + (parse ef))] + [`(,s ,e1 ,e2) + #:when (binop-sym? s) + (binop s + (parse e1) + (parse e2))] + [else (error "Parse error" q)])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(define-type EType (U 'real 'boolean)) +(define-predicate EType? EType) + +(struct environ ([xs : (Listof (Pairof Symbol EType))])) +(define env-empty (environ null)) + +(: env-add (-> Symbol EType environ environ)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) + +(: env-lookup (-> Symbol environ EType)) +(define (env-lookup x env) + (: assoc-lookup (-> (Listof (Pairof Symbol EType)) EType)) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +(: check-op (-> Expr Expr EType EType environ (U EType #f))) +(define (check-op e1 e2 arg-type ret-type env) + (if (and (eq? (typecheck-env e1 env) arg-type) + (eq? (typecheck-env e2 env) arg-type)) + ret-type + #f)) + +(: typecheck-env (-> Expr environ (U EType #f))) +(define (typecheck-env e env) + (match e + [(const val) + (cond + [(real? val) 'real] + [(boolean? val) 'boolean])] + [(var-expr id) (env-lookup id env)] + [(binop op e1 e2) + (cond + [(arith-op? op) (check-op e1 e2 'real 'real env)] + [(comp-op? op) (check-op e1 e2 'real 'boolean env)] + [(logic-op? op) (check-op e1 e2 'boolean 'boolean env)])] + [(let-expr id e1 e2) + (let ((id-type (typecheck-env e1 env))) + (if id-type + (typecheck-env e2 (env-add id id-type env)) + #f))] + [(if-expr eb et ef) + (let ((eb-type (typecheck-env eb env))) + (if (not (eq? eb-type 'boolean)) + #f + (let ((et-type (typecheck-env et env)) + (ef-type (typecheck-env ef env))) + (if (eq? et-type ef-type) ;;; nie trzeba sprawdzac czy ktores z nich to #f + et-type ;;; jesli tak jest, to i tak sie na pewno zwroci #f + #f))))])) + +(: typecheck (-> Expr (U EType #f))) +(define (typecheck e) + (typecheck-env e env-empty)) + +(define program + '(if (or (< (% 123 10) 5) + true) + (+ 2 3) + (/ 2 0))) + +(define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/l13/zad6.rkt b/semestr-2/racket/l13/zad6.rkt new file mode 100644 index 0000000..1dcfbfc --- /dev/null +++ b/semestr-2/racket/l13/zad6.rkt @@ -0,0 +1,132 @@ +#lang typed/racket + +; Do let-env.rkt dodajemy wartosci boolowskie +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(define-type Expr (U const binop var-expr let-expr if-expr)) +(define-type Value (U Real Boolean)) +(define-type BinopSym (U '+ '- '/ '* '% '= '> '>= '< '<= 'and 'or)) + +(struct const ([val : Value]) #:transparent) +(struct binop ([op : BinopSym] [l : Expr] [r : Expr]) #:transparent) +(struct var-expr ([id : Symbol]) #:transparent) +(struct let-expr ([id : Symbol] [e1 : Expr] [e2 : Expr]) #:transparent) +(struct if-expr ([eb : Expr] [et : Expr] [ef : Expr]) #:transparent) + + +(define-predicate expr? Expr) +(define-predicate value? Value) +(define-predicate binop-sym? BinopSym) +(define-predicate let-list? (List Symbol Any)) + +(: parse (-> Any Expr)) +(define (parse q) + (match q + [_ #:when (value? q) (const q)] + [_ #:when (eq? q 'true) (const true)] + [_ #:when (eq? q 'false) (const false)] ; <---------------------------- !!! + [_ #:when (symbol? q) (var-expr q)] + [`(,s ,e1 ,e2) + #:when (and (eq? s 'let) (let-list? e1)) + (let-expr (car e1) + (parse (cadr e1)) + (parse e2))] + [`(,s ,eb ,et ,ef) + #:when (eq? s 'if) + (if-expr (parse eb) + (parse et) + (parse ef))] + [`(,s ,e1 ,e2) + #:when (binop-sym? s) + (binop s + (parse e1) + (parse e2))] + [else (error "Parse error" q)])) + +;;; (define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ ([xs : (Listof (Pairof Symbol Value))])) +(define env-empty (environ null)) + +(: env-add (-> Symbol Value environ environ)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) + +(: env-lookup (-> Symbol environ Value)) +(define (env-lookup x env) + (: assoc-lookup (-> (Listof (Pairof Symbol Value)) Value)) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(: arith-op (-> (-> Real Real Real) (-> Value Value Value))) +(define (arith-op op) + (lambda (x y) (if (and (real? x) (real? y)) + (ann (op x y) Value) + (error "Wrong args for arithmetic operator" op x y)))) + +(: mod-op (-> (-> Integer Integer Integer) (-> Value Value Value))) +(define (mod-op op) + (lambda (x y) (if (and (exact-integer? x) (exact-integer? y)) + (ann (op x y) Value) + (error "Wrong args for modulo operator" op x y)))) + +(: logic-op (-> (-> Boolean Boolean Boolean) (-> Value Value Value))) +(define (logic-op op) + (lambda (x y) (if (and (boolean? x) (boolean? y)) + (ann (op x y) Value) + (error "Wrong args for logic operator" op x y)))) + +(: comp-op (-> (-> Real Real Boolean) (-> Value Value Value))) +(define (comp-op op) + (lambda (x y) (if (and (real? x) (real? y)) + (ann (op x y) Value) + (error "Wrong args for comparator" op x y)))) + + +(: op->proc (-> BinopSym (-> Value Value Value))) +(define (op->proc op) + (match op ['+ (arith-op +)] ['- (arith-op -)] ['* (arith-op *)] ['/ (arith-op /)] + ['% (mod-op modulo)] + ['= (comp-op =)] ['> (comp-op >)] ['>= (comp-op >=)] ['< (comp-op <)] ['<= (comp-op <=)] + ['and (logic-op (lambda (x y) (and x y)))] + ['or (logic-op (lambda (x y) (or x y)))])) + +(: eval-env (-> Expr environ Value)) +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!! + (eval-env et env) + (eval-env ef env))])) + +(: eval (-> Expr Value)) +(define (eval e) (eval-env e env-empty)) + +(define program + '(if (or (< (% 123 10) 5) + true) + (+ 2 3) + (/ 2 0))) + +;;; (define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/l14z22/solution.bak b/semestr-2/racket/l14z22/solution.bak new file mode 100644 index 0000000..0d4f164 --- /dev/null +++ b/semestr-2/racket/l14z22/solution.bak @@ -0,0 +1,70 @@ +#lang racket + +(require racklog) + +(provide solve) + +;; transpozycja tablicy zakodowanej jako lista list +(define (transpose xss) + (cond [(null? xss) xss] + ((null? (car xss)) (transpose (cdr xss))) + [else (cons (map car xss) + (transpose (map cdr xss)))])) + +;; procedura pomocnicza +;; tworzy listę n-elementową zawierającą wyniki n-krotnego +;; wywołania procedury f +(define (repeat-fn n f) + (if (eq? 0 n) null + (cons (f) (repeat-fn (- n 1) f)))) + +;; tworzy tablicę n na m elementów, zawierającą świeże +;; zmienne logiczne +(define (make-rect n m) + (repeat-fn m (lambda () (repeat-fn n _)))) + +;; predykat binarny +;; (%row-ok xs ys) oznacza, że xs opisuje wiersz (lub kolumnę) ys +(define %row-ok + (%rel () +;; TODO: uzupełnij! + )) + +;; TODO: napisz potrzebne ci pomocnicze predykaty + +;; funkcja rozwiązująca zagadkę +(define (solve rows cols) + (define board (make-rect (length cols) (length rows))) + (define tboard (transpose board)) + (define ret (%which (xss) + (%= xss board) +;; TODO: uzupełnij! + )) + (and ret (cdar ret))) + +;; testy +(equal? (solve '((2) (1) (1)) '((1 1) (2))) + '((* *) + (_ *) + (* _))) + +(equal? (solve '((2) (2 1) (1 1) (2)) '((2) (2 1) (1 1) (2))) + '((_ * * _) + (* * _ *) + (* _ _ *) + (_ * * _))) + +(equal? (solve '((4) (6) (2 2) (2 2) (6) (4) (2) (2) (2)) + '((9) (9) (2 2) (2 2) (4) (4))) + '((* * * * _ _) + (* * * * * *) + (* * _ _ * *) + (* * _ _ * *) + (* * * * * *) + (* * * * _ _) + (* * _ _ _ _) + (* * _ _ _ _) + (* * _ _ _ _))) + +;; TODO: możesz dodać własne testy + diff --git a/semestr-2/racket/l14z22/solution.rkt b/semestr-2/racket/l14z22/solution.rkt new file mode 100644 index 0000000..480c772 --- /dev/null +++ b/semestr-2/racket/l14z22/solution.rkt @@ -0,0 +1,87 @@ +#lang racket + +(require racklog) + +(provide solve) + +;; transpozycja tablicy zakodowanej jako lista list +(define (transpose xss) + (cond [(null? xss) xss] + ((null? (car xss)) (transpose (cdr xss))) + [else (cons (map car xss) + (transpose (map cdr xss)))])) + +;; procedura pomocnicza +;; tworzy listę n-elementową zawierającą wyniki n-krotnego +;; wywołania procedury f +(define (repeat-fn n f) + (if (eq? 0 n) null + (cons (f) (repeat-fn (- n 1) f)))) + +;; tworzy tablicę n na m elementów, zawierającą świeże +;; zmienne logiczne +(define (make-rect n m) + (repeat-fn m (lambda () (repeat-fn n _)))) + +;; predykat binarny +;; (%row-ok xs ys) oznacza, że xs opisuje wiersz (lub kolumnę) ys +(define %row-ok + (%rel (xs ys zs n) + [(null null)] + [(xs (cons '_ ys)) + (%row-ok xs ys)] + [((cons n xs) ys) + (%stars ys n) + (%cut-first-n ys zs n) + (%row-ok xs zs)])) + + +(define %suffix + (%rel (xs ys x) + [(xs xs)] + [((cons x xs) ys) + (%suffix xs ys)])) + +(define %cut-first-n + (%rel (xs ys n yl) + [(xs xs 0)] + [(xs ys n) + (%suffix xs ys) + (%is #t (= (- (length xs) (length ys)) n))])) + + +;; usun n pierwszych elementow z xs +(define (suffix xs n) + (if (= n 0) + xs + (suffix (cdr xs) (- n 1)))) + + +;; sprawdza czy pierwsze n elementów listy to gwiazdki (dokladnie n) +(define %stars + (%rel (xs m n) + [(null 0)] + [((cons '_ xs) n) + (%is n 0)] + [((cons '* xs) n) + (%is m (- n 1)) + (%stars xs m)])) + +(define %board-ok + (%rel (xss xs yss ys) + [(null null)] + [((cons xs xss) (cons ys yss)) + (%row-ok xs ys) + (%board-ok xss yss)])) + +;; funkcja rozwiązująca zagadkę +(define (solve rows cols) + (define board (make-rect (length cols) (length rows))) + (define tboard (transpose board)) + (define ret (%which (xss) + (%= xss board) + (%board-ok rows board) + (%board-ok cols tboard))) + (and ret (cdar ret))) + + diff --git a/semestr-2/racket/l15/kacp.bak b/semestr-2/racket/l15/kacp.bak new file mode 100644 index 0000000..ff2a2bc --- /dev/null +++ b/semestr-2/racket/l15/kacp.bak @@ -0,0 +1,55 @@ +#lang racket + +(define (run-concurrent . thunks) + (define threads (map thread thunks)) + (for-each thread-wait threads)) + +(define (random-sleep) + (sleep (/ (random) 100))) + +(define (with-random-sleep proc) + (lambda args + (random-sleep) + (apply proc args))) + +(define (make-serializer) + (define sem (make-semaphore 1)) + (lambda (proc) + (lambda args + (semaphore-wait sem) + (define ret (apply proc args)) + (semaphore-post sem) + ret))) + +(define (table) + (random-sleep) + (define forks (list (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1))) + (define (pick-fork i) + (random-sleep) + (semaphore-wait (list-ref forks i))) + (define (put-fork i) + (random-sleep) + (semaphore-post (list-ref forks i))) + (define (dispatch m) + (cond [(eq? m 'pick-fork) pick-fork] + [(eq? m 'put-fork) put-fork] + [else (error "Unknown request -- TABLE" + m)])) + dispatch) + +(define dtable (table)) + +(define (philosopher dining-table number) + (define my-turn (make-serializer)) + (define (eat) + (display number) + (newline) + ((dining-table 'pick-fork) number) + ((dining-table 'put-fork) number) + ((dining-table 'pick-fork) (modulo (+ number 1) 5)) + ((dining-table 'put-fork) (modulo (+ number 1) 5))) + (my-turn eat)) \ No newline at end of file diff --git a/semestr-2/racket/l15/kacp.rkt b/semestr-2/racket/l15/kacp.rkt new file mode 100644 index 0000000..bd484f1 --- /dev/null +++ b/semestr-2/racket/l15/kacp.rkt @@ -0,0 +1,59 @@ +#lang racket + +(define (run-concurrent . thunks) + (define threads (map thread thunks)) + (for-each thread-wait threads)) + +(define (random-sleep) + (sleep (/ (random) 100))) + +(define (with-random-sleep proc) + (lambda args + (random-sleep) + (apply proc args))) + +(define (make-serializer) + (define sem (make-semaphore 1)) + (lambda (proc) + (lambda args + (semaphore-wait sem) + (define ret (apply proc args)) + (semaphore-post sem) + ret))) + +(define (table) + (random-sleep) + (define forks (list (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1))) + (define (pick-fork i) + (random-sleep) + (semaphore-wait (list-ref forks i))) + (define (put-fork i) + (random-sleep) + (semaphore-post (list-ref forks i))) + (define (dispatch m) + (cond [(eq? m 'pick-fork) pick-fork] + [(eq? m 'put-fork) put-fork] + [else (error "Unknown request -- TABLE" + m)])) + dispatch) + +(define dtable (table)) + +(define (philosopher dining-table number) + (define my-turn (make-serializer)) + (define (eat) + (display "Zaczynam ") + (display number) + (newline) + ((dining-table 'pick-fork) number) + ((dining-table 'put-fork) number) + ((dining-table 'pick-fork) (modulo (+ number 1) 5)) + ((dining-table 'put-fork) (modulo (+ number 1) 5)) + (display "Koncze ") + (display number) + (newline)) + (my-turn eat)) \ No newline at end of file diff --git a/semestr-2/racket/l15/solution.bak b/semestr-2/racket/l15/solution.bak new file mode 100644 index 0000000..03ab86a --- /dev/null +++ b/semestr-2/racket/l15/solution.bak @@ -0,0 +1,7 @@ +#lang racket + + + +(define (run-concurrent . thunks) + (define threads (map thread thunks)) + (for-each thread-wait threads)) \ No newline at end of file diff --git a/semestr-2/racket/l15/solution.rkt b/semestr-2/racket/l15/solution.rkt new file mode 100644 index 0000000..915502e --- /dev/null +++ b/semestr-2/racket/l15/solution.rkt @@ -0,0 +1,85 @@ +#lang racket + +(provide philosopher) + +;; Do debugu + +(define (run-concurrent . thunks) + (define threads (map thread thunks)) + (for-each thread-wait threads)) + +(define (random-sleep) + (sleep (/ (random) 100))) + +(define (with-random-sleep proc) + (lambda args + (random-sleep) + (apply proc args))) + +(define (make-serializer) + (define sem (make-semaphore 1)) + (lambda (proc) + (lambda args + (semaphore-wait sem) + (define ret (apply proc args)) + (semaphore-post sem) + ret))) + +(define (make-table) + (define forks (map (lambda (x) (make-semaphore 1)) '(0 1 2 3 4))) + (define (get-fork i) + (list-ref forks i)) + (define (pick-fork i) + (random-sleep) + (semaphore-wait (get-fork i))) + (define (put-fork i) + (random-sleep) + (semaphore-post (get-fork i))) + (define (dispatch m) + (cond [(eq? m 'pick-fork) pick-fork] + [(eq? m 'put-fork) put-fork] + [else (error "Unknown request -- MAKE-TABLE" m)])) + dispatch) + +;(define dining-table (make-table)) + +;(define (repeat proc n) +; (if (> n 0) +; (begin +; (proc) +; (repeat proc (- n 1))) +; #f)) +; +;(define (hungry nr x) +; (lambda () (repeat (lambda () (philosopher dining-table nr)) x))) + +;; Rozwiązanie: + +(define forks-sem (map (lambda (x) (make-semaphore 1)) '(0 0 0 0 0))) + +(define (get-fork i) + (list-ref forks-sem i)) + +(define (is-free? i) + (semaphore-try-wait? (get-fork i))) + +(define (put-fork dining-table i) + ((dining-table 'put-fork) i) + (semaphore-post (get-fork i))) + +(define (philosopher dining-table i) + (define left-fork i) + (define right-fork (modulo (+ i 1) 5)) + (define (loop) + (if (is-free? left-fork) + (if (is-free? right-fork) + (begin + ((dining-table 'pick-fork) left-fork) + ((dining-table 'pick-fork) right-fork) + (put-fork dining-table left-fork) + (put-fork dining-table right-fork)) + (loop)) + (begin + (semaphore-post (get-fork left-fork)) + (loop)))) + (loop)) \ No newline at end of file diff --git a/semestr-2/racket/l7z12/solution.rkt b/semestr-2/racket/l7z12/solution.rkt new file mode 100644 index 0000000..089dee4 --- /dev/null +++ b/semestr-2/racket/l7z12/solution.rkt @@ -0,0 +1,95 @@ +#lang racket + +(provide (struct-out const) + (struct-out binop) + (struct-out var-expr) + (struct-out let-expr) + (struct-out pos) + (struct-out var-free) + (struct-out var-bound) + annotate-expression) + +;; --------------- +;; Jezyk wejsciowy +;; --------------- + +(struct pos (file line col) #:transparent) + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (loc id e1 e2) #:transparent) + +(define (expr? e) + (match e + [(const n) (number? n)] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr loc x e1 e2) + (and (pos? loc) (symbol? x) (expr? e1) (expr? e2))] + [_ false])) + +(define (make-pos s) + (pos (syntax-source s) + (syntax-line s) + (syntax-column s))) + +(define (parse e) + (let ([r (syntax-e e)]) + (cond + [(number? r) (const r)] + [(symbol? r) (var-expr r)] + [(and (list? r) (= 3 (length r))) + (match (syntax-e (car r)) + ['let (let* ([e-def (syntax-e (second r))] + [x (syntax-e (first e-def))]) + (let-expr (make-pos (first e-def)) + (if (symbol? x) x (error "parse error!")) + (parse (second e-def)) + (parse (third r))))] + [op (binop op (parse (second r)) (parse (third r)))])] + [else (error "parse error!")]))) + +;; --------------- +;; Jezyk wyjsciowy +;; --------------- + +(struct var-free (id) #:transparent) +(struct var-bound (pos id) #:transparent) + +(define (expr-annot? e) + (match e + [(const n) (number? n)] + [(binop op l r) (and (symbol? op) (expr-annot? l) (expr-annot? r))] + [(var-free x) (symbol? x)] + [(var-bound loc x) (and (pos? loc) (symbol? x))] + [(let-expr loc x e1 e2) + (and (pos? loc) (symbol? x) (expr-annot? e1) (expr-annot? e2))] + [_ false])) + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) false] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +(define (annotate-expression-env e env) + (match e + [(const r) (const r)] + [(binop op l r) (binop op (annotate-expression-env l env) (annotate-expression-env r env))] + [(var-expr x) (let ((pos (env-lookup x env))) + (if pos + (var-bound pos x) + (var-free x)))] + [(let-expr loc x e1 e2) (let-expr loc x (annotate-expression-env e1 env) (annotate-expression-env e2 (env-add x loc env)))])) + +(define (annotate-expression e) + (annotate-expression-env e env-empty)) + +(define (test) (annotate-expression (parse #'(let [x 5] (let [x (* x y)] (+ x y)))))) diff --git a/semestr-2/racket/l7z13/solution.rkt b/semestr-2/racket/l7z13/solution.rkt new file mode 100644 index 0000000..0a0278a --- /dev/null +++ b/semestr-2/racket/l7z13/solution.rkt @@ -0,0 +1,104 @@ +#lang racket + +(provide (struct-out const) (struct-out binop) (struct-out var-expr) (struct-out let-expr) (struct-out var-dead) find-dead-vars) + + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct var-dead (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) + +(define (expr? e) + (match e + [(const n) (number? n)] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(var-dead x) (symbol? x)] + [(let-expr x e1 e2) (and (symbol? x) (expr? e1) (expr? e2))] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +; ---------------------------------- ; +; Wyszukaj ostatnie uzycie zmiennych ; +; ---------------------------------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "unbound identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) +(define (env-erase x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "unbound identifier" x)] + [(eq? x (caar xs)) (cdr xs)] + [else (cons (car xs) (assoc-lookup (cdr xs)))])) + (if (env-lookup x env) + (environ (assoc-lookup (assoc-lookup (environ-xs env)))) + (environ (assoc-lookup (environ-xs env))))) + + +(define (find-dead-vars-env e env) + (match e + [(const r) (cons (const r) env)] + [(var-expr x) (if (env-lookup x env) + (cons (var-expr x) env) + (cons (var-dead x) (env-add x true env)))] + [(binop op l r) (let* ((right-expr (find-dead-vars-env r env)) + (r (car right-expr)) + (env (cdr right-expr)) + (left-expr (find-dead-vars-env l env)) + (l (car left-expr)) + (env (cdr left-expr))) + (cons (binop op l r) env))] + [(let-expr x e1 e2) (let* ((right-expr (find-dead-vars-env e2 (env-add x false env))) + (e2 (car right-expr)) + (env (env-erase x (cdr right-expr))) + (left-expr (find-dead-vars-env e1 env)) + (e1 (car left-expr)) + (env (cdr left-expr))) + (cons (let-expr x e1 e2) env))])) + +(define (find-dead-vars e) + (car (find-dead-vars-env e env-empty))) + + +(define (sample2) (find-dead-vars (let-expr 'x (const 3) + (binop '+ (var-expr 'x) + (let-expr 'x (const 5) (binop '+ (var-expr 'x) (var-expr 'x))))))) + +(define (test1) (find-dead-vars (parse '(let (x 3) (let (x (* x (+ x x))) (+ x x)))))) +(define (test2) (find-dead-vars (parse '(let (x 2) (let [x (let [x (+ x 2)] x)] x))))) +(define (test3) (find-dead-vars (parse '(let [x 2] (+ (let [x (+ 2 x)] (* 3 x)) x))))) +(define (test4) (find-dead-vars (parse '(let [x 2] (let [x (+ x 3)] (* x x)))))) +(define (test5) (find-dead-vars (parse '(let [x 2] (+ x (let [x (+ 2 x)] x)))))) +(define (test6) (find-dead-vars (parse '(let [x 2] + (let [y (let [x (* x (+ x x))] + (let [y (* x x)] + (+ y 2)))] + (+ x (* y y))))))) +(define (test7) (find-dead-vars (parse '(let [x (let [x (let [x 2] (+ x x))] (+ x x))] (+ x x))))) +;;; (define (test7) (find-dead-vars (parse '(let [x (let [x (let [x 2] (let (x 2) (+ x x)))] (+ x x))] (+ x x))))) +(define (test8) (find-dead-vars (parse '(let [x 2] (let [x 2] (+ x x)))))) \ No newline at end of file diff --git a/semestr-2/racket/l8z14/solution.bak b/semestr-2/racket/l8z14/solution.bak new file mode 100644 index 0000000..b51383a --- /dev/null +++ b/semestr-2/racket/l8z14/solution.bak @@ -0,0 +1,155 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct car-expr (e) #:transparent) +(struct cdr-expr (e) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(car-expr e) (expr? e)] + [(cdr-expr e) (expr? e)] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(car-expr e) (car (eval-env e env))] + [(cdr-expr e) (cdr (eval-env e env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(let [twice (lambda (f x) (f (f x)))] + (let [inc (lambda (x) (+ 1 x))] + (twice twice twice twice inc 1)))) + + +(define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/l8z14/solution.rkt b/semestr-2/racket/l8z14/solution.rkt new file mode 100644 index 0000000..59556cf --- /dev/null +++ b/semestr-2/racket/l8z14/solution.rkt @@ -0,0 +1,201 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(provide eval parse) + + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct car-expr (e) #:transparent) +(struct cdr-expr (e) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! +(struct apply-expr (f xs) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(car-expr e) (expr? e)] + [(cdr-expr e) (expr? e)] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [(apply-expr f xs) (and (expr? f) (expr? xs))] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (> (length q) 0) (list? q) (eq? (first q) 'list)) + (parse-list (cdr q))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'apply)) + (apply-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +(define (parse-list q) + (if (null? q) + (null-expr) + (cons-expr (parse (car q)) (parse-list (cdr q))))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(car-expr e) (car (eval-env e env))] + [(cdr-expr e) (cdr (eval-env e env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(apply-expr e1 e2) + (let ([xs (eval-env e2 env)]) + (eval-env (eval-apply e1 (reverse xs)) env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval-apply e xs) + (if (null? xs) + e + (app (eval-apply e (cdr xs)) (const (car xs))))) + +(define (eval e) (eval-env e env-empty)) + +;; testy wspólnie z Karolem Ochmanem + +(define program1 + '(apply (lambda (x y) (+ x y)) + (cons 1 (cons 2 null)))) +(define program2 + '(apply (lambda (x y z) (+ x (+ y z))) + (cons 1 (cons 2 null)))) +(define program3 + '(apply (lambda (x y) (lambda (z) (+ x (+ y z)))) + (cons 1 (cons 2 (cons 3 null))))) +(define program4 + '(apply (lambda (x y) (+ x y)) + (cons 1 (cons 2 (cons 3 null))))) +(define program5 + '(let [f (lambda (x y z) (+ z (+ x y)))] + (apply (f 3) (cons 1 (cons 2 null))))) +(define program6 + '(let [f (lambda (x) x)] + (apply (f 4) null))) +(define program7 + '(apply (lambda (q w e r t y u i o p a s d f g h j k l) 3) + (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 + (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 + (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 null))))))))))))))))))))) +(define program8 + '(apply (lambda (q w e r t y u i o p a s d f g h j k l) 3) + (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 + (cons 1 (cons 1 (cons 1 (cons 1 null))))))))))))))) \ No newline at end of file diff --git a/semestr-2/racket/l8z15/solution.bak b/semestr-2/racket/l8z15/solution.bak new file mode 100644 index 0000000..cdc84f9 --- /dev/null +++ b/semestr-2/racket/l8z15/solution.bak @@ -0,0 +1,187 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +(provide parse eval) + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct car-expr (e) #:transparent) +(struct cdr-expr (e) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(car-expr e) (expr? e)] + [(cdr-expr e) (expr? e)] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! +(struct odr (e env) #:transparent) + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (match (env-lookup x env) + [(odr e env) (eval-env e env)] + [f f])] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (odr e1 env) + (odr e2 env))] + [(car-expr e) (let ([p (eval-env e env)]) + (match (car p) + [(odr e env) (eval-env e env)]))] + [(cdr-expr e) (let ([p (eval-env e env)]) + (match (cdr p) + [(odr e env) (eval-env e env)]))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (odr e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(let [twice (lambda (f x) (f (f x)))] + (let [inc (lambda (x) (+ 1 x))] + (twice twice twice twice inc 1)))) + + +;;; Testy wspólnie z Karolem Ochmanem + +(define (test-eval program) (eval (parse program))) + +(define program1 + '((lambda (x) (+ 3 3)) (/ 5 0))) +(define program2 + '(let [if-fun (lambda (b t e) (if b t e))] + (if-fun true 4 (/ 5 0)))) +(define program3 + '(car (cdr (cons 1 (cons 2 (cons 3 (cons 4 null))))))) +(define program4 + '(car (cons (+ 3 4) (/ 5 0)))) +(define program5 + '(cons (+ 5 6) (- 4 3))) +(define program6 + '(car (cdr (cdr (car (cons (cons (/ 0 0) (cons (/ 0 0) (cons 1 (/ 0 0)))) (cdr (cons (/ 0 0) null)))))))) +;;; (test-eval program) +;;; (test-eval program1) +;;; (test-eval program2) +;;; (test-eval program3) +;;; (test-eval program4) +;;; (test-eval program5) +;;; (test-eval program6) \ No newline at end of file diff --git a/semestr-2/racket/l8z15/solution.rkt b/semestr-2/racket/l8z15/solution.rkt new file mode 100644 index 0000000..54b6cd3 --- /dev/null +++ b/semestr-2/racket/l8z15/solution.rkt @@ -0,0 +1,182 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +(provide parse eval) + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct car-expr (e) #:transparent) +(struct cdr-expr (e) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(car-expr e) (expr? e)] + [(cdr-expr e) (expr? e)] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! +(struct odr (e env) #:transparent) + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (match (env-lookup x env) + [(odr e env) (eval-env e env)] + [f f])] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (odr e1 env) + (odr e2 env))] + [(car-expr e) (let ([p (eval-env e env)]) + (match (car p) + [(odr e env) (eval-env e env)]))] + [(cdr-expr e) (let ([p (eval-env e env)]) + (match (cdr p) + [(odr e env) (eval-env e env)]))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (odr e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + + +;;; Testy wspólnie z Karolem Ochmanem + +(define (test-eval program) (eval (parse program))) + +(define program1 + '((lambda (x) (+ 3 3)) (/ 5 0))) +(define program2 + '(let [if-fun (lambda (b t e) (if b t e))] + (if-fun true 4 (/ 5 0)))) +(define program3 + '(car (cdr (cons 1 (cons 2 (cons 3 (cons 4 null))))))) +(define program4 + '(car (cons (+ 3 4) (/ 5 0)))) +(define program5 + '(cons (+ 5 6) (- 4 3))) +(define program6 + '(car (cdr (cdr (car (cons (cons (/ 0 0) (cons (/ 0 0) (cons 1 (/ 0 0)))) (cdr (cons (/ 0 0) null)))))))) +;;; (test-eval program) +;;; (test-eval program1) +;;; (test-eval program2) +;;; (test-eval program3) +;;; (test-eval program4) +;;; (test-eval program5) +;;; (test-eval program6) \ No newline at end of file diff --git a/semestr-2/racket/l9/zad4.rkt b/semestr-2/racket/l9/zad4.rkt new file mode 100644 index 0000000..7b5e0bc --- /dev/null +++ b/semestr-2/racket/l9/zad4.rkt @@ -0,0 +1,202 @@ +#lang racket + +; Do fun.rkt dodajemy rekurencyjne let-y +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct letrec-expr (id e1 e2) #:transparent) ; <----------------- !!! +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct car-expr (e) #:transparent) +(struct cdr-expr (e) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) +(struct lam (id e) #:transparent) +(struct citation (q) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(letrec-expr x e1 e2) ; <------------------------------------ !!! + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(car-expr e) (expr? e)] + [(cdr-expr e) (expr? e)] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] + [(lam id e) (and (symbol? id) (expr? e))] + [(citation q) true] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? 'quote (first q))) (citation (second q))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'letrec)) ; proc (car q)))) + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (parse-app q) + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct blackhole () #:transparent) ; <------------------------- !!! +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (mcons x v) (environ-xs env)))) ; <-------------- !!! +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) ; <---------------------------- !!! + (match (mcdr (car xs)) + [(blackhole) (error "Stuck forever in a black hole!")] + [x x])] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) +(define (env-update! x v xs) ; <---------------------------------- !!! + (define (assoc-update! xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) (set-mcdr! (car xs) v)] + [else (env-update! x v (cdr xs))])) + (assoc-update! (environ-xs xs))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v) + (blackhole? v))) ; <---------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + [_ false])) + +(define (eval-env e env) + (match e + [(const n) n] + [(citation q) q] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(letrec-expr x e1 e2) ; <------------------------------------ !!! + (let* ([new-env (env-add x (blackhole) env)] + [v (eval-env e1 new-env)]) + (begin + (env-update! x v new-env) + (eval-env e2 new-env)))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(car-expr e) (car (eval-env e env))] + [(cdr-expr e) (cdr (eval-env e env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] + [(app f e) + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(letrec + [fact (lambda (n) (if (= n 0) 1 (* n (fact (- n 1)))))] + (letrec + [even-odd + (cons + (lambda (x) + (if (= x 0) true ((cdr even-odd) (- x 1)))) + (lambda (x) + (if (= x 0) false ((car even-odd) (- x 1)))))] + (let [even (car even-odd)] + (let [odd (cdr even-odd)] + (even (fact 6))))))) + +(define PROGRAM + '(letrec [from-to (lambda (n k) + (if (> n k) + null + (cons n (from-to (+ n 1) k))))] + (letrec [sum (lambda (xs) + (if (null? xs) + 0 + (+ (car xs) (sum (cdr xs)))))] + (sum (from-to 1 36))))) + +(define (test-eval) (eval (parse PROGRAM))) \ No newline at end of file diff --git a/semestr-2/racket/l9/zad7.rkt b/semestr-2/racket/l9/zad7.rkt new file mode 100644 index 0000000..207162d --- /dev/null +++ b/semestr-2/racket/l9/zad7.rkt @@ -0,0 +1,340 @@ +#lang racket + +;; Składnia abstrakcyjna +(struct const (val) #:transparent) +(struct var-expr (name) #:transparent) +(struct let-expr (id bound body) #:transparent) +(struct letrec-expr (id bound body) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct lambda-expr (arg body) #:transparent) +(struct app-expr (fun arg) #:transparent) +(struct display-expr (e) ) + +(define (keyword s) + (member s '(true false null and or if cond else lambda let letrec display read))) + +(define (expr? e) + (match e + [(const n) (or (number? n) + (boolean? n) + (null? n) + (string? n))] + [(var-expr id) (symbol? id)] + [(let-expr x e1 e2 ) (and (symbol? x) + (expr? e1) + (expr? e2))] + [(letrec-expr x e1 e2) (and (symbol? x) + (expr? e1) + (expr? e2))] + [(if-expr eb et ef) (and (expr? eb) + (expr? et) + (expr? ef))] + [(lambda-expr x e) (and (symbol? x) + (expr? e))] + [(app-expr ef ea) (and (expr? ef) + (expr? ea))] + [_ false])) + +;; Parsowanie (zacytowane wyrażenie -> składnia abstrakcyjna) +(define (parse q) + (cond + [(number? q) (const q)] + [(string? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (const null)] + [(and (symbol? q) + (not (keyword q))) + (var-expr q)] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'let) + (list? (second q)) + (= (length (second q)) 2) + (symbol? (first (second q)))) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'letrec) + (list? (second q)) + (= (length (second q)) 2) + (symbol? (first (second q)))) + (letrec-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) + (pair? q) + (eq? (first q) 'and)) + (desugar-and (map parse (cdr q)))] + [(and (list? q) + (pair? q) + (eq? (first q) 'or)) + (desugar-or (map parse (cdr q)))] + [(and (list? q) + (>= (length q) 2) + (eq? (first q) 'cond)) + (parse-cond (cdr q))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'lambda) + (list? (second q)) + (andmap symbol? (second q)) + (cons? (second q))) + (desugar-lambda (second q) (parse (third q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-app (parse (first q)) (map parse (cdr q)))] + [else (error "Unrecognized token:" q)])) + +(define (parse-cond qs) + (match qs + [(list (list 'else q)) + (parse q)] + + [(list (list q _)) + (error "Expected 'else' in last branch but found:" q)] + + [(cons (list qb qt) qs) + (if-expr (parse qb) (parse qt) (parse-cond qs))])) + +(define (desugar-and es) + (if (null? es) + (const true) + (if-expr (car es) (desugar-and (cdr es)) (const false)))) + +(define (desugar-or es) + (if (null? es) + (const false) + (if-expr (car es) (const true) (desugar-or (cdr es))))) + +(define (desugar-lambda xs e) + (if (null? xs) + e + (lambda-expr (car xs) (desugar-lambda (cdr xs) e)))) + +(define (desugar-app e es) + (if (null? es) + e + (desugar-app (app-expr e (car es)) (cdr es)))) + +;; Środowiska +(struct blackhole ()) +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (mcons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) + (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (let ((v (mcdr (car xs)))) + (if (blackhole? v) + (error "Jumped into blackhole at" x) + v))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) +(define (env-update! x v env) + (define (assoc-update xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (set-mcdr! (car xs) v)] + [else (assoc-update (cdr xs))])) + (assoc-update (environ-xs env))) + +;; Domknięcia +(struct clo (arg body env)) + +;; Procedury wbudowane, gdzie +;; proc — Racketowa procedura którą należy uruchomić +;; args — lista dotychczas dostarczonych argumentów +;; pnum — liczba brakujących argumentów (> 0) +;; W ten sposób pozwalamy na częściową aplikację Racketowych procedur +;; — zauważmy że zawsze znamy pnum, bo w naszym języku arność +;; procedury jest ustalona z góry +(struct builtin (proc args pnum)) + +;; Pomocnicze konstruktory procedur unarnych i binarnych +(define (builtin/1 p) + (builtin p null 1)) +(define (builtin/2 p) + (builtin p null 2)) + +;; Procedury +(define (proc? v) + (or (and (clo? v) + (symbol? (clo-arg v)) + (expr? (clo-body v)) + (environ? (clo-env v))) + (and (builtin? v) + (procedure? (builtin-proc v)) + (andmap value? (builtin-args v)) + (natural? (builtin-pnum v)) + (> (builtin-pnum v) 0)))) + +;; Definicja typu wartości +(define (value? v) + (or (number? v) + (boolean? v) + (null? v) + (string? v) + (and (cons? v) + (value? (car v)) + (value? (cdr v))) + (proc? v))) + +;; Środowisko początkowe (przypisujące procedury wbudowane ich nazwom) + +(define start-env + (foldl (lambda (p env) (env-add (first p) (second p) env)) + env-empty + `((+ ,(builtin/2 +)) + (- ,(builtin/2 -)) + (* ,(builtin/2 *)) + (/ ,(builtin/2 /)) + (~ ,(builtin/1 -)) + (< ,(builtin/2 <)) + (> ,(builtin/2 >)) + (= ,(builtin/2 =)) + (<= ,(builtin/2 <=)) + (>= ,(builtin/2 >=)) + (not ,(builtin/1 not)) + (cons ,(builtin/2 cons)) + (car ,(builtin/1 car)) + (cdr ,(builtin/1 cdr)) + (pair? ,(builtin/1 cons?)) + (null? ,(builtin/1 null?)) + (boolean? ,(builtin/1 boolean?)) + (number? ,(builtin/1 number?)) + (procedure? ,(builtin/1 (lambda (x) (or (clo? x) (builtin? x))))) + (string? ,(builtin/1 string?)) + (string-= ,(builtin/2 string=?)) + ;; and so on, and so on + ))) + +;; Ewaluator +(define (eval-env e env) + (match e + [(const n) + n] + + [(var-expr x) + (env-lookup x env)] + + [(let-expr x e1 e2) + (let ((v1 (eval-env e1 env))) + (eval-env e2 (env-add x v1 env)))] + + [(letrec-expr f ef eb) + (let* ((new-env (env-add f (blackhole) env)) + (vf (eval-env ef new-env))) + (env-update! f vf new-env) + (eval-env eb new-env))] + + [(if-expr eb et ef) + (match (eval-env eb env) + [#t (eval-env et env)] + [#f (eval-env ef env)] + [v (error "Not a boolean:" v)])] + + [(lambda-expr x e) + (clo x e env)] + + [(app-expr ef ea) + (let ((vf (eval-env ef env)) + (va (eval-env ea env))) + (match vf + [(clo x e env) + (eval-env e (env-add x va env))] + [(builtin p args nm) + (if (= nm 1) + (apply p (reverse (cons va args))) + (builtin p (cons va args) (- nm 1)))] + [_ (error "Not a function:" vf)]))])) + +(define (eval e) + (eval-env e start-env)) + + +;; REPL — interpreter interaktywny (read-eval-print loop) + +;; dodajemy składnię na wiązanie zmiennych "na poziomie interpretera" +;; i komendę wyjścia "exit" ... +(struct letrec-repl (id expr)) +(struct let-repl (id expr)) +(struct exit-repl ()) + +;; ... a także rozszerzoną procedurę parsującą te dodatkowe komendy i +;; prostą obsługę błędów +(define (parse-repl q) + (with-handlers + ([exn? (lambda (exn) + (display "Parse error! ") + (displayln (exn-message exn)))]) + (cond + [(eq? q 'exit) (exit-repl)] + [(and (list? q) + (= 3 (length q)) + (eq? (first q) 'let)) + (let-repl (second q) (parse (third q)))] + [(and (list? q) + (= 3 (length q)) + (eq? (first q) 'letrec)) + (letrec-repl (second q) (parse (third q)))] + [else (parse q)]))) + +;; trochę zamieszania w procedurze eval-repl wynika z rudymentarnej +;; obsługi błędów: nie chcemy żeby błąd w interpretowanym programie +;; kończył działanie całego interpretera! +(define (eval-repl c env continue) + (define (eval-with-err e env) + (with-handlers + ([exn? (lambda (exn) + (display "Error! ") + (displayln (exn-message exn)))]) + (eval-env e env))) + (match c + [(exit-repl) + (void)] + + [(let-repl x e) + (let ((v (eval-with-err e env))) + (if (void? v) + (continue env) + (continue (env-add x v env))))] + + [(letrec-repl f e) + (let* ((new-env (env-add f (blackhole) env)) + (v (eval-with-err e new-env))) + (if (void? v) + (continue env) + (begin + (env-update! f v new-env) + (continue new-env))))] + + [_ + (let ((v (eval-with-err c env))) + (unless (void? v) + (displayln v)) + (continue env))])) + +;; I w końcu interaktywny interpreter +(define (repl) + (define (go env) + (display "FUN > ") + (let* ((q (read)) + (c (parse-repl q))) + (if (void? c) + (go env) + (eval-repl c env go)))) + (displayln "Welcome to the FUN functional language interpreter!") + (go start-env)) \ No newline at end of file diff --git a/semestr-2/racket/l9z16/solution.rkt b/semestr-2/racket/l9z16/solution.rkt new file mode 100644 index 0000000..0af169d --- /dev/null +++ b/semestr-2/racket/l9z16/solution.rkt @@ -0,0 +1,42 @@ +#lang racket + +(provide lcons lnull lnull? lcar lcdr) + + +(define (lcons x f) (mcons x f)) + +(define lnull null) + +(define lnull? null?) + +(define (lcar xs) (mcar xs)) + +(define (lcdr xs) + (let ([x (mcdr xs)]) + (cond [(not (mpair? x)) (set-mcdr! xs (x))])) + (mcdr xs)) + +(define (from n) + (lcons n (lambda () (from (+ n 1))))) + +(define nats + (from 0)) + +(define (lnth n xs) + (cond [(= n 0) (lcar xs)] + [else (lnth (- n 1) (lcdr xs))])) + +(define (lfilter p xs) + (cond [(lnull? xs) lnull] + [(p (lcar xs)) + (lcons (lcar xs) (lambda () (lfilter p (lcdr xs))))] + [else (lfilter p (lcdr xs))])) + +(define (prime? n) + (define (factors i) + (cond [(>= i n) (list n)] + [(= (modulo n i) 0) (cons i (factors (+ i 1)))] + [else (factors (+ i 1))])) + (= (length (factors 1)) 2)) + +(define primes (lfilter prime? (from 2))) \ No newline at end of file diff --git a/semestr-2/racket/l9z17/solution.rkt b/semestr-2/racket/l9z17/solution.rkt new file mode 100644 index 0000000..5e98036 --- /dev/null +++ b/semestr-2/racket/l9z17/solution.rkt @@ -0,0 +1,266 @@ +#lang racket + +; Do programming.rkt dodajemy instrukcje + +(provide eval-while parse-while env-empty env-lookup) + +;;; We współpracy z Kacprem Soleckim + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct letrec-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct car-expr (e) #:transparent) +(struct cdr-expr (e) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) +(struct lam (id e) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n) (string? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(letrec-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(car-expr e) (expr? e)] + [(cdr-expr e) (expr? e)] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] + [(lam id e) (and (symbol? id) (expr? e))] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(string? q) (const q)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'letrec)) + (letrec-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) + (parse-lam (second q) (third q))] + [(and (list? q) (pair? q) (not (op->proc (car q)))) + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (parse-app q) + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct blackhole () #:transparent) +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (mcons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (match (mcdr (car xs)) + [(blackhole) (error "Stuck forever in a black hole!")] + [x x])] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) +(define (env-update! x v xs) + (define (assoc-update! xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) (set-mcdr! (car xs) v)] + [else (env-update! x v (cdr xs))])) + (assoc-update! (environ-xs xs))) +(define (env-update x v xs) ; <---------------------------------- !!! + (define (assoc-update xs) + (cond [(null? xs) (list (mcons x v))] + [(eq? x (mcar (car xs))) (cons (mcons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (environ (assoc-update (environ-xs xs)))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) +(struct let-var (v) #:transparent) + +(define (value? v) + (or (number? v) + (boolean? v) + (string? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v) + (blackhole? v))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + ['eq? eq?] + [_ false])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (let-var (eval-env e1 env)) env))] + [(letrec-expr x e1 e2) + (let* ([new-env (env-add x (blackhole) env)] + [v (eval-env e1 new-env)]) + (begin + (env-update! x v new-env) + (eval-env e2 new-env)))] + [(var-expr x) (let ((f (env-lookup x env))) + (if (let-var? f) (let-var-v f) f))] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(car-expr e) (car (eval-env e env))] + [(cdr-expr e) (cdr (eval-env e env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] + [(app f e) + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve (merge-let-vars env fun-env)))]))])) + +(define (merge-let-vars env1 env2) + (define (iter xs env) + (if (null? xs) + env + (let ((cur-var (car xs))) + (if (let-var? (mcdr cur-var)) + (iter (cdr xs) (env-add (mcar cur-var) (mcdr cur-var) env)) + (iter (cdr xs) env))))) + (iter (reverse (environ-xs env2)) env1)) + +(define (eval e) (eval-env e env-empty)) + +; ---------------------------------------------------------------- !!! + +(struct skip () #:transparent) +(struct assign (x e) #:transparent) +(struct if-cmd (eb ct cf) #:transparent) +(struct while (eb cb) #:transparent) +(struct comp (c1 c2) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd eb ct cf) (and (expr? eb) (cmd? ct) (cmd? cf))] + [(while eb ct) (and (expr? eb) (cmd? ct))] + [else false])) + +(define (parse-while q) + (cond + [(eq? q 'skip) (skip)] + [(null? q) (skip)] + [(and (list? q) (= (length q) 3) (eq? (second q) ':=)) + (assign (first q) + (parse (third q)))] + [(and (list? q) (= (length q) 4) (eq? (car q) 'if)) + (if-cmd (parse (second q)) + (parse-while (third q)) + (parse-while (fourth q)))] + [(and (list? q) (= (length q) 3) (eq? (car q) 'while)) + (while (parse (second q)) + (parse-while (third q)))] + [(and (list? q) (= (length q) 2)) + (comp (parse-while (first q)) + (parse-while (second q)))] + [(and (list? q) (> (length q) 2)) + (comp (parse-while (first q)) + (parse-while (cdr q)))] + [else (error "while parse error")])) + +(define (eval-while e env) + (match e + [(skip) env] + [(assign x e) + (env-update x (eval-env e env) env)] + [(if-cmd eb ct cf) + (if (eval-env eb env) + (eval-while ct env) + (eval-while cf env))] + [(while eb cb) + (if (eval-env eb env) + (eval-while e (eval-while cb env)) + env)] + [(comp c1 c2) (eval-while c2 (eval-while c1 env))])) + +; zakladamy, ze program startuje z pamiecia w ktorej +; aktwna jest zmienna t +(define WHILE_FACT + '{(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (- t 1))})}) + +(define (fact n) + (let* ([init-env (env-add 't n env-empty)] + [final-env + (eval-while (parse-while WHILE_FACT) init-env)]) + (env-lookup 'i final-env))) + +(define prog1 '{(x := 5) + (f := (let [x 50] (lambda (y) (+ x y)))) + (x := 10) + (z := (f 0))}) \ No newline at end of file diff --git a/semestr-2/racket/leftist.rkt b/semestr-2/racket/leftist.rkt new file mode 100644 index 0000000..78319e4 --- /dev/null +++ b/semestr-2/racket/leftist.rkt @@ -0,0 +1,105 @@ +#lang racket + +(provide make-elem elem-priority elem-val empty-heap heap-insert heap-merge heap-min heap-pop heap-empty?) + +(define (inc n) + (+ n 1)) + +;;; tagged lists +(define (tagged-list? len-xs tag xs) + (and (list? xs) + (= len-xs (length xs)) + (eq? (first xs) tag))) + +;;; ordered elements +(define (make-elem pri val) + (cons pri val)) + +(define (elem-priority x) + (car x)) + +(define (elem-val x) + (cdr x)) + +;;; leftist heaps (after Okasaki) + +;; data representation +(define leaf 'leaf) + +(define (leaf? h) (eq? 'leaf h)) + +(define (hnode? h) + (and (tagged-list? 5 'hnode h) + (natural? (caddr h)))) + +(define (make-hnode elem heap-a heap-b) + (if (< (rank heap-a) (rank heap-b)) + (list 'hnode elem (+ (rank heap-a) 1) heap-b heap-a) + (list 'hnode elem (+ (rank heap-b) 1) heap-a heap-b))) + +(define (hnode-elem h) + (second h)) + +(define (hnode-left h) + (fourth h)) + +(define (hnode-right h) + (fifth h)) + +(define (hnode-rank h) + (third h)) + +(define (hord? p h) + (or (leaf? h) + (<= p (elem-priority (hnode-elem h))))) + +(define (heap? h) + (or (leaf? h) + (and (hnode? h) + (heap? (hnode-left h)) + (heap? (hnode-right h)) + (<= (rank (hnode-right h)) + (rank (hnode-left h))) + (= (rank h) (inc (rank (hnode-right h)))) + (hord? (elem-priority (hnode-elem h)) + (hnode-left h)) + (hord? (elem-priority (hnode-elem h)) + (hnode-right h))))) + +(define (rank h) + (if (leaf? h) + 0 + (hnode-rank h))) + +;; operations + +(define empty-heap leaf) + +(define (heap-empty? h) + (leaf? h)) + +(define (heap-insert elt heap) + (heap-merge heap (make-hnode elt leaf leaf))) + +(define (heap-min heap) + (hnode-elem heap)) + +(define (heap-pop heap) + (heap-merge (hnode-left heap) (hnode-right heap))) + +(define (heap-merge h1 h2) + (cond + [(leaf? h1) h2] + [(leaf? h2) h1] + [else (let ((h1-min (heap-min h1)) + (h2-min (heap-min h2))) + (if (< (elem-priority h1-min) (elem-priority h2-min)) + (make-hnode h1-min (heap-merge (hnode-left h1) (hnode-right h1)) h2) + (make-hnode h2-min h1 (heap-merge (hnode-left h2) (hnode-right h2)))))])) + +;;; check that a list is sorted (useful for longish lists) +(define (sorted? xs) + (cond [(null? xs) true] + [(null? (cdr xs)) true] + [(<= (car xs) (cadr xs)) (sorted? (cdr xs))] + [else false])) diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep b/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep new file mode 100644 index 0000000..6e0cfbb --- /dev/null +++ b/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep @@ -0,0 +1 @@ +("7.6" racket ("f0a57e86828cdab35eaad454d5deb80353172518" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zo b/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zo new file mode 100644 index 0000000..748fec9 Binary files /dev/null and b/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zo differ diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep b/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep new file mode 100644 index 0000000..0926afc --- /dev/null +++ b/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep @@ -0,0 +1 @@ +("7.6" racket ("e0347fa7e89f59bc97c197db02b440f666222428" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.zo b/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.zo new file mode 100644 index 0000000..eccc7f7 Binary files /dev/null and b/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.zo differ diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep b/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep new file mode 100644 index 0000000..9810b4c --- /dev/null +++ b/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep @@ -0,0 +1 @@ +("7.6" racket ("ae3a6974cdd4582f480927d9968aad2f495b7fc4" . "33b0c09c14dce6a2115d810ac3d0f25a9dce3205") #"C:\\Users\\franc\\Documents\\lista5\\props.rkt" (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zo b/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zo new file mode 100644 index 0000000..ca1ab20 Binary files /dev/null and b/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zo differ diff --git a/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep b/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep new file mode 100644 index 0000000..0926afc --- /dev/null +++ b/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep @@ -0,0 +1 @@ +("7.6" racket ("e0347fa7e89f59bc97c197db02b440f666222428" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zo b/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zo new file mode 100644 index 0000000..eccc7f7 Binary files /dev/null and b/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zo differ diff --git a/semestr-2/racket/lista5/julita/props.rkt b/semestr-2/racket/lista5/julita/props.rkt new file mode 100644 index 0000000..204b108 --- /dev/null +++ b/semestr-2/racket/lista5/julita/props.rkt @@ -0,0 +1,52 @@ +#lang racket + +(provide conj conj-left conj-right conj? + disj disj-left disj-right disj? + neg neg-subf neg? + var?) + + +(define (conj p q) + (list 'conj p q)) + +(define (conj-left f) + (second f)) + +(define (conj-right f) + (third f)) + +(define (conj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'conj (car t)))) + + +(define (disj p q) + (list 'disj p q)) + +(define (disj-left f) + (second f)) + +(define (disj-right f) + (third f)) + +(define (disj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'disj (car t)))) + + +(define (neg x) + (list 'neg x)) + +(define (neg-subf x) + (second x)) + +(define (neg? t) + (and (list? t) + (= 2 (length t)) + (eq? 'neg (car t)))) + + +(define (var? t) + (symbol? t)) diff --git a/semestr-2/racket/lista5/julita/solution.bak b/semestr-2/racket/lista5/julita/solution.bak new file mode 100644 index 0000000..b3dda94 --- /dev/null +++ b/semestr-2/racket/lista5/julita/solution.bak @@ -0,0 +1,164 @@ +#lang racket + +;;Praca grupowa: +;;Dawid Holewa +;;Julita Osman +;;Aleksandra Stępniewska + +(require "props.rkt") +(provide falsifiable-cnf?) + +;Ponieważ formuła w cnf to konjunkcja klauzul +;a klauzula to alternatywa literałów +;to formuła w tej postaci jest tautologią +;wtedy i tylko wtedy gdy +;wszystkie klauzule w niej występujace sa zawsze prawdziwe (też są tautologiami) +;w przeciwnym razie, formulę taką da się zanegować; +;zatem nasz pomysł polega na tym, aby +;1)sprawdzic czy formula jest tautologia +;2)jesli tak to zwracamy fałsz +;3)wpp. pierwsza z klauzul, która nie jest tautologia +;(zatem jest mozliwa do zanegowania i jednocześnie neguje cała formułe w cnf) +;"przesuwamy" na początek listy reprezentującej cnf + +;dodatkowo to czy klauzula jest tautologią nie musimy sprawdzać wykonując wartościowanie +;możemy skorzystać z własności alternatywy +;klauzula bedzię zawsze pawdziwa tylko jeśli conajmniej jedna ze zmiennych występuje jednoczesnie ze swoją negacją + +;Falsifiable, która sprawdza każde wartościowania +;sprawdza 2^(ilosc zmiennych w całym wyrażeniu) wartosciowań, +;podczas gdy +;falsifiable, która opiera się na strukturze cnf +;przechodzi po cnf, aż do napotkania pierwszej +;mozliwej do zanegowania klauzuli +;zatem w najroszym przypadku przejdziemy po całym cnf +;ale zawsze wartosciowania negujacego formule szukamy tylko dla jedenej klauzuli +;zauważmy,ze jeśli formuła jest tautologią to oszczędzamy bardzo dużo czasu nie rozpartując wszystkich wartosciowań, tylko wypisujac odrazu falsz + +;Ta druga jest więc efektywniejsza + +(define (lit? f);; a lub ~a + (or (var? f) ;;a + (and (neg? f);;~a + (var? (neg-subf f))))) + +(define (lit-pos v) + v) + +(define (lit-neg v) + (neg v)) + +(define (lit-var l) ;;a-->a ~a-->a + (if (var? l) + l + (neg-subf l))) + +(define (lit-pos? l) + (var? l)) + +(define (to-nnf f) + (cond + [(var? f) (lit-pos f)] + [(neg? f) (to-nnf-neg (neg-subf f))] + [(conj? f) (conj (to-nnf (conj-left f)) + (to-nnf (conj-right f)))] + [(disj? f) (disj (to-nnf (disj-left f)) + (to-nnf (disj-right f)))])) + +(define (to-nnf-neg f) + (cond + [(var? f) (lit-neg f)] + [(neg? f) (to-nnf (neg-subf f))] + [(conj? f) (disj (to-nnf-neg (conj-left f)) + (to-nnf-neg (conj-right f)))] + [(disj? f) (conj (to-nnf-neg (disj-left f)) + (to-nnf-neg (disj-right f)))])) + +(define (mk-cnf xss) + (cons 'cnf xss)) + +(define (clause? f) + (and (list? f) + (andmap lit? f))) + +(define (cnf? f) + (and (pair? f) + (eq? 'cnf (car f)) + (list? (cdr f)) + (andmap clause? (cdr f)))) + +(define (to-cnf f) + (define (join xss yss) + (apply append (map (lambda (xs) (map (lambda (ys) (append xs ys)) yss)) xss))) + + (define (go f) + (cond + [(lit? f) (list (list f))] + [(conj? f) (append (go (conj-left f)) + (go (conj-right f)))] + [(disj? f) (join (go (disj-left f)) + (go (disj-right f)))])) + (mk-cnf (go f))) + + +(define (contain-both-literals? claus) + (define (aux to-check) + (cond [(empty? to-check) #f] + [(neg? (car to-check)) + (if (memq (neg-subf (car to-check)) claus) + #t + (aux (cdr to-check)))] + [else (aux (cdr to-check))])) + (aux claus)) + + +;; sprawdza czy ktorakolwiek z klauzul z listy reprezentujacej cnf +;; zawiera chociaz jedną parę zmiennej i jej negacji +;; zwraca liste pusta jesli cnf jest tautologia +;; zwraca liste z pierwsza klauzule nie bedaca tautologia "przesunieta" na poczatek (possible-to-neg) +(define (has-both big-set) + (define (possible-to-neg big-set x) ;;przesuwa x-ty element listy big-set na poczatek + (define x-ty (list-ref big-set x)) + (append (list x-ty) (remove x-ty big-set))) + (define (aux iter big-set) + (if (= iter (length big-set)) + '() + (if (contain-both-literals? (list-ref big-set iter)) ;;sprawdzamy czy iter klauzula cnf ma wystapienie a i ~a jednoczesnie + (aux (+ iter 1) big-set) + (possible-to-neg big-set iter)))) + (aux 0 (cdr big-set))) ;;(cdr big-set) bo to cnf czyli pierwszy element listy to edykieta 'cnf + + +(define (falsifiable-cnf? t) + (define tt (to-cnf (to-nnf t))) + (define f (has-both tt)) + (if (empty? f) + #f + (find-valuation f))) + + +(define (valuate f sigma) + (define (insigma-proc lista result) + (cond [(null? lista) result] + [(insigma-proc (cdr lista) (append result (list (lit-var(caar lista)))))])) + ;; insigma ---> lista zmiennych z wartosciowania pierwszej klauzuli: + (define insigma (insigma-proc sigma '())) + (define (aux insigma otherclause sigma) + (cond [(null? otherclause) sigma] + [(if (memq (lit-var (car otherclause)) insigma) + (aux insigma (cdr otherclause) sigma) + (if(neg? (car otherclause)) + (aux (append insigma (list(car otherclause))) + (cdr otherclause) + (append sigma (list(list (lit-var(car otherclause)) 1)))) + (aux (append insigma (list(car otherclause))) + (cdr otherclause) + (append sigma (list(list (car otherclause) 0))))))])) + (if (empty? f) + sigma + (valuate (cdr f) + (aux insigma (car f) sigma)))) + +(define (find-valuation f) + (valuate f '())) + diff --git a/semestr-2/racket/lista5/julita/solution.rkt b/semestr-2/racket/lista5/julita/solution.rkt new file mode 100644 index 0000000..da87bf9 --- /dev/null +++ b/semestr-2/racket/lista5/julita/solution.rkt @@ -0,0 +1,164 @@ +#lang racket + +;;Praca grupowa: +;;Dawid Holewa +;;Julita Osman +;;Aleksandra Stępniewska + +(require "props.rkt") +(provide falsifiable-cnf?) + +;Ponieważ formuła w cnf to konjunkcja klauzul +;a klauzula to alternatywa literałów +;to formuła w tej postaci jest tautologią +;wtedy i tylko wtedy gdy +;wszystkie klauzule w niej występujace sa zawsze prawdziwe (też są tautologiami) +;w przeciwnym razie, formulę taką da się zanegować; +;zatem nasz pomysł polega na tym, aby +;1)sprawdzic czy formula jest tautologia +;2)jesli tak to zwracamy fałsz +;3)wpp. pierwsza z klauzul, która nie jest tautologia +;(zatem jest mozliwa do zanegowania i jednocześnie neguje cała formułe w cnf) +;"przesuwamy" na początek listy reprezentującej cnf + +;dodatkowo to czy klauzula jest tautologią nie musimy sprawdzać wykonując wartościowanie +;możemy skorzystać z własności alternatywy +;klauzula bedzię zawsze pawdziwa tylko jeśli conajmniej jedna ze zmiennych występuje jednoczesnie ze swoją negacją + +;Falsifiable, która sprawdza każde wartościowania +;sprawdza 2^(ilosc zmiennych w całym wyrażeniu) wartosciowań, +;podczas gdy +;falsifiable, która opiera się na strukturze cnf +;przechodzi po cnf, aż do napotkania pierwszej +;mozliwej do zanegowania klauzuli +;zatem w najroszym przypadku przejdziemy po całym cnf +;ale zawsze wartosciowania negujacego formule szukamy tylko dla jedenej klauzuli +;zauważmy,ze jeśli formuła jest tautologią to oszczędzamy bardzo dużo czasu nie rozpartując wszystkich wartosciowań, tylko wypisujac odrazu falsz + +;Ta druga jest więc efektywniejsza + +(define (lit? f);; a lub ~a + (or (var? f) ;;a + (and (neg? f);;~a + (var? (neg-subf f))))) + +(define (lit-pos v) + v) + +(define (lit-neg v) + (neg v)) + +(define (lit-var l) ;;a-->a ~a-->a + (if (var? l) + l + (neg-subf l))) + +(define (lit-pos? l) + (var? l)) + +(define (to-nnf f) + (cond + [(var? f) (lit-pos f)] + [(neg? f) (to-nnf-neg (neg-subf f))] + [(conj? f) (conj (to-nnf (conj-left f)) + (to-nnf (conj-right f)))] + [(disj? f) (disj (to-nnf (disj-left f)) + (to-nnf (disj-right f)))])) + +(define (to-nnf-neg f) + (cond + [(var? f) (lit-neg f)] + [(neg? f) (to-nnf (neg-subf f))] + [(conj? f) (disj (to-nnf-neg (conj-left f)) + (to-nnf-neg (conj-right f)))] + [(disj? f) (conj (to-nnf-neg (disj-left f)) + (to-nnf-neg (disj-right f)))])) + +(define (mk-cnf xss) + (cons 'cnf xss)) + +(define (clause? f) + (and (list? f) + (andmap lit? f))) + +(define (cnf? f) + (and (pair? f) + (eq? 'cnf (car f)) + (list? (cdr f)) + (andmap clause? (cdr f)))) + +(define (to-cnf f) + (define (join xss yss) + (apply append (map (lambda (xs) (map (lambda (ys) (append xs ys)) yss)) xss))) + + (define (go f) + (cond + [(lit? f) (list (list f))] + [(conj? f) (append (go (conj-left f)) + (go (conj-right f)))] + [(disj? f) (join (go (disj-left f)) + (go (disj-right f)))])) + (mk-cnf (go f))) + + +(define (contain-both-literals? claus) + (define (aux to-check) + (cond [(empty? to-check) #f] + [(neg? (car to-check)) + (if (memq (neg-subf (car to-check)) claus) + #t + (aux (cdr to-check)))] + [else (aux (cdr to-check))])) + (aux claus)) + + +;; sprawdza czy ktorakolwiek z klauzul z listy reprezentujacej cnf +;; zawiera chociaz jedną parę zmiennej i jej negacji +;; zwraca liste pusta jesli cnf jest tautologia +;; zwraca liste z pierwsza klauzule nie bedaca tautologia "przesunieta" na poczatek (possible-to-neg) +(define (has-both big-set) + (define (possible-to-neg big-set x) ;;przesuwa x-ty element listy big-set na poczatek + (define x-ty (list-ref big-set x)) + (append (list x-ty) (remove x-ty big-set))) + (define (aux iter big-set) + (if (= iter (length big-set)) + '() + (if (contain-both-literals? (list-ref big-set iter)) ;;sprawdzamy czy iter klauzula cnf ma wystapienie a i ~a jednoczesnie + (aux (+ iter 1) big-set) + (possible-to-neg big-set iter)))) + (aux 0 (cdr big-set))) ;;(cdr big-set) bo to cnf czyli pierwszy element listy to edykieta 'cnf + + +(define (falsifiable-cnf? t) + (define tt (to-cnf (to-nnf t))) + (define f (has-both tt)) + (if (empty? f) + #f + (find-valuation f))) + + +(define (valuate f sigma) + (define (insigma-proc lista result) + (cond [(null? lista) result] + [(insigma-proc (cdr lista) (append result (list (lit-var(caar lista)))))])) + ;; insigma ---> lista zmiennych z wartosciowania pierwszej klauzuli: + (define insigma (insigma-proc sigma '())) + (define (aux insigma otherclause sigma) + (cond [(null? otherclause) sigma] + [(if (memq (lit-var (car otherclause)) insigma) + (aux insigma (cdr otherclause) sigma) + (if(neg? (car otherclause)) + (aux (append insigma (list(car otherclause))) + (cdr otherclause) + (append sigma (list(list (lit-var(car otherclause)) true)))) + (aux (append insigma (list(car otherclause))) + (cdr otherclause) + (append sigma (list(list (car otherclause) false))))))])) + (if (empty? f) + sigma + (valuate (cdr f) + (aux insigma (car f) sigma)))) + +(define (find-valuation f) + (valuate f '())) + diff --git a/semestr-2/racket/lista5/prop.rkt b/semestr-2/racket/lista5/prop.rkt new file mode 100644 index 0000000..6f1f7b4 --- /dev/null +++ b/semestr-2/racket/lista5/prop.rkt @@ -0,0 +1 @@ +#lang racket diff --git a/semestr-2/racket/lista5/props.bak b/semestr-2/racket/lista5/props.bak new file mode 100644 index 0000000..1a5659a --- /dev/null +++ b/semestr-2/racket/lista5/props.bak @@ -0,0 +1,71 @@ +#lang racket + +(provide var? + neg? + conj? + disj? + conj + disj + neg + conj-left + conj-right + disj-right + disj-left + neg-subf) +; (require "solution.rkt") + +(define (var? t) (symbol? t)) + +(define (neg? t) + (and (list? t) + (= 2 (length t)) + (eq? 'neg (car t)))) + +(define (conj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'conj (car t)))) + +(define (disj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'disj (car t)))) + +(define (lit? t) + (or (var? t) + (and (neg? t) + (var? (neg-subf t))))) + +(define (conj left right) + (list 'conj left right)) + +(define (disj left right) + (list 'disj left right)) + +(define (neg f) + (list 'neg f)) + +(define (conj-left f) + (if (conj? f) + (cadr f) + (error "Złe dane ze znacznikiem -- CONJ-LEFT" f))) + +(define (conj-right f) + (if (conj? f) + (caddr f) + (error "Złe dane ze znacznikiem -- CONJ-RIGHT" f))) + +(define (disj-left f) + (if (disj? f) + (cadr f) + (error "Złe dane ze znacznikiem -- DISJ-LEFT" f))) + +(define (disj-right f) + (if (disj? f) + (caddr f) + (error "Złe dane ze znacznikiem -- DISJ-RIGHT" f))) + +(define (neg-subf f) + (if (neg? f) + (cadr f) + (error "Złe dane ze znacznikiem -- NEG-FORM" f))) diff --git a/semestr-2/racket/lista5/props.rkt b/semestr-2/racket/lista5/props.rkt new file mode 100644 index 0000000..204b108 --- /dev/null +++ b/semestr-2/racket/lista5/props.rkt @@ -0,0 +1,52 @@ +#lang racket + +(provide conj conj-left conj-right conj? + disj disj-left disj-right disj? + neg neg-subf neg? + var?) + + +(define (conj p q) + (list 'conj p q)) + +(define (conj-left f) + (second f)) + +(define (conj-right f) + (third f)) + +(define (conj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'conj (car t)))) + + +(define (disj p q) + (list 'disj p q)) + +(define (disj-left f) + (second f)) + +(define (disj-right f) + (third f)) + +(define (disj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'disj (car t)))) + + +(define (neg x) + (list 'neg x)) + +(define (neg-subf x) + (second x)) + +(define (neg? t) + (and (list? t) + (= 2 (length t)) + (eq? 'neg (car t)))) + + +(define (var? t) + (symbol? t)) diff --git a/semestr-2/racket/lista5/skrr/solution.bak b/semestr-2/racket/lista5/skrr/solution.bak new file mode 100644 index 0000000..72c7f36 --- /dev/null +++ b/semestr-2/racket/lista5/skrr/solution.bak @@ -0,0 +1,135 @@ +#lang racket + +(provide falsifiable-cnf?) +(require "props.rkt") + +(define (prop? f) + (or (var? f) + (and (neg? f) + (prop? (neg-subf f))) + (and (disj? f) + (prop? (disj-left f)) + (prop? (disj-right f))) + (and (conj? f) + (prop? (conj-left f)) + (prop? (conj-right f))))) + +(define (lit-var f) + (cond [(var? f) f] + [(neg? f) (neg-subf f)] + [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)])) + +(define (free-vars f) + (cond [(null? f) null] + [(var? f) (list f)] + [(neg? f) (free-vars (neg-subf f))] + [(conj? f) (append (free-vars (conj-left f)) + (free-vars (conj-right f)))] + [(disj? f) (append (free-vars (disj-left f)) + (free-vars (disj-right f)))] + [else (error "Zła formula -- FREE-VARS" f)])) + +(define (gen-vals xs) + (if (null? xs) + (list null) + (let* + ((vss (gen-vals (cdr xs))) + (x (car xs)) + (vst (map (λ (vs) (cons (list x true) vs)) vss)) + (vsf (map (λ (vs) (cons (list x false) vs)) vss))) + (append vst vsf)))) + +(define (eval-formula f evaluation) + (cond [(var? f) + (let ((val (assoc f evaluation))) + (if (not val) + (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation) + (cadr val)))] + [(neg? f) (not (eval-formula (neg-subf f) evaluation))] + [(disj? f) (or (eval-formula (disj-left f) evaluation) + (eval-formula (disj-right f) evaluation))] + [(conj? f) (and (eval-formula (conj-left f) evaluation) + (eval-formula (conj-right f) evaluation))] + [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)])) + +(define (falsifiable-eval? f) + (let* ((evaluations (gen-vals (free-vars f))) + (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations))) + (ormap false? results))) + +(define (nff? f) + (cond [(lit? f) true] + [(neg? f) false] + [(conj? f) (and (nff? (conj-left f)) + (nff? (conj-right f)))] + [(disj? f) (and (nff? (disj-left f)) + (nff? (disj-right f)))] + [else (error "Zła formuła -- NFF?" f)])) + +(define (convert-to-nnf f) + (cond [(lit? f) f] + [(neg? f) (convert-negation (neg-subf f))] + [(conj? f) (conj (convert-to-nnf (conj-left f)) + (convert-to-nnf (conj-right f)))] + [(disj? f) (disj (convert-to-nnf (disj-left f)) + (convert-to-nnf (disj-right f)))] + [else (error "Zła formuła -- CONVERT" f)])) + +(define (convert-negation f) + (cond [(lit? f) + (if (var? f) + (neg f) + (neg-subf f))] + [(neg? f) (convert-to-nnf (neg-subf f))] + [(conj? f) (disj (convert-negation (conj-left f)) + (convert-negation (conj-right f)))] + [(disj? f) (conj (convert-negation (disj-left f)) + (convert-negation (disj-right f)))] + [else (error "Zła formuła -- CONVERT-NEGATION" f)])) + +(define (clause? x) + (and (list? x) + (andmap lit? x))) + +(define (clause-empty? x) + (and (clause? x) + (null? x))) + +(define (cnf? x) + (and (list? x) + (andmap clause? x))) + +(define (flatmap proc seq) + (foldl append null (map proc seq))) + +(define (convert-to-cnf f) + (define (convert f) + (cond [(lit? f) (list (list f))] + [(conj? f) (append (convert-to-cnf (conj-left f)) + (convert-to-cnf (conj-right f)))] + [(disj? f) + (let ((clause-left (convert-to-cnf (disj-left f))) + (clause-right (convert-to-cnf (disj-right f)))) + (flatmap (λ (clause) + (map (λ (clause2) + (append clause2 clause)) clause-left)) + clause-right))])) + (convert (convert-to-nnf f))) + +(define (falsifiable-clause? clause) + (cond [(clause-empty? clause) true] + [(lit? (findf (λ (l) (equal? + l + (convert-to-nnf (neg (car clause))))) + clause)) false] + [else (falsifiable-clause? (cdr clause))])) + +(define (falsifiable-cnf? f) + (define (neg-value lit) + (if (var? lit) + (list lit false) + (list (neg-subf lit) true))) + (ormap (λ (clause) (if (falsifiable-clause? clause) + (map neg-value clause) + false)) + (convert-to-cnf f))) \ No newline at end of file diff --git a/semestr-2/racket/lista5/skrr/solution.rkt b/semestr-2/racket/lista5/skrr/solution.rkt new file mode 100644 index 0000000..e8efbc9 --- /dev/null +++ b/semestr-2/racket/lista5/skrr/solution.rkt @@ -0,0 +1,88 @@ +#lang racket + +(require "props.rkt") +(provide falsifiable-cnf?) + +(define (lit? f) + (or (var? f) + (and (neg? f) + (var? (neg-subf f))))) + +(define (lit-pos v) + v) + +(define (lit-neg v) + (neg v)) + +(define (lit-var l) + (if (var? l) + l + (neg-subf l))) + +(define (lit-pos? l) + (var? l)) + +(define (to-nnf f) + (cond + [(var? f) (lit-pos f)] + [(neg? f) (to-nnf-neg (neg-subf f))] + [(conj? f) (conj (to-nnf (conj-left f)) + (to-nnf (conj-right f)))] + [(disj? f) (disj (to-nnf (disj-left f)) + (to-nnf (disj-right f)))])) + +(define (to-nnf-neg f) + (cond + [(var? f) (lit-neg f)] + [(neg? f) (to-nnf (neg-subf f))] + [(conj? f) (disj (to-nnf-neg (conj-left f)) + (to-nnf-neg (conj-right f)))] + [(disj? f) (conj (to-nnf-neg (disj-left f)) + (to-nnf-neg (disj-right f)))])) + +(define (mk-cnf xss) + (cons 'cnf xss)) + +(define (clause? f) + (and (list? f) + (andmap lit? f))) + +(define (cnf? f) + (and (pair? f) + (eq? 'cnf (car f)) + (list? (cdr f)) + (andmap clause? (cdr f)))) + +(define (to-cnf f) + (define (join xss yss) + (apply append (map (lambda (xs) (map (lambda (ys) (append xs ys)) yss)) xss))) + (define (go f) + (cond + [(lit? f) (list (list f))] + [(conj? f) (append (go (conj-left f)) + (go (conj-right f)))] + [(disj? f) (join (go (disj-left f)) + (go (disj-right f)))])) + (mk-cnf (go f))) + +(define (clause-empty? x) + (and (clause? x) + (null? x))) + +(define (falsifiable-clause? clause) + (cond [(clause-empty? clause) true] + [(lit? (findf (λ (l) (equal? + l + (to-nnf (neg (car clause))))) + clause)) false] + [else (falsifiable-clause? (cdr clause))])) + +(define (falsifiable-cnf? f) + (define (neg-value lit) + (if (var? lit) + (list lit false) + (list (neg-subf lit) true))) + (ormap (λ (clause) (if (falsifiable-clause? clause) + (map neg-value clause) + false)) + (convert-to-cnf f))) \ No newline at end of file diff --git a/semestr-2/racket/lista5/sol2.rkt b/semestr-2/racket/lista5/sol2.rkt new file mode 100644 index 0000000..d037472 --- /dev/null +++ b/semestr-2/racket/lista5/sol2.rkt @@ -0,0 +1,90 @@ +#lang racket +(provide falsifiable-cnf?) (require "props.rkt") + + +(define (falsifiable-cnf? p) + ;literał + (define (lit? p) + (or (var? p) + (and (neg? p) (var? (neg-subf p))) + )) + + (define (lit-pos? p) + (if (lit? p) + (var? p) + (error "not a literal" p) + )) + + (define (lit-var p) + (cond + [(not (lit? p)) (error "not a literal" p)] + [(lit-pos? p) p] + [else (neg-subf p)] + )) + + (define (contr p) + (if (lit? p) + (if (neg? p) (neg-subf p) (neg p)) + (error "not a literal" p) + )) + + ;konwertowanie + (define (convert-to-cnf p) + (define (convert-to-nnf p) + (cond + [(lit? p) p] + [(and (neg? p) (conj? (neg-subf p))) + (let ((A (neg-subf p))) + (disj (convert-to-nnf (neg (conj-left A))) (convert-to-nnf (neg (conj-right A)))))] + [(and (neg? p) (disj? (neg-subf p))) + (let ((A (neg-subf p))) + (conj (convert-to-nnf (neg (disj-left A))) (convert-to-nnf (neg (disj-right A)))))] + [(and (neg? p) (neg? (neg-subf p))) (convert-to-nnf (neg-subf (neg-subf p)))] + [(conj? p) (conj (convert-to-nnf (conj-right p)) (convert-to-nnf (conj-left p)))] + [(disj? p) (disj (convert-to-nnf (disj-right p)) (convert-to-nnf (disj-left p)))] + [else (error "not a proposition" p)])) + + (define (flatmap proc seq) + (foldr append null (map proc seq))) + + (define (merge a b) + (flatmap (lambda (c) (map (lambda (c2) (append c c2)) b)) a)) + + (define (convert p) + (cond + [(lit? p) (list (list p))] + [(conj? p) (append (convert (conj-left p)) (convert (conj-right p)))] + [(disj? p) (let* ((L (convert (disj-left p))) (R (convert (disj-right p)))) + (merge L R))] + [else (error "it should never be here" p)] + )) + + (map (lambda (c) (remove-duplicates c)) (convert (convert-to-nnf p)))) + + ;prawdziwa funkcja + (define cnf (convert-to-cnf p)) + + (define (falsifiable-clause? c) + (cond + [(null? c) #t] + [(eq? #f (member (contr (car c)) c)) (falsifiable-clause? (cdr c))] + [else #f] + )) + + (define (falsified-clause c) + (if (null? c) + null + (cons (list (lit-var (car c)) (not (lit-pos? (car c)))) (falsified-clause (cdr c))) + )) + + (define (falsified-val p) + (cond + [(null? p) false] + [(falsifiable-clause? (car p)) (falsified-clause (car p))] + [else (falsified-val (cdr p))] + ) + ) + (falsified-val cnf)) + + +;złożoność wykładnicza tak jak falsible-eval ale często w praktyce szybsza jak nie ma za dużo alternatyw. \ No newline at end of file diff --git a/semestr-2/racket/lista5/solution.bak b/semestr-2/racket/lista5/solution.bak new file mode 100644 index 0000000..72c7f36 --- /dev/null +++ b/semestr-2/racket/lista5/solution.bak @@ -0,0 +1,135 @@ +#lang racket + +(provide falsifiable-cnf?) +(require "props.rkt") + +(define (prop? f) + (or (var? f) + (and (neg? f) + (prop? (neg-subf f))) + (and (disj? f) + (prop? (disj-left f)) + (prop? (disj-right f))) + (and (conj? f) + (prop? (conj-left f)) + (prop? (conj-right f))))) + +(define (lit-var f) + (cond [(var? f) f] + [(neg? f) (neg-subf f)] + [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)])) + +(define (free-vars f) + (cond [(null? f) null] + [(var? f) (list f)] + [(neg? f) (free-vars (neg-subf f))] + [(conj? f) (append (free-vars (conj-left f)) + (free-vars (conj-right f)))] + [(disj? f) (append (free-vars (disj-left f)) + (free-vars (disj-right f)))] + [else (error "Zła formula -- FREE-VARS" f)])) + +(define (gen-vals xs) + (if (null? xs) + (list null) + (let* + ((vss (gen-vals (cdr xs))) + (x (car xs)) + (vst (map (λ (vs) (cons (list x true) vs)) vss)) + (vsf (map (λ (vs) (cons (list x false) vs)) vss))) + (append vst vsf)))) + +(define (eval-formula f evaluation) + (cond [(var? f) + (let ((val (assoc f evaluation))) + (if (not val) + (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation) + (cadr val)))] + [(neg? f) (not (eval-formula (neg-subf f) evaluation))] + [(disj? f) (or (eval-formula (disj-left f) evaluation) + (eval-formula (disj-right f) evaluation))] + [(conj? f) (and (eval-formula (conj-left f) evaluation) + (eval-formula (conj-right f) evaluation))] + [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)])) + +(define (falsifiable-eval? f) + (let* ((evaluations (gen-vals (free-vars f))) + (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations))) + (ormap false? results))) + +(define (nff? f) + (cond [(lit? f) true] + [(neg? f) false] + [(conj? f) (and (nff? (conj-left f)) + (nff? (conj-right f)))] + [(disj? f) (and (nff? (disj-left f)) + (nff? (disj-right f)))] + [else (error "Zła formuła -- NFF?" f)])) + +(define (convert-to-nnf f) + (cond [(lit? f) f] + [(neg? f) (convert-negation (neg-subf f))] + [(conj? f) (conj (convert-to-nnf (conj-left f)) + (convert-to-nnf (conj-right f)))] + [(disj? f) (disj (convert-to-nnf (disj-left f)) + (convert-to-nnf (disj-right f)))] + [else (error "Zła formuła -- CONVERT" f)])) + +(define (convert-negation f) + (cond [(lit? f) + (if (var? f) + (neg f) + (neg-subf f))] + [(neg? f) (convert-to-nnf (neg-subf f))] + [(conj? f) (disj (convert-negation (conj-left f)) + (convert-negation (conj-right f)))] + [(disj? f) (conj (convert-negation (disj-left f)) + (convert-negation (disj-right f)))] + [else (error "Zła formuła -- CONVERT-NEGATION" f)])) + +(define (clause? x) + (and (list? x) + (andmap lit? x))) + +(define (clause-empty? x) + (and (clause? x) + (null? x))) + +(define (cnf? x) + (and (list? x) + (andmap clause? x))) + +(define (flatmap proc seq) + (foldl append null (map proc seq))) + +(define (convert-to-cnf f) + (define (convert f) + (cond [(lit? f) (list (list f))] + [(conj? f) (append (convert-to-cnf (conj-left f)) + (convert-to-cnf (conj-right f)))] + [(disj? f) + (let ((clause-left (convert-to-cnf (disj-left f))) + (clause-right (convert-to-cnf (disj-right f)))) + (flatmap (λ (clause) + (map (λ (clause2) + (append clause2 clause)) clause-left)) + clause-right))])) + (convert (convert-to-nnf f))) + +(define (falsifiable-clause? clause) + (cond [(clause-empty? clause) true] + [(lit? (findf (λ (l) (equal? + l + (convert-to-nnf (neg (car clause))))) + clause)) false] + [else (falsifiable-clause? (cdr clause))])) + +(define (falsifiable-cnf? f) + (define (neg-value lit) + (if (var? lit) + (list lit false) + (list (neg-subf lit) true))) + (ormap (λ (clause) (if (falsifiable-clause? clause) + (map neg-value clause) + false)) + (convert-to-cnf f))) \ No newline at end of file diff --git a/semestr-2/racket/lista5/solution.rkt b/semestr-2/racket/lista5/solution.rkt new file mode 100644 index 0000000..67964d8 --- /dev/null +++ b/semestr-2/racket/lista5/solution.rkt @@ -0,0 +1,140 @@ +#lang racket + +(provide falsifiable-cnf?) +(require "props.rkt") + +(define (prop? f) + (or (var? f) + (and (neg? f) + (prop? (neg-subf f))) + (and (disj? f) + (prop? (disj-left f)) + (prop? (disj-right f))) + (and (conj? f) + (prop? (conj-left f)) + (prop? (conj-right f))))) + +(define (lit? t) + (or (var? t) + (and (neg? t) + (var? (neg-subf t))))) + +(define (lit-var f) + (cond [(var? f) f] + [(neg? f) (neg-subf f)] + [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)])) + +(define (free-vars f) + (cond [(null? f) null] + [(var? f) (list f)] + [(neg? f) (free-vars (neg-subf f))] + [(conj? f) (append (free-vars (conj-left f)) + (free-vars (conj-right f)))] + [(disj? f) (append (free-vars (disj-left f)) + (free-vars (disj-right f)))] + [else (error "Zła formula -- FREE-VARS" f)])) + +(define (gen-vals xs) + (if (null? xs) + (list null) + (let* + ((vss (gen-vals (cdr xs))) + (x (car xs)) + (vst (map (λ (vs) (cons (list x true) vs)) vss)) + (vsf (map (λ (vs) (cons (list x false) vs)) vss))) + (append vst vsf)))) + +(define (eval-formula f evaluation) + (cond [(var? f) + (let ((val (assoc f evaluation))) + (if (not val) + (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation) + (cadr val)))] + [(neg? f) (not (eval-formula (neg-subf f) evaluation))] + [(disj? f) (or (eval-formula (disj-left f) evaluation) + (eval-formula (disj-right f) evaluation))] + [(conj? f) (and (eval-formula (conj-left f) evaluation) + (eval-formula (conj-right f) evaluation))] + [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)])) + +(define (falsifiable-eval? f) + (let* ((evaluations (gen-vals (free-vars f))) + (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations))) + (ormap false? results))) + +(define (nff? f) + (cond [(lit? f) true] + [(neg? f) false] + [(conj? f) (and (nff? (conj-left f)) + (nff? (conj-right f)))] + [(disj? f) (and (nff? (disj-left f)) + (nff? (disj-right f)))] + [else (error "Zła formuła -- NFF?" f)])) + +(define (convert-to-nnf f) + (cond [(lit? f) f] + [(neg? f) (convert-negation (neg-subf f))] + [(conj? f) (conj (convert-to-nnf (conj-left f)) + (convert-to-nnf (conj-right f)))] + [(disj? f) (disj (convert-to-nnf (disj-left f)) + (convert-to-nnf (disj-right f)))] + [else (error "Zła formuła -- CONVERT" f)])) + +(define (convert-negation f) + (cond [(lit? f) + (if (var? f) + (neg f) + (neg-subf f))] + [(neg? f) (convert-to-nnf (neg-subf f))] + [(conj? f) (disj (convert-negation (conj-left f)) + (convert-negation (conj-right f)))] + [(disj? f) (conj (convert-negation (disj-left f)) + (convert-negation (disj-right f)))] + [else (error "Zła formuła -- CONVERT-NEGATION" f)])) + +(define (clause? x) + (and (list? x) + (andmap lit? x))) + +(define (clause-empty? x) + (and (clause? x) + (null? x))) + +(define (cnf? x) + (and (list? x) + (andmap clause? x))) + +(define (flatmap proc seq) + (foldl append null (map proc seq))) + +(define (convert-to-cnf f) + (define (convert f) + (cond [(lit? f) (list (list f))] + [(conj? f) (append (convert-to-cnf (conj-left f)) + (convert-to-cnf (conj-right f)))] + [(disj? f) + (let ((clause-left (convert-to-cnf (disj-left f))) + (clause-right (convert-to-cnf (disj-right f)))) + (flatmap (λ (clause) + (map (λ (clause2) + (append clause2 clause)) clause-left)) + clause-right))])) + (map (lambda (clause) (remove-duplicates clause)) (convert (convert-to-nnf f)))) + +(define (falsifiable-clause? clause) + (cond [(clause-empty? clause) true] + [(lit? (findf (λ (l) (equal? + l + (convert-to-nnf (neg (car clause))))) + clause)) false] + [else (falsifiable-clause? (cdr clause))])) + +(define (falsifiable-cnf? f) + (define (neg-value lit) + (if (var? lit) + (list lit false) + (list (neg-subf lit) true))) + (ormap (λ (clause) (if (falsifiable-clause? clause) + (map neg-value clause) + false)) + (convert-to-cnf f))) \ No newline at end of file diff --git a/semestr-2/racket/lista5/xd.bak b/semestr-2/racket/lista5/xd.bak new file mode 100644 index 0000000..d814e10 --- /dev/null +++ b/semestr-2/racket/lista5/xd.bak @@ -0,0 +1,4 @@ +#lang racket + +(require "solution.rkt") + diff --git a/semestr-2/racket/lista5/xd.rkt b/semestr-2/racket/lista5/xd.rkt new file mode 100644 index 0000000..64ce78c --- /dev/null +++ b/semestr-2/racket/lista5/xd.rkt @@ -0,0 +1,4 @@ +#lang racket + +(require "solution.rkt") +(require "props.rkt") diff --git a/semestr-2/racket/lista6/lista8/kappa.py b/semestr-2/racket/lista6/lista8/kappa.py new file mode 100644 index 0000000..f359d5c --- /dev/null +++ b/semestr-2/racket/lista6/lista8/kappa.py @@ -0,0 +1,13 @@ +import pylab + +a = int(input("podaj liczbe: ")) +b = int(input("podaj liczbe: ")) + +x = range(-10, 11) +y = [] +for i in x: + y.append(a * i + b) +pylab.plot(x, y) +pylab.title('Wykres f(x) = a*x - b') +pylab.grid(True) +pylab.show() diff --git a/semestr-2/racket/lista6/lista8/zad1.bak b/semestr-2/racket/lista6/lista8/zad1.bak new file mode 100644 index 0000000..0960f21 --- /dev/null +++ b/semestr-2/racket/lista6/lista8/zad1.bak @@ -0,0 +1,98 @@ +#lang racket + +; Do let-env.rkt dodajemy wartosci boolowskie +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] ; <----------------- !!! + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) ; <--------------------------------------- !!! + (and (expr? eb) (expr? et) (expr? ef))] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] ; <---------------------------- !!! + [(eq? q 'false) (const false)] ; <---------------------------- !!! + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) ; <--- !!! + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(define (value? v) + (or (number? v) (boolean? v))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] ; <----------- !!! + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!! + (eval-env et env) + (eval-env ef env))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(if (or (< (% 123 10) 5) + true) + (+ 2 3) + (/ 2 0))) + +(define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/lista6/lista8/zad1.rkt b/semestr-2/racket/lista6/lista8/zad1.rkt new file mode 100644 index 0000000..1cd6b0b --- /dev/null +++ b/semestr-2/racket/lista6/lista8/zad1.rkt @@ -0,0 +1,104 @@ +#lang racket + +; Do let-env.rkt dodajemy wartosci boolowskie +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] ; <----------------- !!! + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) ; <--------------------------------------- !!! + (and (expr? eb) (expr? et) (expr? ef))] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] ; <---------------------------- !!! + [(eq? q 'false) (const false)] ; <---------------------------- !!! + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) ; <--- !!! + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'and)) + (if-expr (parse (second q)) + (parse (third q)) + (const false))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'or)) + (if-expr (parse (second q)) + (const true) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(define (value? v) + (or (number? v) (boolean? v))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] ; <----------- !!! + ['= =] ['> >] ['>= >=] ['< <] ['<= <=])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!! + (eval-env et env) + (eval-env ef env))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(if (or (< (% 123 10) 5) + true) + (+ 2 3) + (/ 2 0))) + +(define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/lista6/lista8/zad4.bak b/semestr-2/racket/lista6/lista8/zad4.bak new file mode 100644 index 0000000..503099d --- /dev/null +++ b/semestr-2/racket/lista6/lista8/zad4.bak @@ -0,0 +1,114 @@ +#lang racket + +; Do boolean.rkt dodajemy pary +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) ; <------------------- !!! +(struct car-expr (e) #:transparent) ; <------------------- !!! +(struct cdr-expr (e) #:transparent) ; <------------------- !!! + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] ; <----------- !!! + [(car-expr e) (expr? e)] ; <---------------------------------- !!! + [(cdr-expr e) (expr? e)] ; <---------------------------------- !!! + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) ; <- !!! + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) ; <-- !!! + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) ; <-- !!! + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) ; <---------------- !!! + (eval-env e2 env))] + [(car-expr e) (car (eval-env e env))] ; <--------------------- !!! + [(cdr-expr e) (cdr (eval-env e env))])) ; <------------------- !!! + +(define (eval e) (eval-env e env-empty)) + +(define program + '(car (if true (cons 1 2) false))) + +(define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/lista6/lista8/zad4.rkt b/semestr-2/racket/lista6/lista8/zad4.rkt new file mode 100644 index 0000000..7934435 --- /dev/null +++ b/semestr-2/racket/lista6/lista8/zad4.rkt @@ -0,0 +1,118 @@ +#lang racket + +; Do boolean.rkt dodajemy pary +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) ; <------------------- !!! +(struct car-expr (e) #:transparent) ; <------------------- !!! +(struct cdr-expr (e) #:transparent) ; <------------------- !!! +(struct is-pair (e) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] ; <----------- !!! + [(car-expr e) (expr? e)] ; <---------------------------------- !!! + [(cdr-expr e) (expr? e)] ; <---------------------------------- !!! + [(is-pair e) (expr? e)] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) ; <- !!! + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) ; <-- !!! + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) ; <-- !!! + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'pair?)) + (is-pair (parse (second q)))])) + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) ; <---------------- !!! + (eval-env e2 env))] + [(car-expr e) (car (eval-env e env))] ; <--------------------- !!! + [(cdr-expr e) (cdr (eval-env e env))] ; <------------------- !!! + [(is-pair e) (cons? (eval-env e env))])) +(define (eval e) (eval-env e env-empty)) + +(define program + '(car (if true (cons 1 2) false))) + +(define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/lista6/lista8/zad5.bak b/semestr-2/racket/lista6/lista8/zad5.bak new file mode 100644 index 0000000..6f1f7b4 --- /dev/null +++ b/semestr-2/racket/lista6/lista8/zad5.bak @@ -0,0 +1 @@ +#lang racket diff --git a/semestr-2/racket/lista6/lista8/zad5.rkt b/semestr-2/racket/lista6/lista8/zad5.rkt new file mode 100644 index 0000000..721f5bf --- /dev/null +++ b/semestr-2/racket/lista6/lista8/zad5.rkt @@ -0,0 +1,151 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct unop (op e) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! + + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (symbol? (first q))) + (unop (first q) (parse (second q)))])) + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + ['not not] ['car car] ['cdr cdr] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(unop op e) ((op->proc op) (eval-env e env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(let [twice (lambda (f x) (f (f x)))] + (let [inc (lambda (x) (+ 1 x))] + (twice twice twice twice inc 1)))) + + +(define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/lista6/lista8/zad6.bak b/semestr-2/racket/lista6/lista8/zad6.bak new file mode 100644 index 0000000..721f5bf --- /dev/null +++ b/semestr-2/racket/lista6/lista8/zad6.bak @@ -0,0 +1,151 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct unop (op e) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! + + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (symbol? (first q))) + (unop (first q) (parse (second q)))])) + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + ['not not] ['car car] ['cdr cdr] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(unop op e) ((op->proc op) (eval-env e env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(let [twice (lambda (f x) (f (f x)))] + (let [inc (lambda (x) (+ 1 x))] + (twice twice twice twice inc 1)))) + + +(define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/lista6/lista8/zad6.rkt b/semestr-2/racket/lista6/lista8/zad6.rkt new file mode 100644 index 0000000..c7ea9f0 --- /dev/null +++ b/semestr-2/racket/lista6/lista8/zad6.rkt @@ -0,0 +1,171 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct unop (op e) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(unop op e) (and (symbol? op) (expr? e))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [_ false])) + +(define (cedar? f) + (let ((letters (string->list (symbol->string f)))) + (and (> (length letters) 2) + (eq? (first letters) #\c) + (eq? (first (reverse letters)) #\r) + (andmap (lambda (x) (or (eq? x #\a) (eq? x #\d))) + (cdr letters))))) + +(define (get-cedar letters xs) + (cond [(eq? (car letters) #\r) xs] + [(eq? (car letters) #\a) (unop 'car (get-cedar (cdr letters) xs))] + [(eq? (car letters) #\d) (unop 'cdr (get-cedar (cdr letters) xs))])) + +(define (cedar f xs) + (let ((letters (string->list (symbol->string f)))) + (get-cedar (cdr (reverse letters)) xs))) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (symbol? (first q))) + (unop (first q) (parse (second q)))])) + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + ['not not] ['car car] ['cdr cdr] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(unop op e) ((op->proc op) (eval-env e env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(let [twice (lambda (f x) (f (f x)))] + (let [inc (lambda (x) (+ 1 x))] + (twice twice twice twice inc 1)))) + + +(define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/lista6/lista8/zadanie.rkt b/semestr-2/racket/lista6/lista8/zadanie.rkt new file mode 100644 index 0000000..0960f21 --- /dev/null +++ b/semestr-2/racket/lista6/lista8/zadanie.rkt @@ -0,0 +1,98 @@ +#lang racket + +; Do let-env.rkt dodajemy wartosci boolowskie +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] ; <----------------- !!! + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) ; <--------------------------------------- !!! + (and (expr? eb) (expr? et) (expr? ef))] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] ; <---------------------------- !!! + [(eq? q 'false) (const false)] ; <---------------------------- !!! + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) ; <--- !!! + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(define (value? v) + (or (number? v) (boolean? v))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] ; <----------- !!! + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!! + (eval-env et env) + (eval-env ef env))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(if (or (< (% 123 10) 5) + true) + (+ 2 3) + (/ 2 0))) + +(define (test-eval) (eval (parse program))) \ No newline at end of file diff --git a/semestr-2/racket/lista6/solution.bak b/semestr-2/racket/lista6/solution.bak new file mode 100644 index 0000000..0805991 --- /dev/null +++ b/semestr-2/racket/lista6/solution.bak @@ -0,0 +1,27 @@ +#lang racket + +(provide (struct-out complex) parse eval) + +(struct complex (re im) #:transparent) + +(define value? + complex?) + +;; Ponizej znajduje sie interpreter zwyklych wyrazen arytmetycznych. +;; Zadanie to zmodyfikowac go tak, by dzialal z liczbami zespolonymi. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /])) + +(define (eval e) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval l) (eval r))])) + +(define (parse q) + (cond [(number? q) (const q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) (parse (second q)) (parse (third q)))])) \ No newline at end of file diff --git a/semestr-2/racket/lista6/solution.rkt b/semestr-2/racket/lista6/solution.rkt new file mode 100644 index 0000000..59bdecd --- /dev/null +++ b/semestr-2/racket/lista6/solution.rkt @@ -0,0 +1,73 @@ +#lang racket + +(provide (struct-out complex) parse eval) + +(struct complex (re im) #:transparent) + +(define value? + complex?) + +(define (comp-plus x y) + (let ((x-re (complex-re x)) + (x-im (complex-im x)) + (y-re (complex-re y)) + (y-im (complex-im y))) + (complex (+ x-re y-re) (+ x-im y-im)))) + +(define (comp-minus x y) + (let ((x-re (complex-re x)) + (x-im (complex-im x)) + (y-re (complex-re y)) + (y-im (complex-im y))) + (complex (- x-re y-re) (- x-im y-im)))) + +(define (comp-mult x y) + (let ((x-re (complex-re x)) + (x-im (complex-im x)) + (y-re (complex-re y)) + (y-im (complex-im y))) + (complex (- (* x-re y-re) (* x-im y-im)) (+ (* x-re y-im) (* x-im y-re))))) + +(define (comp-mod2 x) + (let ((x-re (complex-re x)) + (x-im (complex-im x))) + (complex (+ (* x-re x-re) (* x-im x-im)) 0))) + +(define (comp-mod x) + (let ((mod2 (comp-mod2 x)) + (x-re (complex-re x))) + (complex (sqrt x-re) 0))) + +(define (comp-div x y) + (let* ((mod2 (complex-re (comp-mod2 y))) + (x-re (complex-re x)) + (x-im (complex-im x)) + (y-re (complex-re y)) + (y-im (complex-im y)) + (real (+ (* x-re y-re) (* x-im y-im))) + (imag (- (* x-im y-re) (* x-re y-im)))) + (complex (/ real mod2) (/ imag mod2)))) + + +;; Ponizej znajduje sie interpreter zwyklych wyrazen arytmetycznych. +;; Zadanie to zmodyfikowac go tak, by dzialal z liczbami zespolonymi. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (imaginary-unit? c) + (eq? c 'i)) + +(define (op->proc op) + (match op ['+ comp-plus] ['- comp-minus] ['* comp-mult] ['/ comp-div])) + +(define (eval e) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval l) (eval r))])) + +(define (parse q) + (cond [(number? q) (const (complex q 0))] + [(imaginary-unit? q) (const (complex 0 1))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) (parse (second q)) (parse (third q)))])) \ No newline at end of file diff --git a/semestr-2/racket/lista6/zad11/solution.bak b/semestr-2/racket/lista6/zad11/solution.bak new file mode 100644 index 0000000..f449481 --- /dev/null +++ b/semestr-2/racket/lista6/zad11/solution.bak @@ -0,0 +1,36 @@ +#lang racket + +(provide (struct-out const) (struct-out binop) rpn->arith) + +;; ------------------------------- +;; Wyrazenia w odwr. not. polskiej +;; ------------------------------- + +(define (rpn-expr? e) + (and (list? e) + (pair? e) + (andmap (lambda (x) (or (number? x) (member x '(+ - * /)))) + e))) + +;; ---------------------- +;; Wyrazenia arytmetyczne +;; ---------------------- + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (arith-expr? e) + (match e + [(const n) (number? n)] + [(binop op l r) + (and (symbol? op) (arith-expr? l) (arith-expr? r))] + [_ false])) + +;; ---------- +;; Kompilacja +;; ---------- + +(define (rpn->arith e) + (error "TODO: Uzupelnij tutaj")) + +; Mozesz tez dodac jakies procedury pomocnicze i testy \ No newline at end of file diff --git a/semestr-2/racket/lista6/zad11/solution.rkt b/semestr-2/racket/lista6/zad11/solution.rkt new file mode 100644 index 0000000..a44afe4 --- /dev/null +++ b/semestr-2/racket/lista6/zad11/solution.rkt @@ -0,0 +1,58 @@ +#lang racket + +(provide (struct-out const) (struct-out binop) rpn->arith) + +;; ------------------------------- +;; Wyrazenia w odwr. not. polskiej +;; ------------------------------- + +(define (rpn-expr? e) + (and (list? e) + (pair? e) + (andmap (lambda (x) (or (number? x) (member x '(+ - * /)))) + e))) + +;; ---------------------- +;; Wyrazenia arytmetyczne +;; ---------------------- + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (arith-expr? e) + (match e + [(const n) (number? n)] + [(binop op l r) + (and (symbol? op) (arith-expr? l) (arith-expr? r))] + [_ false])) + +;; ---------- +;; Kompilacja +;; ---------- + +(struct stack (xs)) + +(define empty-stack (stack null)) +(define (empty-stack? s) (null? (stack-xs s))) +(define (top s) (car (stack-xs s))) +(define (push a s) (stack (cons a (stack-xs s)))) +(define (pop s) (stack (cdr (stack-xs s)))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /])) + +(define (eval-am e s) + (cond [(null? e) + (top s)] + [(number? (car e)) + (eval-am (cdr e) (push (const (car e)) s))] + [(symbol? (car e)) + (eval-am (cdr e) + (push (binop (car e) (top (pop s)) (top s)) + (pop (pop s))))])) + +(define (rpn->arith e) + (eval-am e empty-stack)) + + +; Mozesz tez dodac jakies procedury pomocnicze i testy \ No newline at end of file diff --git a/semestr-2/racket/luk.rkt b/semestr-2/racket/luk.rkt new file mode 100644 index 0000000..cc319a5 --- /dev/null +++ b/semestr-2/racket/luk.rkt @@ -0,0 +1,137 @@ +#lang typed/racket + +; Do let-env.rkt dodajemy wartosci boolowskie +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; +(provide parse typecheck) + +(define-type Value (U Boolean Real)) +(define-type Expr (U const binop var-expr let-expr if-expr)) +(define-type ArithSymbol (U '+ '- '* '/)) +(define-type LogicSymbol (U 'and 'or)) +(define-type CompSymbol (U '< '= '> '<= '>=)) +(define-type BinomSymbol (U ArithSymbol LogicSymbol CompSymbol)) + +(define-type Binop-list (List BinomSymbol Any Any)) +(define-type Let-list (List 'let (List Symbol Any) Any)) +(define-type If-list (List 'if Any Any Any)) + +(define-predicate Binop-list? Binop-list) +(define-predicate Let-list? Let-list) +(define-predicate If-list? If-list) + +(struct const ([val : Value]) #:transparent) +(struct binop ([op : BinomSymbol] [l : Expr] [r : Expr]) #:transparent) +(struct var-expr ([id : Symbol]) #:transparent) +(struct let-expr ([id : Symbol] [e1 : Expr] [e2 : Expr]) #:transparent) +(struct if-expr ([eb : Expr] [et : Expr] [ef : Expr]) #:transparent) + +(define-predicate Value? Value) +(define-predicate Expr? Expr) +(define-predicate BinomSymbol? BinomSymbol) +(define-predicate ArithSymbol? ArithSymbol) +(define-predicate LogicSymbol? LogicSymbol) +(define-predicate CompSymbol? CompSymbol) +(define-predicate BinomValue? BinomValue) + + + +(: parse (-> Any Expr)) +(define (parse q) + (cond + [(real? q) (const q)] + [(eq? q 'true) (const true)] ; <---------------------------- !!! + [(eq? q 'false) (const false)] ; <---------------------------- !!! + [(symbol? q) (var-expr q)] + [(Let-list? q) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(If-list? q) ; <--- !!! + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(Binop-list? q) + (binop (first q) + (parse (second q)) + (parse (third q)))] + [else (error "Blad parsowania" q)])) + + + + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; +(define-type EType ( U 'real 'boolean ) ) +(define-type Env (Listof (Pairof Symbol EType))) +(define-predicate Env? Env) +(struct environ ([xs : Env])) + +(: env-empty environ) +(define env-empty (environ null)) +(: env-add (-> Symbol EType environ environ)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(: env-lookup (-> Symbol environ (U EType #f))) +(define (env-lookup x env) + (: assoc-lookup (-> Env EType)) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + + +(: typecheck (-> Expr (U EType #f))) +(define (typecheck q) + (: give (-> Expr environ (U EType #f))) + (define (give q envi) + (cond + [(const? q) (if (boolean? (const-val q)) 'boolean 'real)] + [(var-expr? q) (env-lookup (var-expr-id q) envi)] + [(let-expr? q) + (let ([p (give (let-expr-e1 q) envi)]) (if (false? p) #f (give (let-expr-e2 q) (env-add (let-expr-id q) p envi))))] + [(binop? q) + (cond + ([ArithSymbol? (binop-op q)] (if (and (eq? 'real (give (binop-l q) envi)) (eq? 'real (give (binop-r q) envi))) 'real #f)) + ([LogicSymbol? (binop-op q)] (if (and (eq? 'boolean (give (binop-l q) envi)) (eq? 'boolean (give (binop-r q) envi))) 'boolean #f)) + ([CompSymbol? (binop-op q)] (if (and (eq? 'real (give (binop-l q) envi)) (eq? 'real (give (binop-r q) envi))) 'boolean #f)) + [else #f])] + [(if-expr? q) + (if (and (eq? 'real (if-expr-eb q)) + (eq? (give (if-expr-et q) envi) (give (if-expr-ef q) envi))) + (give (if-expr-et q) envi) + #f)] + [else #f])) + + + (give q env-empty)) + + + +(define program2 + '(if true + (let [x 5] (+ 5 false)) + (/ 2 2))) + +(define program3 + '(let [x (+ 2 3)] + (let [y (< 2 3)] + (+ x y)))) + +(define program4 + '(let [x (and true true)] x)) + +(define wtf + '(and true true)) + +(typecheck (parse program2)) +(typecheck (parse program3)) +(typecheck (parse program4)) diff --git a/semestr-2/racket/rac.rkt b/semestr-2/racket/rac.rkt new file mode 100644 index 0000000..8300208 --- /dev/null +++ b/semestr-2/racket/rac.rkt @@ -0,0 +1,371 @@ +#reader(lib"read.ss""wxme")WXME0109 ## +#| + This file uses the GRacket editor format. + Open this file in DrRacket version 7.6 or later to read it. + + Most likely, it was created by saving a program in DrRacket, + and it probably contains a program with non-text elements + (such as images or comment boxes). + + http://racket-lang.org/ +|# + 33 7 #"wxtext\0" +3 1 6 #"wxtab\0" +1 1 8 #"wximage\0" +2 0 8 #"wxmedia\0" +4 1 34 #"(lib \"syntax-browser.ss\" \"mrlib\")\0" +1 0 36 #"(lib \"cache-image-snip.ss\" \"mrlib\")\0" +1 0 68 +(0 + #"((lib \"image-core.ss\" \"mrlib\") (lib \"image-core-wxme.rkt\" \"mr" + #"lib\"))\0" +) 1 0 16 #"drscheme:number\0" +3 0 44 #"(lib \"number-snip.ss\" \"drscheme\" \"private\")\0" +1 0 36 #"(lib \"comment-snip.ss\" \"framework\")\0" +1 0 93 +(1 + #"((lib \"collapsed-snipclass.ss\" \"framework\") (lib \"collapsed-sni" + #"pclass-wxme.ss\" \"framework\"))\0" +) 0 0 43 #"(lib \"collapsed-snipclass.ss\" \"framework\")\0" +0 0 19 #"drscheme:sexp-snip\0" +0 0 29 #"drscheme:bindings-snipclass%\0" +1 0 101 +(2 + #"((lib \"ellipsis-snip.rkt\" \"drracket\" \"private\") (lib \"ellipsi" + #"s-snip-wxme.rkt\" \"drracket\" \"private\"))\0" +) 2 0 88 +(3 + #"((lib \"pict-snip.rkt\" \"drracket\" \"private\") (lib \"pict-snip.r" + #"kt\" \"drracket\" \"private\"))\0" +) 0 0 55 +#"((lib \"snip.rkt\" \"pict\") (lib \"snip-wxme.rkt\" \"pict\"))\0" +1 0 34 #"(lib \"bullet-snip.rkt\" \"browser\")\0" +0 0 25 #"(lib \"matrix.ss\" \"htdp\")\0" +1 0 22 #"drscheme:lambda-snip%\0" +1 0 29 #"drclickable-string-snipclass\0" +0 0 26 #"drracket:spacer-snipclass\0" +0 0 57 +#"(lib \"hrule-snip.rkt\" \"macro-debugger\" \"syntax-browser\")\0" +1 0 26 #"drscheme:pict-value-snip%\0" +0 0 45 #"(lib \"image-snipr.ss\" \"slideshow\" \"private\")\0" +1 0 38 #"(lib \"pict-snipclass.ss\" \"slideshow\")\0" +2 0 55 #"(lib \"vertical-separator-snip.ss\" \"stepper\" \"private\")\0" +1 0 18 #"drscheme:xml-snip\0" +1 0 31 #"(lib \"xml-snipclass.ss\" \"xml\")\0" +1 0 21 #"drscheme:scheme-snip\0" +2 0 34 #"(lib \"scheme-snipclass.ss\" \"xml\")\0" +1 0 10 #"text-box%\0" +1 0 32 #"(lib \"text-snipclass.ss\" \"xml\")\0" +1 0 1 6 #"wxloc\0" + 0 0 64 0 1 #"\0" +0 75 1 #"\0" +0 10 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 0 9 +#"Standard\0" +0 75 12 #"Courier New\0" +0 26 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 -1 -1 2 24 +#"framework:default-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 15 +#"text:ports out\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1 +-1 2 15 #"text:ports err\0" +0 -1 1 #"\0" +1 0 -1 -1 93 -1 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 17 +#"text:ports value\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 +-1 2 27 #"Matching Parenthesis Style\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 +-1 2 1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 37 +#"framework:syntax-color:scheme:symbol\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 38 +#"framework:syntax-color:scheme:keyword\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 +38 #"framework:syntax-color:scheme:comment\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 37 +#"framework:syntax-color:scheme:string\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 35 +#"framework:syntax-color:scheme:text\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 39 +#"framework:syntax-color:scheme:constant\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 49 +#"framework:syntax-color:scheme:hash-colon-keyword\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 42 +#"framework:syntax-color:scheme:parenthesis\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36 +#"framework:syntax-color:scheme:error\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 36 +#"framework:syntax-color:scheme:other\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 16 +#"Misspelled Text\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 +38 #"drracket:check-syntax:lexically-bound\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 28 +#"drracket:check-syntax:set!d\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 37 +#"drracket:check-syntax:unused-require\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36 +#"drracket:check-syntax:free-variable\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 31 +#"drracket:check-syntax:imported\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 47 +#"drracket:check-syntax:my-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 50 +#"drracket:check-syntax:their-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 48 +#"drracket:check-syntax:unk-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 +49 #"drracket:check-syntax:both-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 +26 #"plt:htdp:test-coverage-on\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 2 27 +#"plt:htdp:test-coverage-off\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 4 1 +#"\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 4 4 #"XML\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 2 37 #"plt:module-language:test-coverage-on\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 38 +#"plt:module-language:test-coverage-off\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 0 36 +#"mrlib/syntax-browser:subtitle-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 36 36 140 255 255 255 -1 +-1 0 42 #"mrlib/syntax-browser:focused-syntax-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 34 139 34 255 255 255 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 4 1 #"\0" +0 -1 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 100 0 0 0 0 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1 +-1 2 1 #"\0" +0 70 1 #"\0" +1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 148 0 211 0 0 0 -1 +-1 2 1 #"\0" +0 -1 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1 +-1 0 1 #"\0" +0 -1 1 #"\0" +0 12 -1 -1 -1 -1 -1 -1 0 0 1 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 2 1 #"\0" +0 -1 1 #"\0" +0 12 -1 -1 -1 -1 -1 -1 0 0 1 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 2 1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 200 0 0 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 255 255 0 -1 -1 + 0 122 0 28 3 12 #"#lang racket" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 6 #"define" +0 0 24 3 2 #" (" +0 0 14 3 6 #"fringe" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 15 3 4 #"cond" +0 0 24 3 3 #" ((" +0 0 14 3 5 #"null?" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 2 #") " +0 0 14 3 4 #"null" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 10 #" ((" +0 0 14 3 3 #"not" +0 0 24 3 2 #" (" +0 0 14 3 5 #"pair?" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 4 #")) (" +0 0 14 3 4 #"list" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 14 3 4 #"else" +0 0 24 3 2 #" (" +0 0 14 3 6 #"append" +0 0 24 3 2 #" (" +0 0 14 3 6 #"fringe" +0 0 24 3 2 #" (" +0 0 14 3 3 #"car" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 23 #" (" +0 0 14 3 6 #"fringe" +0 0 24 3 2 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 6 #"))))))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 6 #"define" +0 0 24 3 2 #" (" +0 0 14 3 7 #"subsets" +0 0 24 3 1 #" " +0 0 14 3 1 #"s" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 2 #"if" +0 0 24 3 2 #" (" +0 0 14 3 5 #"null?" +0 0 24 3 1 #" " +0 0 14 3 1 #"s" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 7 #" (" +0 0 14 3 4 #"list" +0 0 24 3 1 #" " +0 0 14 3 4 #"null" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 7 #" (" +0 0 15 3 3 #"let" +0 0 24 3 3 #" ((" +0 0 14 3 4 #"rest" +0 0 24 3 2 #" (" +0 0 14 3 7 #"subsets" +0 0 24 3 2 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 1 #"s" +0 0 24 3 4 #"))))" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 14 3 7 #"display" +0 0 24 3 1 #" " +0 0 14 3 1 #"s" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 14 3 7 #"newline" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 14 3 6 #"append" +0 0 24 3 1 #" " +0 0 14 3 4 #"rest" +0 0 24 3 2 #" (" +0 0 14 3 3 #"map" +0 0 24 3 2 #" (" +0 0 15 3 6 #"lambda" +0 0 24 3 2 #" (" +0 0 14 3 1 #"x" +0 0 24 3 3 #") (" +0 0 14 3 4 #"cons" +0 0 24 3 2 #" (" +0 0 14 3 3 #"car" +0 0 24 3 1 #" " +0 0 14 3 1 #"s" +0 0 24 3 2 #") " +0 0 14 3 1 #"x" +0 0 24 3 3 #")) " +0 0 14 3 4 #"rest" +0 0 24 3 5 #")))))" +0 0 24 29 1 #"\n" +0 0 24 3 2 #" " +0 0 diff --git a/semestr-2/racket/solution.rkt b/semestr-2/racket/solution.rkt new file mode 100644 index 0000000..3643668 --- /dev/null +++ b/semestr-2/racket/solution.rkt @@ -0,0 +1,14 @@ +#lang racket + +(provide heapsort) (require "leftist.rkt") + +(define (heapsort xs) + (define (create-heap xs res) + (if (null? xs) + res + (create-heap (cdr xs) (heap-insert (cons (car xs) (car xs)) res)))) + (define (heap-to-list h) + (if (heap-empty? h) + null + (cons (elem-val (heap-min h)) (heap-to-list (heap-pop h))))) + (heap-to-list (create-heap xs empty-heap))) \ No newline at end of file diff --git a/semestr-2/topo/106185944_268984110829847_6553948354204680381_n.jpg b/semestr-2/topo/106185944_268984110829847_6553948354204680381_n.jpg new file mode 100644 index 0000000..3e15629 Binary files /dev/null and b/semestr-2/topo/106185944_268984110829847_6553948354204680381_n.jpg differ diff --git a/semestr-2/topo/106656932_2682289525419459_8890828706710255563_n.jpg b/semestr-2/topo/106656932_2682289525419459_8890828706710255563_n.jpg new file mode 100644 index 0000000..cf85459 Binary files /dev/null and b/semestr-2/topo/106656932_2682289525419459_8890828706710255563_n.jpg differ diff --git a/semestr-2/topo/106703086_728253774716175_2262465163427979269_n.jpg b/semestr-2/topo/106703086_728253774716175_2262465163427979269_n.jpg new file mode 100644 index 0000000..d650007 Binary files /dev/null and b/semestr-2/topo/106703086_728253774716175_2262465163427979269_n.jpg differ diff --git a/semestr-2/topo/106792000_316914386368237_6535047497894014786_n.jpg b/semestr-2/topo/106792000_316914386368237_6535047497894014786_n.jpg new file mode 100644 index 0000000..824dacf Binary files /dev/null and b/semestr-2/topo/106792000_316914386368237_6535047497894014786_n.jpg differ diff --git a/semestr-2/topo/107093323_1187351634957579_7077220020141497805_n.jpg b/semestr-2/topo/107093323_1187351634957579_7077220020141497805_n.jpg new file mode 100644 index 0000000..8ce9801 Binary files /dev/null and b/semestr-2/topo/107093323_1187351634957579_7077220020141497805_n.jpg differ diff --git a/semestr-2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf b/semestr-2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf new file mode 100644 index 0000000..468dd99 --- /dev/null +++ b/semestr-2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf @@ -0,0 +1,3629 @@ +%PDF-1.7 +% +1 0 obj +<< +/AcroForm 2 0 R +/Lang (pl-PL) +/MarkInfo << +/Marked true +>> +/Metadata 3 0 R +/Pages 4 0 R +/StructTreeRoot 5 0 R +/Type /Catalog +/ViewerPreferences 6 0 R +/OpenAction 7 0 R +>> +endobj +8 0 obj +<< +/Author (Kkudalla) +/CreationDate (D:20200706133743+02'00') +/Creator <4D6963726F736F6674AE20576F726420646C61204D6963726F736F667420333635> +/ModDate (D:20200706133807+02'00') +/Producer <4D6963726F736F6674AE20576F726420646C61204D6963726F736F667420333635> +>> +endobj +2 0 obj +<< +/DA (/Helv 0 Tf 0 g ) +/DR << +/Encoding << +/PDFDocEncoding 9 0 R +>> +/Font << +/Helv 10 0 R +/MyriadPro-Regular 11 0 R +/ZaDb 12 0 R +>> +>> +/Fields [13 0 R] +/SigFlags 3 +>> +endobj +3 0 obj +<< +/Length 3324 +/Subtype /XML +/Type /Metadata +>> +stream + + + + + Microsoft® Word dla Microsoft 365 + application/pdf + + + Kkudalla + + + Microsoft® Word dla Microsoft 365 + 2020-07-06T13:37:43+02:00 + 2020-07-06T13:38:07+02:00 + 2020-07-06T13:38:07+02:00 + uuid:AF6C3520-A81E-46E5-BE7E-22ACA2CA4797 + uuid:39ce6e44-37dc-4684-94d5-a1c3cb352be5 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream +endobj +4 0 obj +<< +/Count 2 +/Kids [14 0 R 15 0 R] +/Type /Pages +>> +endobj +5 0 obj +<< +/IDTree 16 0 R +/K [17 0 R] +/ParentTree 18 0 R +/ParentTreeNextKey 2 +/RoleMap 19 0 R +/Type /StructTreeRoot +>> +endobj +6 0 obj +<< +/DisplayDocTitle true +>> +endobj +7 0 obj +<< +/Type /Action +/S /JavaScript +/JS (this.print\({bUI:true,bSilent:false,bShrinkToFit:true}\);) +>> +endobj +9 0 obj +<< +/Differences [24 /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek /ring /tilde 39 +/quotesingle 96 /grave 128 /bullet /dagger /daggerdbl /ellipsis /emdash /endash +/florin /fraction /guilsinglleft /guilsinglright /minus /perthousand /quotedblbase /quotedblleft /quotedblright /quoteleft +/quoteright /quotesinglbase /trademark /fi /fl /Lslash /OE /Scaron /Ydieresis /Zcaron +/dotlessi /lslash /oe /scaron /zcaron 160 /Euro 164 /currency 166 +/brokenbar 168 /dieresis /copyright /ordfeminine 172 /logicalnot /.notdef /registered /macron +/degree /plusminus /twosuperior /threesuperior /acute /mu 183 /periodcentered /cedilla /onesuperior +/ordmasculine 188 /onequarter /onehalf /threequarters 192 /Agrave /Aacute /Acircumflex /Atilde +/Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute +/Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply +/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute +/acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis +/igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde +/odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] +/Type /Encoding +>> +endobj +10 0 obj +<< +/BaseFont /Helvetica +/Encoding 9 0 R +/Name /Helv +/Subtype /Type1 +/Type /Font +>> +endobj +11 0 obj +<< +/BaseFont /MyriadPro-Regular +/Encoding /WinAnsiEncoding +/FirstChar 0 +/FontDescriptor 20 0 R +/LastChar 255 +/Subtype /Type1 +/Type /Font +/Widths [500 500 500 500 500 500 500 500 500 500 +500 500 500 500 500 500 500 500 500 500 +500 500 500 500 500 500 500 500 500 500 +500 500 212 230 337 497 513 792 605 188 +284 284 415 596 207 307 207 343 513 513 +513 513 513 513 513 513 513 513 207 207 +596 596 596 406 737 612 542 580 666 492 +487 646 652 239 370 542 472 804 658 689 +532 689 538 493 497 647 558 846 571 541 +553 284 341 284 596 500 300 482 569 448 +564 501 292 559 555 234 243 469 236 834 +555 549 569 563 327 396 331 551 481 736 +463 471 428 284 239 284 596 282 513 282 +207 513 356 1000 500 500 300 1156 493 255 +894 282 553 282 282 207 207 354 354 282 +500 1000 300 619 396 255 863 282 428 541 +212 230 513 513 513 513 239 519 300 677 +346 419 596 307 419 300 318 596 311 305 +300 553 512 207 300 244 355 419 759 759 +759 406 612 612 612 612 612 612 788 580 +492 492 492 492 239 239 239 239 671 658 +689 689 689 689 689 596 689 647 647 647 +647 541 531 548 482 482 482 482 482 482 +773 448 501 501 501 501 234 234 234 234 +541 555 549 549 549 549 549 596 549 551 +551 551 551 471 569 471] +>> +endobj +12 0 obj +<< +/BaseFont /ZapfDingbats +/Name /ZaDb +/Subtype /Type1 +/Type /Font +>> +endobj +13 0 obj +<< +/AP << +/N 21 0 R +>> +/DA (/MyriadPro-Regular 0 Tf 0 Tz 0 g) +/F 132 +/FT /Sig +/MK << +>> +/P 15 0 R +/Rect [415.34 499.989 518.347 549.339] +/Subtype /Widget +/T (Signature2) +/Type /Annot +/V 22 0 R +>> +endobj +14 0 obj +<< +/Contents [23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R] +/CropBox [0 0 595.2 841.8] +/Group << +/CS /DeviceRGB +/S /Transparency +/Type /Group +>> +/MediaBox [0 0 595.2 841.8] +/Parent 4 0 R +/Resources << +/ExtGState << +/GS10 31 0 R +/GS11 32 0 R +>> +/Font << +/F1 33 0 R +/F2 34 0 R +/F3 35 0 R +/F4 36 0 R +/F5 37 0 R +/F6 38 0 R +/F7 39 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Rotate 0 +/StructParents 0 +/Tabs /S +/Type /Page +>> +endobj +15 0 obj +<< +/Annots [13 0 R] +/Contents 40 0 R +/CropBox [0 0 595.2 841.8] +/Group << +/CS /DeviceRGB +/S /Transparency +/Type /Group +>> +/MediaBox [0 0 595.2 841.8] +/Parent 4 0 R +/Resources << +/ExtGState << +/GS10 31 0 R +/GS11 32 0 R +>> +/Font << +/F1 33 0 R +/F2 34 0 R +/F3 35 0 R +/F4 36 0 R +/F5 37 0 R +/F7 39 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Rotate 0 +/StructParents 1 +/Tabs /S +/Type /Page +>> +endobj +16 0 obj +<< +/Names [(Note 1) 41 0 R] +>> +endobj +17 0 obj +<< +/K [42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R +52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R +62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 41 0 R 68 0 R 69 0 R 70 0 R +71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R +81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R +91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R] +/P 5 0 R +/S /Document +/Type /StructElem +>> +endobj +18 0 obj +<< +/Nums [0 [100 0 R 101 0 R 102 0 R 103 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R +51 0 R 52 0 R 53 0 R 104 0 R 105 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R +60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 106 0 R 107 0 R 108 0 R +109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R +119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 68 0 R 69 0 R 70 0 R +71 0 R 126 0 R 127 0 R 73 0 R 74 0 R 75 0 R 128 0 R 76 0 R 129 0 R 77 0 R +130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R] + 1 [136 0 R 137 0 R 78 0 R 79 0 R 80 0 R 138 0 R 139 0 R 140 0 R 82 0 R 83 0 R +84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 141 0 R 142 0 R 90 0 R 91 0 R 92 0 R +93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R] +] +>> +endobj +19 0 obj +<< +/Annotation /Sect +/Artifact /Sect +/Chart /Sect +/Chartsheet /Part +/Diagram /Figure +/Dialogsheet /Part +/Endnote /Note +/Footer /Sect +/Footnote /Note +/Header /Sect +/InlineShape /Sect +/Macrosheet /Part +/Slide /Part +/Textbox /Sect +/Workbook /Document +/Worksheet /Part +>> +endobj +20 0 obj +<< +/Ascent 952 +/CapHeight 674 +/CharSet (/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis) +/Descent -250 +/Flags 32 +/FontBBox [-157 -250 1126 952] +/FontFamily (Myriad Pro) +/FontFile3 143 0 R +/FontName /MyriadPro-Regular +/FontStretch /Normal +/FontWeight 400 +/ItalicAngle 0 +/StemV 88 +/Type /FontDescriptor +/XHeight 484 +>> +endobj +21 0 obj +<< +/Length 7 +/BBox [0.0 0.0 103.007 49.3506] +/Resources << +/XObject << +/FRM 144 0 R +>> +>> +/Subtype /Form +/Type /XObject +>> +stream +/FRM Do +endstream +endobj +22 0 obj +<< +/ByteRange [0 148276 206888 135679] +/Contents <30826F0406092A864886F70D010702A0826EF530826EF1020101310F300D06096086480165030402010500300B06092A864886F70D010701A0820DAD308206943082047CA00302010202141A5734B0D472D251E1D37CFE3D796AC117102490300D06092A864886F70D01010D0500306F310B300906035504061302504C311D301B060355040A0C144E61726F646F77792042616E6B20506F6C736B693126302406035504030C1D4E61726F646F77652043656E7472756D20436572747966696B61636A693119301706035504610C10564154504C2D35323530303038313938301E170D3137303231343132323631395A170D3238303231343233353935395A306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F4365727430820222300D06092A864886F70D01010105000382020F003082020A0282020100D0F7EAC0E3C610864FF50A76823A98316BAB7F62BAE9ACC87C6BCACBD45CDE6539990F480FC14CBC2578762236229D8C7A0A96BB19DE7DD6B24C4AF83F7CD22A8DDD67C61FA595D711B92C33089C6274AF15CBF99AAFF628C3035CF3381BF9D343B7AB54861E812D6D0BD606AAB494FF3213B35D0E3DDF25B8282D301B0B19748548DDC4CA00B597D89E606FB6AA46386CC4F6574D77F26B5A93C4024905415D30D89AF4FD45C3E577C0E3A09BC89CE95FB350AD44BBF156053F2269BA4958230AA8C7E3A3F83C1A1F5691941371F28AD0539B621A2AD239E8BB744275CDA956D6519D726091782F58A91081DE53CC8ABAEC72B0DA8F4ADAE0D1047883EE0D831016C709319A76A8D4E6FE6F088E5D9E5C42413D79F7C9392F2C6D19EEFC054D6685CE8089D2E1C5CCD2EBD47F0966CB6701CF05E012C84EAD6D00FA7F797956E2A55BBF8019EF1CFE1C0401979ED852ACB789B26453DE8BA56416A2E2836231457C0A002302979BA7F73D322C5B71B5444315D0323D0F50AD0AEC5F47F6F88B14FCFA6A6EB5841D42130B5B6112B380F45B8DD7B0C9FF6EBA0DE17CC4F17F560A39D120A6DB06A731E88E45013C14210A841300C096D3A647050341A252933360AEC26EB6DE2E419791B74B4EA1FF1A0280B30EB904BB427E92ACCC6C36F19960C87557A0AC2DE74EBD682816EB38A1FDA4C6EB7B9D0C66E28028C58D9A761B0203010001A382012630820122300F0603551D130101FF040530030101FF3081AC0603551D230481A43081A1801429B3C8C4DFA387F866051258FD462AB8980D7987A173A471306F310B300906035504061302504C311D301B060355040A0C144E61726F646F77792042616E6B20506F6C736B693126302406035504030C1D4E61726F646F77652043656E7472756D20436572747966696B61636A693119301706035504610C10564154504C2D35323530303038313938821440F8F78AB0E364105691C8D9E02CF8C1C6400A4630310603551D200101FF0427302530230604551D2000301B301906082B06010505070201160D7777772E6E63636572742E706C300E0603551D0F0101FF040403020106301D0603551D0E0416041474627099FF1B603BC464B5841FA3150C5CCB5FBD300D06092A864886F70D01010D050003820201007FA1A8393E66C6D57B7A372DB71A7CB0335A77A5C394660F6C3D33931E42A25FA7ACD09F5751276C6840A5FD787468A795B68A8C44F2D195FAA3BFFE48AEB100495DB87AEC76F87B0AE5F8992B217C31C8E3C4EAF9CCEF41AFF0F5B214CEBD22F2ED9FB94C77E947F58D22F9063D3B2A8B8E55B478AA4DAEED3571C70AC31836A3EBECB2F5B5C6590817F1FB629FAF0699FE4CC1312FB01D50EE8D1A8F352582AB69AAA14FDE77C824D51BC722A092BFDB94737A001E3F4521F7268611ABEE5F6F423B8788AAD3496660809564452C174583AFAE84297E460EB56FDE4A47534D946255A3DA43862BEE8EC265013C0260ED039D76A7EF0EB35411EB997A47BB5C7BB1763B458CAD98B5CC3457150576231263EE3D6EACC2DF24C888DF9CC135088BE1B25E51CB031F739A5542815658BABC4DD3EE120A8DC77837E43ED3CA03382916363D5939FBDADD13AB04B20EFB1A956604CBD53EE66461442CA65D55B52A05D50E9BE575F9BB6E96EB9B21A33254E6A87ED5248670BFC11DD7ABEE4F38555C9FE3D8896A49D201768F031ED506589A5DE3B4205B58BDB96A5E68AE3CAE57A3181AC697B9C4F0FE654BBE8D5C9B453BE021F38A3E524C2321EE7D1B908791472F8E7E12803D1BC08CBCE5843FA69CABE0B2137CFDC6FB00E1FBED8B6274CA377D851F41EF3655DB229F778C004DB027A5F805DF844C7B0CB09F21FAC5E1D130820711308204F9A003020102020B51434130335F0200040400300D06092A864886F70D01010B0500306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F43657274301E170D3139303831393039323932375A170D3231303831383039323932375A30733122302006035504030C1941445249414E41204557454C494E41204D454459C583534B41311A301806035504050C11504E4F504C2D38303037313130383036353112301006035504040C094D454459C583534B413110300E060355042A0C0741445249414E41310B300906035504060C02504C308201A2300D06092A864886F70D01010105000382018F003082018A028201810097B18BD986A1CC9EF8163917F6ECC60D9D3EAC7266A4562EC61011591BE7118EB1BA94D3A86100BF05D410876698C1AD52F382358A28EF00F26F3E6AF26F86F78EF4EE24B96F4395DC408E6E18FAADA9F09EC5F3C47B007709FBB22783818C084C34B6E05F2C3EFBF3E5131F43F6FFEDC31750D911F753D7A9AD3AD4C6B3C0C1C379B7F5B93908D7EE5691C1E0D0C0E334943C65B47AFEA66EE5CB81A86461BBA4BB92363266A35B1D6B903F7BD342EB1B5463E90D6FEDED6E9B6F7382945FB0B88F8D8AB7AD4852CD4406CD2FD9FC9CBE99449BEBE608EC05A363BB0FF9147B066157E045C7A965852F379F2F7A36674F1894D57ACA5417074E0DAAA27D008477C0778C38CA88DAD6A6DEE9FE110F5CC5004D40274DB3CE8F084324E8E371518349339E19DE449A97AEE4517ADF5A4BD44F0595D1660575A1619EBFC77E9FA3261CCFEE30B0E508E1470719F93C148DE5A0821074AE7468E40B1E04B7320F4D2A60787B5D7BA679666E44AB7580111579FB17DE2E6948CB88C5C38C0695E4EB0203010001A382022830820224301F0603551D2304183016801474627099FF1B603BC464B5841FA3150C5CCB5FBD301D0603551D0E041604149B410D4D610FB58C12AF87E64658A00A50F02DBB300F0603551D130101FF04053003010100300E0603551D0F0101FF0404030206403081D70603551D200101FF0481CC3081C93081B1060A2A84680186F87F0102023081A2303006082B060105050702011624687474703A2F2F7777772E6575726F636572742E706C2F7265706F7A79746F7269756D2F306E06082B0601050507020230620C60436572747966696B617420777973746177696F6E79207A676F646E6965207A207A61736164616D69206F706973616E796D69207720646F6B756D656E63696520506F6C6974796B6120436572747966696B61636A6920776572736A6120322E303009060704008BEC4001023008060604008F7A010230310603551D1F042A30283026A024A0228620687474703A2F2F63726C2E6575726F636572742E706C2F71636130332E63726C307B06082B06010505070101046F306D302806082B06010505073001861C687474703A2F2F63726C2E6575726F636572742E706C2F4F4353502F304106082B06010505073002863568747470733A2F2F6575726F636572742E706C2F7075622F507261776F2F51434130335F4575726F636572745F323031372E646572303706082B06010505070103042B30293008060604008E4601013008060604008E4601043013060604008E4601063009060704008E46010601300D06092A864886F70D01010B05000382020100A383702A04DD1450F0B2B864D20CC314D405F80400F730A8D5B2E655AF12E656EFE76CAD4FA528E7CDE08C8688FFC33149132B18C10801EAF095C221EDB494CEF54643EAA0474FEBDCE4F4AE8ECCA634D162E0C0584C58357CF643FA00CF6A8318A3CCE94AFB26B79DB3D8FDA6AF6A5954376CB888789A2C681E430510B09F526A05C437B742D2986490E867BBB630260CB38ACFEDB1914E4148B29F40BA937171B2526D8E3BCE3E8F0F2475E22D45B45A3213E69A23DB126B0CE635D63D86145807B17C14F37500B147B3FFE26A5C6BBCEB8976083285F3D0C1982E3A162CD7E8702D172DADD4204BC94D131F8C2CDDF152361F15CE73E33177996BEE537AB9ED4B6B46F8C3509BC309468BC1012CA68D7C8BDA8870C5855440FF01318B5F955BA513B1454C80F4651C2A329836FEF680106EF47DF0CC70EE8A101B061BC50A9CDDD5C936FC5CC119137E89B17BD9A7DB936E74B9E8CDBBB728953B7831A2DD954EF92148C3BCA8C22006D1CBA79D383F9A5C915B6C721D46134C307BE59026F779D90DD2F69DC8D4F6E1E072855FF2368D611627F3925C3706D491D58C35E1809866D1A8C6D89D887D381D8828BEBBE16A39310387EDC94D6B6AD2150DE7134036FB7A4BA34761ABE66A2EC42D86F53ACA59A277ACA40C5C292E6919DCB55B6B04D87D60BE1436EC62F57FBE3DC941F2FB5ACE402D5203AE60F97B004EB7933182611B30826117020101307E306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F43657274020B51434130335F0200040400300D06096086480165030402010500A0825EEE301806092A864886F70D010903310B06092A864886F70D010701302F06092A864886F70D010904312204202185C186075BD6983C93408D3816E6C8D99987A15F2BEB7666EA73EC13645AFB30825E9F06092A864886F72F01010831825E9030825E8CA0825E8830825E8430825E8030825C68020101300D06092A864886F70D01010B0500306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F43657274170D3230303730363035303030315A170D3230303730373035303030315A30825B91302402023634170D3138303230313130313333395A300F300D0603551D1501010004030A0105302402023633170D3138303230313130313335325A300F300D0603551D1501010004030A0105302402023639170D3138303230323132303031375A300F300D0603551D1501010004030A010130250203313132170D3138303532323134303633335A300F300D0603551D1501010004030A010530250203313936170D3138303730333130323735375A300F300D0603551D1501010004030A010130250203333239170D3138303730393134323634375A300F300D0603551D1501010004030A01053026020431313332170D3138303732353037343532345A300F300D0603551D1501010004030A01053026020431313238170D3138303732353037343634315A300F300D0603551D1501010004030A010530250203353436170D3138303930333038343531395A300F300D0603551D1501010004030A01033026020431383237170D3138303930353134333731355A300F300D0603551D1501010004030A01003026020431383236170D3138303930363037313634355A300F300D0603551D1501010004030A01043026020431383235170D3138303930363037313734355A300F300D0603551D1501010004030A01043026020431343437170D3138303931323131343733345A300F300D0603551D1501010004030A010430250203343739170D3138303931333035343032305A300F300D0603551D1501010004030A01053026020432343935170D3138303931393035313935385A300F300D0603551D1501010004030A01043026020433373330170D3138313032393132333432375A300F300D0603551D1501010004030A01043026020432373439170D3138313130353038313334305A300F300D0603551D1501010004030A01053026020433383134170D3138313130383132323533335A300F300D0603551D1501010004030A01043026020431303633170D3138313130383132323534305A300F300D0603551D1501010004030A01043026020436353436170D3139303131313132333931355A300F300D0603551D1501010004030A01043026020434363939170D3139303131353138313632325A300F300D0603551D1501010004030A01013026020433333232170D3139303131363133343735325A300F300D0603551D1501010004030A0105302402023833170D3139303133303133343033355A300F300D0603551D1501010004030A010530250203353139170D3139303230373130353331355A300F300D0603551D1501010004030A01013026020433343632170D3139303230383130343235315A300F300D0603551D1501010004030A01013026020437383832170D3139303232323038343332395A300F300D0603551D1501010004030A01013026020439363937170D3139303232373133343833315A300F300D0603551D1501010004030A01013026020435373232170D3139303331353039313030355A300F300D0603551D1501010004030A01043026020435373234170D3139303331353039313034305A300F300D0603551D1501010004030A0104302702053130313839170D3139303331353039313132355A300F300D0603551D1501010004030A0104302702053130363835170D3139303331353039313235305A300F300D0603551D1501010004030A01053026020439303233170D3139303331353039313435335A300F300D0603551D1501010004030A010530250203333832170D3139303332373039333133395A300F300D0603551D1501010004030A0101302D020B51434130335F0104070205170D3139303431353038303431395A300F300D0603551D1501010004030A01043026020435393133170D3139303431353038303534345A300F300D0603551D1501010004030A0104302D020B51434130335F0101050908170D3139303431363131333035345A300F300D0603551D1501010004030A0105302D020B51434130335F0105000409170D3139303432393039333635335A300F300D0603551D1501010004030A0101302D020B51434130335F0104060106170D3139303530373037303833335A300F300D0603551D1501010004030A0101302D020B51434130335F0104050800170D3139303530383131353634375A300F300D0603551D1501010004030A0104302D020B51434130335F0105050803170D3139303530383131353734315A300F300D0603551D1501010004030A0101302D020B51434130335F0105040801170D3139303530383131353830345A300F300D0603551D1501010004030A0101302D020B51434130335F0104070907170D3139303530383131353832325A300F300D0603551D1501010004030A0101302D020B51434130335F0104060806170D3139303530383131353930385A300F300D0603551D1501010004030A0101302D020B51434130335F0104020407170D3139303530383131353935345A300F300D0603551D1501010004030A0101302D020B51434130335F0104020103170D3139303530383132303032355A300F300D0603551D1501010004030A0105302D020B51434130335F0104020606170D3139303530383132303034375A300F300D0603551D1501010004030A01013026020431373734170D3139303530383132303131335A300F300D0603551D1501010004030A01013026020431373736170D3139303530383132303133315A300F300D0603551D1501010004030A01013026020433383434170D3139303530383133303235325A300F300D0603551D1501010004030A01013026020435333432170D3139303530393038343934395A300F300D0603551D1501010004030A01013026020432343631170D3139303531333131333432355A300F300D0603551D1501010004030A0101302702053130373836170D3139303532393039323435325A300F300D0603551D1501010004030A01043026020436323332170D3139303630373038323032305A300F300D0603551D1501010004030A01013026020431343332170D3139303631383039303333315A300F300D0603551D1501010004030A0101302D020B51434130335F0108010704170D3139303731353038323834305A300F300D0603551D1501010004030A0105302D020B51434130335F0108010505170D3139303731353038323834395A300F300D0603551D1501010004030A0105302D020B51434130335F0108060605170D3139303830313132343132335A300F300D0603551D1501010004030A0104302D020B51434130335F0106010108170D3139303830313132343432365A300F300D0603551D1501010004030A0101302D020B51434130335F0109070406170D3139303830313132343533375A300F300D0603551D1501010004030A0104302D020B51434130335F0109070302170D3139303830313132343630315A300F300D0603551D1501010004030A0104302D020B51434130335F0102010609170D3139303830313132343633345A300F300D0603551D1501010004030A0105302702053130343036170D3139303830313132343835375A300F300D0603551D1501010004030A0104302D020B51434130335F0105080608170D3139303830323131313635315A300F300D0603551D1501010004030A0104302D020B51434130335F0101060503170D3139303830353132313632385A300F300D0603551D1501010004030A0105302D020B51434130335F0108010707170D3139303830363037313835325A300F300D0603551D1501010004030A0101302D020B51434130335F0107090503170D3139303832393130333335375A300F300D0603551D1501010004030A0101302D020B51434130335F0103020407170D3139303833303133313435365A300F300D0603551D1501010004030A0104302D020B51434130335F0101090500170D3139303932343037323532375A300F300D0603551D1501010004030A0101302D020B51434130335F0201070703170D3139303932373039303835345A300F300D0603551D1501010004030A0101302D020B51434130335F0103040508170D3139313030383039323735325A300F300D0603551D1501010004030A01053026020439343537170D3139313032333039303430345A300F300D0603551D1501010004030A0105302D020B51434130335F0202040602170D3139313032333039303735305A300F300D0603551D1501010004030A0105302D020B51434130335F0106000304170D3139313032333039313033355A300F300D0603551D1501010004030A0101302D020B51434130335F0202000105170D3139313032333039313430395A300F300D0603551D1501010004030A0104302D020B51434130335F0107020008170D3139313130383037353532385A300F300D0603551D1501010004030A0105302D020B51434130335F0202070308170D3139313130383037353535385A300F300D0603551D1501010004030A0101302D020B51434130335F0108040708170D3139313130383037353632355A300F300D0603551D1501010004030A01033026020431383437170D3139313131353131313835375A300F300D0603551D1501010004030A01043026020431323233170D3139313131353131313930355A300F300D0603551D1501010004030A01043026020433353234170D3139313131353131323330315A300F300D0603551D1501010004030A01053026020433353531170D3139313131353131323331305A300F300D0603551D1501010004030A0105302D020B51434130335F0105060807170D3139313132303131303531375A300F300D0603551D1501010004030A0101302D020B51434130335F0103000405170D3139313132353134343532345A300F300D0603551D1501010004030A01013026020437353436170D3139313132383039303834305A300F300D0603551D1501010004030A0105302D020B51434130335F0107020606170D3139313231323133303635345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040609170D3139313231333039333933335A300F300D0603551D1501010004030A0105302D020B51434130335F0200030900170D3139313231373134333234315A300F300D0603551D1501010004030A0105302D020B51434130335F0201020704170D3139313231373134333332365A300F300D0603551D1501010004030A0105302D020B51434130335F0201060100170D3139313231383131323634355A300F300D0603551D1501010004030A0105302D020B51434130335F0201070309170D3139313233303130303732375A300F300D0603551D1501010004030A0101302D020B51434130335F0201070306170D3139313233303130303831395A300F300D0603551D1501010004030A01013026020433333233170D3139313233303130303931385A300F300D0603551D1501010004030A0105302D020B51434130335F0103070606170D3139313233303130303935375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030509170D3139313233303130313132355A300F300D0603551D1501010004030A0104302D020B51434130335F0203090705170D3230303130333131303234315A300F300D0603551D1501010004030A0105302D020B51434130335F0204010605170D3230303130333131303330315A300F300D0603551D1501010004030A0103302D020B51434130335F0200090606170D3230303131303130313132315A300F300D0603551D1501010004030A0104302D020B51434130335F0105080501170D3230303131343132303733305A300F300D0603551D1501010004030A0101302702053131343630170D3230303131343132323832395A300F300D0603551D1501010004030A01013026020437383430170D3230303131373039333633385A300F300D0603551D1501010004030A0101302D020B51434130335F0108040302170D3230303132303037313333375A300F300D0603551D1501010004030A01013026020436303130170D3230303132303133353433345A300F300D0603551D1501010004030A0101302D020B51434130335F0203020404170D3230303132303231343730395A300F300D0603551D1501010004030A0101302D020B51434130335F0203020500170D3230303132303231343731305A300F300D0603551D1501010004030A0101302D020B51434130335F0203020501170D3230303132303231343731305A300F300D0603551D1501010004030A0101302D020B51434130335F0203020508170D3230303132303231343731305A300F300D0603551D1501010004030A0101302D020B51434130335F0203020605170D3230303132303231343731315A300F300D0603551D1501010004030A0101302D020B51434130335F0203020800170D3230303132303231343731315A300F300D0603551D1501010004030A0101302D020B51434130335F0203020805170D3230303132303231343731315A300F300D0603551D1501010004030A0101302D020B51434130335F0203020807170D3230303132303231343731325A300F300D0603551D1501010004030A0101302D020B51434130335F0203020809170D3230303132303231343731325A300F300D0603551D1501010004030A0101302D020B51434130335F0203020900170D3230303132303231343731325A300F300D0603551D1501010004030A0101302D020B51434130335F0203020901170D3230303132303231343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0203020902170D3230303132303231343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0203030002170D3230303132303231343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0203030005170D3230303132303231343731345A300F300D0603551D1501010004030A0101302D020B51434130335F0203030103170D3230303132303231343731345A300F300D0603551D1501010004030A0101302D020B51434130335F0203030107170D3230303132303231343731345A300F300D0603551D1501010004030A0101302D020B51434130335F0203030200170D3230303132303231343731355A300F300D0603551D1501010004030A0101302D020B51434130335F0203030205170D3230303132303231343731355A300F300D0603551D1501010004030A0101302D020B51434130335F0203030206170D3230303132303231343731355A300F300D0603551D1501010004030A0101302D020B51434130335F0203030302170D3230303132303231343731365A300F300D0603551D1501010004030A0101302D020B51434130335F0203030504170D3230303132303231343731365A300F300D0603551D1501010004030A0101302D020B51434130335F0203030608170D3230303132303231343731375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030609170D3230303132303231343731375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030700170D3230303132303231343731375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030802170D3230303132303231343731385A300F300D0603551D1501010004030A0101302D020B51434130335F0203030808170D3230303132303231343731385A300F300D0603551D1501010004030A0101302D020B51434130335F0203030909170D3230303132303231343731385A300F300D0603551D1501010004030A0101302D020B51434130335F0203040002170D3230303132303231343731395A300F300D0603551D1501010004030A0101302D020B51434130335F0203040004170D3230303132303231343731395A300F300D0603551D1501010004030A0101302D020B51434130335F0203040101170D3230303132303231343731395A300F300D0603551D1501010004030A0101302D020B51434130335F0203040200170D3230303132303231343732305A300F300D0603551D1501010004030A0101302D020B51434130335F0203040206170D3230303132303231343732305A300F300D0603551D1501010004030A0101302D020B51434130335F0203040208170D3230303132303231343732305A300F300D0603551D1501010004030A0101302D020B51434130335F0203040306170D3230303132303231343732315A300F300D0603551D1501010004030A0101302D020B51434130335F0203040309170D3230303132303231343732315A300F300D0603551D1501010004030A0101302D020B51434130335F0203040400170D3230303132303231343732315A300F300D0603551D1501010004030A0101302D020B51434130335F0203040401170D3230303132303231343732325A300F300D0603551D1501010004030A0101302D020B51434130335F0203040403170D3230303132303231343732325A300F300D0603551D1501010004030A0101302D020B51434130335F0203040404170D3230303132303231343732325A300F300D0603551D1501010004030A0101302D020B51434130335F0203040405170D3230303132303231343732335A300F300D0603551D1501010004030A0101302D020B51434130335F0203040407170D3230303132303231343732335A300F300D0603551D1501010004030A0101302D020B51434130335F0203040409170D3230303132303231343732345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040509170D3230303132303231343732345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040602170D3230303132303231343732345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040607170D3230303132303231343732355A300F300D0603551D1501010004030A0101302D020B51434130335F0203040608170D3230303132303231343732355A300F300D0603551D1501010004030A0101302D020B51434130335F0203040700170D3230303132303231343732355A300F300D0603551D1501010004030A0101302D020B51434130335F0203040702170D3230303132303231343732365A300F300D0603551D1501010004030A0101302D020B51434130335F0203040708170D3230303132303231343732365A300F300D0603551D1501010004030A0101302D020B51434130335F0203040709170D3230303132303231343732365A300F300D0603551D1501010004030A0101302D020B51434130335F0203040803170D3230303132303231343732375A300F300D0603551D1501010004030A0101302D020B51434130335F0203040900170D3230303132303231343732375A300F300D0603551D1501010004030A0101302D020B51434130335F0203040902170D3230303132303231343732375A300F300D0603551D1501010004030A0101302D020B51434130335F0203040905170D3230303132303231343732385A300F300D0603551D1501010004030A0101302D020B51434130335F0203050004170D3230303132303231343732385A300F300D0603551D1501010004030A0101302D020B51434130335F0203050108170D3230303132303231343732385A300F300D0603551D1501010004030A0101302D020B51434130335F0203050203170D3230303132303231343732395A300F300D0603551D1501010004030A0101302D020B51434130335F0203050207170D3230303132303231343732395A300F300D0603551D1501010004030A0101302D020B51434130335F0203050300170D3230303132303231343733305A300F300D0603551D1501010004030A0101302D020B51434130335F0203050401170D3230303132303231343733305A300F300D0603551D1501010004030A0101302D020B51434130335F0203050404170D3230303132303231343733305A300F300D0603551D1501010004030A0101302D020B51434130335F0203050405170D3230303132303231343733315A300F300D0603551D1501010004030A0101302D020B51434130335F0203050503170D3230303132303231343733315A300F300D0603551D1501010004030A0101302D020B51434130335F0203050509170D3230303132303231343733315A300F300D0603551D1501010004030A0101302D020B51434130335F0203050600170D3230303132303231343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0203050605170D3230303132303231343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0203050607170D3230303132303231343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0203050706170D3230303132303231343733335A300F300D0603551D1501010004030A0101302D020B51434130335F0203050707170D3230303132303231343733335A300F300D0603551D1501010004030A0101302D020B51434130335F0203050708170D3230303132303231343733335A300F300D0603551D1501010004030A0101302D020B51434130335F0203050800170D3230303132303231343733345A300F300D0603551D1501010004030A0101302D020B51434130335F0203050801170D3230303132303231343733345A300F300D0603551D1501010004030A0101302D020B51434130335F0203050807170D3230303132303231343733345A300F300D0603551D1501010004030A0101302D020B51434130335F0203050808170D3230303132303231343733355A300F300D0603551D1501010004030A0101302D020B51434130335F0203050900170D3230303132303231343733355A300F300D0603551D1501010004030A0101302D020B51434130335F0203050901170D3230303132303231343733355A300F300D0603551D1501010004030A0101302D020B51434130335F0203050905170D3230303132303231343733365A300F300D0603551D1501010004030A0101302D020B51434130335F0203050907170D3230303132303231343733365A300F300D0603551D1501010004030A0101302D020B51434130335F0203050908170D3230303132303231343733375A300F300D0603551D1501010004030A0101302D020B51434130335F0203050909170D3230303132303231343733375A300F300D0603551D1501010004030A0101302D020B51434130335F0203060000170D3230303132303231343733375A300F300D0603551D1501010004030A0101302D020B51434130335F0203060003170D3230303132303231343733385A300F300D0603551D1501010004030A0101302D020B51434130335F0203060007170D3230303132303231343733385A300F300D0603551D1501010004030A0101302D020B51434130335F0203060009170D3230303132303231343733385A300F300D0603551D1501010004030A0101302D020B51434130335F0203060102170D3230303132303231343733395A300F300D0603551D1501010004030A0101302D020B51434130335F0203060103170D3230303132303231343733395A300F300D0603551D1501010004030A0101302D020B51434130335F0203060200170D3230303132303231343733395A300F300D0603551D1501010004030A0101302D020B51434130335F0203060301170D3230303132303231343734305A300F300D0603551D1501010004030A0101302D020B51434130335F0203060306170D3230303132303231343734305A300F300D0603551D1501010004030A0101302D020B51434130335F0203060401170D3230303132303231343734305A300F300D0603551D1501010004030A0101302D020B51434130335F0203060403170D3230303132303231343734315A300F300D0603551D1501010004030A0101302D020B51434130335F0203060405170D3230303132303231343734315A300F300D0603551D1501010004030A0101302D020B51434130335F0203060406170D3230303132303231343734325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060601170D3230303132303231343734325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060604170D3230303132303231343734325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060605170D3230303132303231343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0203060608170D3230303132303231343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0203060609170D3230303132303231343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0203060700170D3230303132303231343734345A300F300D0603551D1501010004030A0101302D020B51434130335F0203060705170D3230303132303231343734345A300F300D0603551D1501010004030A0101302D020B51434130335F0203060806170D3230303132303231343734345A300F300D0603551D1501010004030A0101302D020B51434130335F0203060807170D3230303132303231343734355A300F300D0603551D1501010004030A0101302D020B51434130335F0203060808170D3230303132303231343734355A300F300D0603551D1501010004030A0101302D020B51434130335F0203060900170D3230303132303231343734355A300F300D0603551D1501010004030A0101302D020B51434130335F0203060908170D3230303132303231343734365A300F300D0603551D1501010004030A0101302D020B51434130335F0203070003170D3230303132303231343734365A300F300D0603551D1501010004030A0101302D020B51434130335F0203070005170D3230303132303231343734375A300F300D0603551D1501010004030A0101302D020B51434130335F0203070007170D3230303132303231343734375A300F300D0603551D1501010004030A0101302D020B51434130335F0203070009170D3230303132303231343734375A300F300D0603551D1501010004030A0101302D020B51434130335F0203070102170D3230303132303231343734385A300F300D0603551D1501010004030A0101302D020B51434130335F0203070107170D3230303132303231343734385A300F300D0603551D1501010004030A0101302D020B51434130335F0203070200170D3230303132303231343734385A300F300D0603551D1501010004030A0101302D020B51434130335F0203070201170D3230303132303231343734395A300F300D0603551D1501010004030A0101302D020B51434130335F0203070206170D3230303132303231343734395A300F300D0603551D1501010004030A0101302D020B51434130335F0203070306170D3230303132303231343734395A300F300D0603551D1501010004030A0101302D020B51434130335F0203070308170D3230303132303231343735305A300F300D0603551D1501010004030A0101302D020B51434130335F0203070400170D3230303132303231343735305A300F300D0603551D1501010004030A0101302D020B51434130335F0203070403170D3230303132303231343735315A300F300D0603551D1501010004030A0101302D020B51434130335F0203070508170D3230303132303231343735315A300F300D0603551D1501010004030A0101302D020B51434130335F0203070601170D3230303132303231343735315A300F300D0603551D1501010004030A0101302D020B51434130335F0203070605170D3230303132303231343735325A300F300D0603551D1501010004030A0101302D020B51434130335F0203070701170D3230303132303231343735325A300F300D0603551D1501010004030A0101302D020B51434130335F0203070705170D3230303132303231343735325A300F300D0603551D1501010004030A0101302D020B51434130335F0203070706170D3230303132303231343735335A300F300D0603551D1501010004030A0101302D020B51434130335F0203070709170D3230303132303231343735335A300F300D0603551D1501010004030A0101302D020B51434130335F0203070800170D3230303132303231343735335A300F300D0603551D1501010004030A0101302D020B51434130335F0203070802170D3230303132303231343735345A300F300D0603551D1501010004030A0101302D020B51434130335F0203070803170D3230303132303231343735345A300F300D0603551D1501010004030A0101302D020B51434130335F0203070806170D3230303132303231343735355A300F300D0603551D1501010004030A0101302D020B51434130335F0203070808170D3230303132303231343735355A300F300D0603551D1501010004030A0101302D020B51434130335F0203070901170D3230303132303231343735355A300F300D0603551D1501010004030A0101302D020B51434130335F0203070904170D3230303132303231343735365A300F300D0603551D1501010004030A0101302D020B51434130335F0203080000170D3230303132303231343735365A300F300D0603551D1501010004030A0101302D020B51434130335F0203080002170D3230303132303231343735365A300F300D0603551D1501010004030A0101302D020B51434130335F0203080009170D3230303132303231343735375A300F300D0603551D1501010004030A0101302D020B51434130335F0203080100170D3230303132303231343735375A300F300D0603551D1501010004030A0101302D020B51434130335F0203080103170D3230303132303231343735375A300F300D0603551D1501010004030A0101302D020B51434130335F0203080104170D3230303132303231343735385A300F300D0603551D1501010004030A0101302D020B51434130335F0203080108170D3230303132303231343735385A300F300D0603551D1501010004030A0101302D020B51434130335F0203080200170D3230303132303231343735395A300F300D0603551D1501010004030A0101302D020B51434130335F0203080203170D3230303132303231343735395A300F300D0603551D1501010004030A0101302D020B51434130335F0203080205170D3230303132303231343735395A300F300D0603551D1501010004030A0101302D020B51434130335F0203080206170D3230303132303231343830305A300F300D0603551D1501010004030A0101302D020B51434130335F0203080207170D3230303132303231343830305A300F300D0603551D1501010004030A0101302D020B51434130335F0203080208170D3230303132303231343830305A300F300D0603551D1501010004030A0101302D020B51434130335F0203080304170D3230303132303231343830315A300F300D0603551D1501010004030A0101302D020B51434130335F0203080308170D3230303132303231343830315A300F300D0603551D1501010004030A0101302D020B51434130335F0203080400170D3230303132303231343830315A300F300D0603551D1501010004030A0101302D020B51434130335F0203080402170D3230303132303231343830325A300F300D0603551D1501010004030A0101302D020B51434130335F0203080505170D3230303132303231343830325A300F300D0603551D1501010004030A0101302D020B51434130335F0203080507170D3230303132303231343830335A300F300D0603551D1501010004030A0101302D020B51434130335F0203080602170D3230303132303231343830335A300F300D0603551D1501010004030A0101302D020B51434130335F0203080604170D3230303132303231343830335A300F300D0603551D1501010004030A0101302D020B51434130335F0203080608170D3230303132303231343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0203080701170D3230303132303231343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0203080704170D3230303132303231343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0203080706170D3230303132303231343830355A300F300D0603551D1501010004030A0101302D020B51434130335F0203080902170D3230303132303231343830355A300F300D0603551D1501010004030A0101302D020B51434130335F0203080904170D3230303132303231343830355A300F300D0603551D1501010004030A0101302D020B51434130335F0203080906170D3230303132303231343830365A300F300D0603551D1501010004030A0101302D020B51434130335F0203090005170D3230303132303231343830365A300F300D0603551D1501010004030A0101302D020B51434130335F0203090101170D3230303132303231343830375A300F300D0603551D1501010004030A0101302D020B51434130335F0203090106170D3230303132303231343830375A300F300D0603551D1501010004030A0101302D020B51434130335F0203090107170D3230303132303231343830375A300F300D0603551D1501010004030A0101302D020B51434130335F0203090204170D3230303132303231343830385A300F300D0603551D1501010004030A0101302D020B51434130335F0203090206170D3230303132303231343830385A300F300D0603551D1501010004030A0101302D020B51434130335F0203090207170D3230303132303231343830385A300F300D0603551D1501010004030A0101302D020B51434130335F0203090301170D3230303132303231343830395A300F300D0603551D1501010004030A0101302D020B51434130335F0203090303170D3230303132303231343830395A300F300D0603551D1501010004030A0101302D020B51434130335F0203090400170D3230303132303231343831305A300F300D0603551D1501010004030A0101302D020B51434130335F0203090404170D3230303132303231343831305A300F300D0603551D1501010004030A0101302D020B51434130335F0203090407170D3230303132303231343831305A300F300D0603551D1501010004030A0101302D020B51434130335F0203090509170D3230303132303231343831315A300F300D0603551D1501010004030A0101302D020B51434130335F0203090600170D3230303132303231343831315A300F300D0603551D1501010004030A0101302D020B51434130335F0203090702170D3230303132303231343831315A300F300D0603551D1501010004030A0101302D020B51434130335F0203090704170D3230303132303231343831325A300F300D0603551D1501010004030A0101302D020B51434130335F0203090800170D3230303132303231343831325A300F300D0603551D1501010004030A0101302D020B51434130335F0203090805170D3230303132303231343831325A300F300D0603551D1501010004030A0101302D020B51434130335F0203090902170D3230303132303231343831335A300F300D0603551D1501010004030A0101302D020B51434130335F0203090903170D3230303132303231343831335A300F300D0603551D1501010004030A0101302D020B51434130335F0203090905170D3230303132303231343831345A300F300D0603551D1501010004030A0101302D020B51434130335F0203090906170D3230303132303231343831345A300F300D0603551D1501010004030A0101302D020B51434130335F0203090909170D3230303132303231343831345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000003170D3230303132303231343831355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000103170D3230303132303231343831355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000104170D3230303132303231343831355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000106170D3230303132303231343831365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000109170D3230303132303231343831365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000200170D3230303132303231343831375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000207170D3230303132303231343831375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000304170D3230303132303231343831375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000305170D3230303132303231343831385A300F300D0603551D1501010004030A0101302D020B51434130335F0204000306170D3230303132303231343831385A300F300D0603551D1501010004030A0101302D020B51434130335F0204000307170D3230303132303231343831385A300F300D0603551D1501010004030A0101302D020B51434130335F0204000308170D3230303132303231343831395A300F300D0603551D1501010004030A0101302D020B51434130335F0204000401170D3230303132303231343831395A300F300D0603551D1501010004030A0101302D020B51434130335F0204000403170D3230303132303231343832305A300F300D0603551D1501010004030A0101302D020B51434130335F0204000404170D3230303132303231343832305A300F300D0603551D1501010004030A0101302D020B51434130335F0204000406170D3230303132303231343832305A300F300D0603551D1501010004030A0101302D020B51434130335F0204000409170D3230303132303231343832315A300F300D0603551D1501010004030A0101302D020B51434130335F0204000500170D3230303132303231343832315A300F300D0603551D1501010004030A0101302D020B51434130335F0204000501170D3230303132303231343832315A300F300D0603551D1501010004030A0101302D020B51434130335F0204000505170D3230303132303231343832325A300F300D0603551D1501010004030A0101302D020B51434130335F0204000507170D3230303132303231343832325A300F300D0603551D1501010004030A0101302D020B51434130335F0204000606170D3230303132303231343832335A300F300D0603551D1501010004030A0101302D020B51434130335F0204000608170D3230303132303231343832335A300F300D0603551D1501010004030A0101302D020B51434130335F0204000609170D3230303132303231343832335A300F300D0603551D1501010004030A0101302D020B51434130335F0204000702170D3230303132303231343832345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000705170D3230303132303231343832345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000708170D3230303132303231343832345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000806170D3230303132303231343832355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000809170D3230303132303231343832355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000900170D3230303132303231343832365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000901170D3230303132303231343832365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000907170D3230303132303231343832365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000908170D3230303132303231343832375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000909170D3230303132303231343832375A300F300D0603551D1501010004030A0101302D020B51434130335F0204010003170D3230303132303231343832375A300F300D0603551D1501010004030A0101302D020B51434130335F0204010004170D3230303132303231343832385A300F300D0603551D1501010004030A0101302D020B51434130335F0204010006170D3230303132303231343832385A300F300D0603551D1501010004030A0101302D020B51434130335F0204010100170D3230303132303231343832395A300F300D0603551D1501010004030A0101302D020B51434130335F0204010203170D3230303132303231343832395A300F300D0603551D1501010004030A0101302D020B51434130335F0204010206170D3230303132303231343832395A300F300D0603551D1501010004030A0101302D020B51434130335F0204010209170D3230303132303231343833305A300F300D0603551D1501010004030A0101302D020B51434130335F0204010300170D3230303132303231343833305A300F300D0603551D1501010004030A0101302D020B51434130335F0204010303170D3230303132303231343833305A300F300D0603551D1501010004030A0101302D020B51434130335F0204010305170D3230303132303231343833315A300F300D0603551D1501010004030A0101302D020B51434130335F0204010308170D3230303132303231343833315A300F300D0603551D1501010004030A0101302D020B51434130335F0204010406170D3230303132303231343833325A300F300D0603551D1501010004030A0101302D020B51434130335F0204010500170D3230303132303231343833325A300F300D0603551D1501010004030A0101302D020B51434130335F0204010503170D3230303132303231343833325A300F300D0603551D1501010004030A0101302D020B51434130335F0204010505170D3230303132303231343833335A300F300D0603551D1501010004030A0101302D020B51434130335F0204010601170D3230303132303231343833335A300F300D0603551D1501010004030A0101302D020B51434130335F0204010602170D3230303132303231343833335A300F300D0603551D1501010004030A0101302D020B51434130335F0204010604170D3230303132303231343833345A300F300D0603551D1501010004030A0101302D020B51434130335F0204010608170D3230303132303231343833345A300F300D0603551D1501010004030A0101302D020B51434130335F0204010700170D3230303132303231343833355A300F300D0603551D1501010004030A0101302D020B51434130335F0204010801170D3230303132303231343833355A300F300D0603551D1501010004030A0101302D020B51434130335F0204010805170D3230303132303231343833355A300F300D0603551D1501010004030A0101302D020B51434130335F0204010900170D3230303132303231343833365A300F300D0603551D1501010004030A0101302D020B51434130335F0204010905170D3230303132303231343833365A300F300D0603551D1501010004030A0101302D020B51434130335F0204010908170D3230303132303231343833365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020007170D3230303132303231343833375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020100170D3230303132303231343833375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020102170D3230303132303231343833385A300F300D0603551D1501010004030A0101302D020B51434130335F0204020105170D3230303132303231343833385A300F300D0603551D1501010004030A0101302D020B51434130335F0204020106170D3230303132303231343833385A300F300D0603551D1501010004030A0101302D020B51434130335F0204020207170D3230303132303231343833395A300F300D0603551D1501010004030A0101302D020B51434130335F0204020209170D3230303132303231343833395A300F300D0603551D1501010004030A0101302D020B51434130335F0204020302170D3230303132303231343834305A300F300D0603551D1501010004030A0101302D020B51434130335F0204020304170D3230303132303231343834305A300F300D0603551D1501010004030A0101302D020B51434130335F0204020308170D3230303132303231343834305A300F300D0603551D1501010004030A0101302D020B51434130335F0204020309170D3230303132303231343834315A300F300D0603551D1501010004030A0101302D020B51434130335F0204020401170D3230303132303231343834315A300F300D0603551D1501010004030A0101302D020B51434130335F0204020406170D3230303132303231343834315A300F300D0603551D1501010004030A0101302D020B51434130335F0204020501170D3230303132303231343834325A300F300D0603551D1501010004030A0101302D020B51434130335F0204020503170D3230303132303231343834325A300F300D0603551D1501010004030A0101302D020B51434130335F0204020504170D3230303132303231343834335A300F300D0603551D1501010004030A0101302D020B51434130335F0204020602170D3230303132303231343834335A300F300D0603551D1501010004030A0101302D020B51434130335F0204020603170D3230303132303231343834335A300F300D0603551D1501010004030A0101302D020B51434130335F0204020605170D3230303132303231343834345A300F300D0603551D1501010004030A0101302D020B51434130335F0204020607170D3230303132303231343834345A300F300D0603551D1501010004030A0101302D020B51434130335F0204020609170D3230303132303231343834345A300F300D0603551D1501010004030A0101302D020B51434130335F0204020701170D3230303132303231343834355A300F300D0603551D1501010004030A0101302D020B51434130335F0204020702170D3230303132303231343834355A300F300D0603551D1501010004030A0101302D020B51434130335F0204020704170D3230303132303231343834365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020706170D3230303132303231343834365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020709170D3230303132303231343834365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020805170D3230303132303231343834375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020807170D3230303132303231343834375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020902170D3230303132303231343834385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030001170D3230303132303231343834385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030002170D3230303132303231343834385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030003170D3230303132303231343834395A300F300D0603551D1501010004030A0101302D020B51434130335F0204030005170D3230303132303231343834395A300F300D0603551D1501010004030A0101302D020B51434130335F0204030006170D3230303132303231343834395A300F300D0603551D1501010004030A0101302D020B51434130335F0204030102170D3230303132303231343835305A300F300D0603551D1501010004030A0101302D020B51434130335F0204030106170D3230303132303231343835305A300F300D0603551D1501010004030A0101302D020B51434130335F0204030200170D3230303132303231343835315A300F300D0603551D1501010004030A0101302D020B51434130335F0204030202170D3230303132303231343835315A300F300D0603551D1501010004030A0101302D020B51434130335F0204030205170D3230303132303231343835315A300F300D0603551D1501010004030A0101302D020B51434130335F0204030207170D3230303132303231343835325A300F300D0603551D1501010004030A0101302D020B51434130335F0204030208170D3230303132303231343835325A300F300D0603551D1501010004030A0101302D020B51434130335F0204030301170D3230303132303231343835335A300F300D0603551D1501010004030A0101302D020B51434130335F0204030303170D3230303132303231343835335A300F300D0603551D1501010004030A0101302D020B51434130335F0204030402170D3230303132303231343835335A300F300D0603551D1501010004030A0101302D020B51434130335F0204030403170D3230303132303231343835345A300F300D0603551D1501010004030A0101302D020B51434130335F0204030409170D3230303132303231343835345A300F300D0603551D1501010004030A0101302D020B51434130335F0204030500170D3230303132303231343835355A300F300D0603551D1501010004030A0101302D020B51434130335F0204030503170D3230303132303231343835355A300F300D0603551D1501010004030A0101302D020B51434130335F0204030505170D3230303132303231343835355A300F300D0603551D1501010004030A0101302D020B51434130335F0204030506170D3230303132303231343835365A300F300D0603551D1501010004030A0101302D020B51434130335F0204030602170D3230303132303231343835365A300F300D0603551D1501010004030A0101302D020B51434130335F0204030604170D3230303132303231343835365A300F300D0603551D1501010004030A0101302D020B51434130335F0204030700170D3230303132303231343835375A300F300D0603551D1501010004030A0101302D020B51434130335F0204030702170D3230303132303231343835375A300F300D0603551D1501010004030A0101302D020B51434130335F0204030704170D3230303132303231343835385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030708170D3230303132303231343835385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030802170D3230303132303231343835385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030908170D3230303132303231343835395A300F300D0603551D1501010004030A0101302D020B51434130335F0204040001170D3230303132303231343835395A300F300D0603551D1501010004030A0101302D020B51434130335F0204040003170D3230303132303231343930305A300F300D0603551D1501010004030A0101302D020B51434130335F0204040005170D3230303132303231343930305A300F300D0603551D1501010004030A0101302D020B51434130335F0204040006170D3230303132303231343930305A300F300D0603551D1501010004030A0101302D020B51434130335F0204040008170D3230303132303231343930315A300F300D0603551D1501010004030A0101302D020B51434130335F0204040009170D3230303132303231343930315A300F300D0603551D1501010004030A0101302D020B51434130335F0204040100170D3230303132303231343930325A300F300D0603551D1501010004030A0101302D020B51434130335F0204040103170D3230303132303231343930325A300F300D0603551D1501010004030A0101302D020B51434130335F0204040106170D3230303132303231343930325A300F300D0603551D1501010004030A0101302D020B51434130335F0204040206170D3230303132303231343930335A300F300D0603551D1501010004030A0101302D020B51434130335F0204040301170D3230303132303231343930335A300F300D0603551D1501010004030A0101302D020B51434130335F0204040302170D3230303132303231343930335A300F300D0603551D1501010004030A0101302D020B51434130335F0204040305170D3230303132303231343930345A300F300D0603551D1501010004030A0101302D020B51434130335F0204040306170D3230303132303231343930345A300F300D0603551D1501010004030A0101302D020B51434130335F0204040404170D3230303132303231343930355A300F300D0603551D1501010004030A0101302D020B51434130335F0204040407170D3230303132303231343930355A300F300D0603551D1501010004030A0101302D020B51434130335F0204040501170D3230303132303231343930355A300F300D0603551D1501010004030A0101302D020B51434130335F0204040504170D3230303132303231343930365A300F300D0603551D1501010004030A0101302D020B51434130335F0204040602170D3230303132303231343930365A300F300D0603551D1501010004030A0101302D020B51434130335F0204040604170D3230303132303231343930375A300F300D0603551D1501010004030A0101302D020B51434130335F0204040605170D3230303132303231343930375A300F300D0603551D1501010004030A0101302D020B51434130335F0204040606170D3230303132303231343930375A300F300D0603551D1501010004030A0101302D020B51434130335F0204040700170D3230303132303231343930385A300F300D0603551D1501010004030A0101302D020B51434130335F0204040705170D3230303132303231343930385A300F300D0603551D1501010004030A0101302D020B51434130335F0204040803170D3230303132303231343930395A300F300D0603551D1501010004030A0101302D020B51434130335F0204040909170D3230303132303231343930395A300F300D0603551D1501010004030A0101302D020B51434130335F0204050001170D3230303132303231343930395A300F300D0603551D1501010004030A0101302D020B51434130335F0204050006170D3230303132303231343931305A300F300D0603551D1501010004030A0101302D020B51434130335F0204050102170D3230303132303231343931305A300F300D0603551D1501010004030A0101302D020B51434130335F0204050104170D3230303132303231343931305A300F300D0603551D1501010004030A0101302D020B51434130335F0204050109170D3230303132303231343931315A300F300D0603551D1501010004030A0101302D020B51434130335F0204050200170D3230303132303231343931315A300F300D0603551D1501010004030A0101302D020B51434130335F0204050508170D3230303132303231343931325A300F300D0603551D1501010004030A0101302D020B51434130335F0204050609170D3230303132303231353031325A300F300D0603551D1501010004030A0101302702053130313437170D3230303133313039313331335A300F300D0603551D1501010004030A0101302D020B51434130335F0204080005170D3230303231303131343733375A300F300D0603551D1501010004030A0104302D020B51434130335F0106000309170D3230303231303133343535315A300F300D0603551D1501010004030A0101302D020B51434130335F0105080600170D3230303231343038323133355A300F300D0603551D1501010004030A01043026020439383139170D3230303231373039333332385A300F300D0603551D1501010004030A0101302D020B51434130335F0206080005170D3230303231383131323031335A300F300D0603551D1501010004030A01013026020437303233170D3230303231383131323133375A300F300D0603551D1501010004030A0101302D020B51434130335F0102020100170D3230303231383135313534375A300F300D0603551D1501010004030A0104302D020B51434130335F0109070001170D3230303231393230333135345A300F300D0603551D1501010004030A0105302D020B51434130335F0207070501170D3230303232313039323832365A300F300D0603551D1501010004030A0101302D020B51434130335F0206020709170D3230303330323132313533375A300F300D0603551D1501010004030A0104302D020B51434130335F0103020900170D3230303330323132313634385A300F300D0603551D1501010004030A0104302D020B51434130335F0206070000170D3230303330323132313830315A300F300D0603551D1501010004030A01053026020436323036170D3230303330353130323932375A300F300D0603551D1501010004030A01013026020433333235170D3230303330353130323933385A300F300D0603551D1501010004030A01013026020431323035170D3230303330353130323934395A300F300D0603551D1501010004030A01013026020431323732170D3230303330353130333030325A300F300D0603551D1501010004030A0101302702053130323039170D3230303330353130333031385A300F300D0603551D1501010004030A0101302D020B51434130335F0203020704170D3230303330353130333033385A300F300D0603551D1501010004030A0101302D020B51434130335F0204080705170D3230303330353130333035395A300F300D0603551D1501010004030A01013026020431323833170D3230303330353130343634335A300F300D0603551D1501010004030A01013026020431333333170D3230303330353130343635345A300F300D0603551D1501010004030A01013026020431323939170D3230303330353130343730345A300F300D0603551D1501010004030A0101302D020B51434130335F0105020401170D3230303330353130343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0105090800170D3230303330353130343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0106040907170D3230303330353130343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0200060802170D3230303330353130343735345A300F300D0603551D1501010004030A0101302D020B51434130335F0200070807170D3230303330353130343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0105080905170D3230303330353131333834315A300F300D0603551D1501010004030A01053026020436393333170D3230303330353131343034355A300F300D0603551D1501010004030A0105302D020B51434130335F0207050607170D3230303330363133343135375A300F300D0603551D1501010004030A0104302D020B51434130335F0103070504170D3230303330393039303030315A300F300D0603551D1501010004030A0101302D020B51434130335F0208070608170D3230303331363135323330305A300F300D0603551D1501010004030A01043026020432343134170D3230303331393038353132305A300F300D0603551D1501010004030A0101302D020B51434130335F0105030106170D3230303331393038353132375A300F300D0603551D1501010004030A0101302D020B51434130335F0209070202170D3230303430373131313031305A300F300D0603551D1501010004030A0105302D020B51434130335F0209080109170D3230303430383030333430335A300F300D0603551D1501010004030A0104302702053131303333170D3230303431323131313931315A300F300D0603551D1501010004030A0105302D020B51434130335F0208060309170D3230303431323131333335305A300F300D0603551D1501010004030A0101302D020B51434130335F0106090001170D3230303431323131333535355A300F300D0603551D1501010004030A0101302702053131313538170D3230303431323131333730315A300F300D0603551D1501010004030A0101302D020B51434130335F0105020707170D3230303431323131333732305A300F300D0603551D1501010004030A0101302D020B51434130335F0200030708170D3230303431353133333330365A300F300D0603551D1501010004030A0105302D020B51434130335F0108010702170D3230303432303039353232335A300F300D0603551D1501010004030A0104302702053131333736170D3230303432323132343231325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060707170D3230303432383133313330315A300F300D0603551D1501010004030A0101302D020B51434130335F0205010707170D3230303530383039343634305A300F300D0603551D1501010004030A01013026020437303835170D3230303531393037333931395A300F300D0603551D1501010004030A01053026020437303932170D3230303531393037333932375A300F300D0603551D1501010004030A0105302D020B51434130335F0105050604170D3230303532383037323033365A300F300D0603551D1501010004030A0105302D020B51434130335F0104040300170D3230303532393131343635315A300F300D0603551D1501010004030A0101302D020B51434130335F0105010403170D3230303532393132343230385A300F300D0603551D1501010004030A0101302D020B51434130335F0302020006170D3230303630313132353830385A300F300D0603551D1501010004030A01013026020433313837170D3230303630313133313231335A300F300D0603551D1501010004030A0101302D020B51434130335F0103050403170D3230303630313133313433315A300F300D0603551D1501010004030A0101302D020B51434130335F0209030900170D3230303630323039333530315A300F300D0603551D1501010004030A0101302D020B51434130335F0109000401170D3230303630383038353930395A300F300D0603551D1501010004030A0105302D020B51434130335F0207070604170D3230303630383039303130335A300F300D0603551D1501010004030A0105302D020B51434130335F0203080803170D3230303630383039353435355A300F300D0603551D1501010004030A0105302D020B51434130335F0200000909170D3230303631363133313333355A300F300D0603551D1501010004030A0104302D020B51434130335F0202060504170D3230303631363133323231365A300F300D0603551D1501010004030A0101302D020B51434130335F0302070509170D3230303631393038313130355A300F300D0603551D1501010004030A01013026020437343930170D3230303631393132313034335A300F300D0603551D1501010004030A0101302D020B51434130335F0103030104170D3230303632353037353830355A300F300D0603551D1501010004030A0101302D020B51434130335F0105060003170D3230303632363039303433355A300F300D0603551D1501010004030A0101302D020B51434130335F0204090804170D3230303632363133313435315A300F300D0603551D1501010004030A0105302D020B51434130335F0202040901170D3230303633303039313234345A300F300D0603551D1501010004030A0101302D020B51434130335F0107010409170D3230303730313131323230345A300F300D0603551D1501010004030A0101302D020B51434130335F0107010408170D3230303730313131323233325A300F300D0603551D1501010004030A0101302702053130393830170D3230303730323039353032345A300F300D0603551D1501010004030A0101302D020B51434130335F0208090202170D3230303730323039353131305A300F300D0603551D1501010004030A0101302D020B51434130335F0301010703170D3230303730323039353132305A300F300D0603551D1501010004030A0101302D020B51434130335F0302070008170D3230303730323131303333305A300F300D0603551D1501010004030A01013026020432373035170D3230303730323134343234395A300F300D0603551D1501010004030A0101A030302E301F0603551D2304183016801474627099FF1B603BC464B5841FA3150C5CCB5FBD300B0603551D140404020209E2300D06092A864886F70D01010B050003820201009ACB2F9ED10767FEEF30E615A6B24AD45AE5F648B45F9D3B15C3CEB331585B3C6077CD116CC689CDD3DC3812A6E4E1C5395FB8C2F5CE97F3AD24D090FA3E3B5841C7C5610F72625D609B91DB193F5ED1931637DD819454E911501E15DDC4F4E1C4D9E08EC760191A9A8DFE823758D02ED8C98D0B66D0FA28E79CCA5B1C9A931CF5F93B411B2468090C0C84E6129A86938E09CBF02B750602E2E397CCB6365C2585F7A0FBB575C101A938B2C52A009D0F2F3BFEC05F891132159667D359EF5117F51B6458C7D68DECFEBF7E04683002F0797B444E02A50EC2A8ACFADF5A3A743CCEF17214F2657439A02DFEA66F5EF8CA4C576C8F7FF8EC4CA08F9FC3A46A0C10343CDF28B092CE03905E87BFC19B23C49F655AA99198CF58F80D0E3AB1800494D21CB610CE155230987A673F8E3580012E363F9A8103ADFA5EB6A0DD5575E78EC93A626585877FA2A91A39AC32BF3AD7E3D82824ADF1157B2E8B79285B08C5800FA6FF97AAE6194B1BB9A92E27D57BF7F439AC2D32612BA7B6775E6EE05389DEA2976896BA57EC4577EBC27B2CAE7716391EA73B9E1E2F8C158DED624383533129691AFB9C8CEEF16F29988DED179886060FCFE5C1A843D94555EE4A9B1F24C7D4D4B0581621E75E6A963334B37C57EB369D3DC27B348B8CD8686E1D2059BBDCD61D9C6E0FED2BFAA32847F33E84FEA3056381199B7766DDF123FD148942C8C0300D06092A864886F70D01010B0500048201802ACBFB8158F5D6D5D44714C61B26A8CF619A9243B4E7A40FAEA7A8988994F67E17056D4D58BFD8BF3B56B4D88F4A86658F2B0CBC83376E1B25975DC2928353C3D0B8C1C5F6A3304AF60D8A64D552E2D48A5EED88C0FA9FC5E97D255DF8730A2EA207EA58033D00387916359EC6049E8577C0009467F4F801A8B4D0A3289282D11B8B4E237F5F3F104DFBF18B1C00145073CD9E0113646C73C347E8F121D33530A3D80C3E965E523EA368C6A9D9DA71FE1B3A5A0DEA901733356B4099F0F9859D567EFC3B27B8D09030D441067A7F68898AF59D0998CC57B8D9D4BE12477B86E3B5EF5628F0255F377F4F0E15F849EB683123A89AD04836D111715C051DA54FE396B1565B09DBE0FECC33E41373CDB186A97509FD92FE22DAFF2F43240D2B9F57D29C8958585AC60B68A686F457945388DA9983DFB48EF0D2179115424B509977B68722F0576C989ADA21B6563D30A6B104427C355281B0EE6FE88E65A3063B09527F8A93A07D2A4323BCD492DC598DA4FB460868F198BC25FB36B1432FFE053D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000> +/Filter /Adobe.PPKLite +/M (D:20200706133807+02'00') +/Name +/Prop_Build << +/App << +/Name /Adobe#20Acrobat#20Reader#20DC +/OS [/Win] +/R 1313024 +/REx (2020.009.20067) +/TrustedMode true +>> +/Filter << +/Date (May 4 2020 00:13:06) +/Name /Adobe.PPKLite +/R 131104 +/V 2 +>> +/PubSec << +/Date (May 4 2020 00:13:06) +/NonEFontNoWarn true +/R 131105 +>> +>> +/SubFilter /adbe.pkcs7.detached +/Type /Sig +>> +endobj +23 0 obj +<< +/Length 2094 +/Filter /FlateDecode +>> +stream +HWKo7 {MFh@j7#q#w#o_*cD аf+v]__X11na_^.{`&.={xsyػˋˋ=0˃e?]^n t[\7;(./^] aǛ5=pty8Zkz$M~82O@ Bf__^P]^݋puu\j?줄 [JZZxɭl-9Zca<,aq;;j1AkdEއ)a|('N%=ŵUli ;s%RJpQz}r5XF_f8 +99PiS2fXv3ڠa{ +fOqf YӮ[3w1 :u1efNcB~Ɍ"+nUa%|-,UufDƃ +LbBUaJQUDA*l*_pRI 2SEL"q5l{BJ#Psp4YLќ]+FH‹4F(GZF"q\HT`3U+8 >:kbcf^j`ӟyJNH-ŒA(jȖ$*$Z>qyQ7Mb~(FyA7F)fx+E%Mjv\ ݉%!5_buROތ`z7$Jo$q#{\rϰT(^dMka_7+ggnVbXZx߸{r ;@y-4G,æpa^UشiM'Z+vnQS( &y[4 +i NҶ,'qgsLG]oP3jݏY +־8k1ND +j$[{(@/#D^Ï:?=9Oo٨,>yz=ŷ*}]5f(zl1C'@ܸe 3u(U9"9&@T~:UP1H_ Pz+ w~(.d_[fZ=$z[Ta[2"Ȉ/@QM|mɼt2b4Tt=Ti +endstream +endobj +24 0 obj +<< +/Length 1924 +/Filter /FlateDecode +>> +stream +HW[o6~7GiX)ı +aPH$] h~9$m6fڠIQhl)f ,Xa\v~u4hXhooGPh/ @z#yn/f~bG2|uI!/j̱I a-ઍv^ +Z=pD Lyj7Ubsƞd^=c ;=RVM(k<}Aۆ{İC-v iRZiMIZr;A~1C֒#n᭎>otAS. cCx_۾vin\d4;liFh&O)⽹'z[9EHfMEQ:ɯfJzYxQYJUN_50ޔ{Rj/ߴo/[\6˶s- \_;xÇwemgⵏBѭd:.icR&ٱ(K8rRlڮHLs ^0Ӱ{"Lqo8mw +tB?vpUDn$h=JWS澮;)EwT) Mm)5(h(p.( -d⋙+[ٺڼ4 ڰk( `אElIgbjn)! r?L ;skxHeC0Ee炢sQ#9JTjQyb r3c:zghbh|O0 \f|;lF)ơ ~shU0 6lBQbSct!c l]9X?̡F`F0R@ǓZh􏲊bK\mffi.tq+L(j^9 %*&T Ɖ2m1]1q̩*v?v+'A2-F<֙ޚ|47ZWUp!&u;JQ2I,f8 m +Tab)IQjqT__3rI5bI$Am +m׹vm4^GO7ZYw856Ix]Pʥk-|ǀcO6 n3,Dj'G-W7FA,L% Ӭ+ +I5gL5{FV⚪Bmrmf+5*(6ZDA䭖[] +}a뀴u#+or\WÌG[_U5~a~&/v?\Ӱ4l U%{LQ$We_b\WI)$T?DI)4%^yJ̨|Ʊ:@x ]4L'G:rʴ״)JKF^Z: +F}NW rSzVR +RhATq@b +:7].+cKzō.1?m E2ﱾ?_L9tj~njyv/Of.Бfu< !,D[M"$3aS> +stream +HWKo6/AUe"X d::wҒ^ g87srqr\\\PBi-ECeፑr\Ca8駧Du傁(mX`a\b_Y5wZꈝ[q(a c;ƚ4`cV\ki<q@%P܁gͺ_|6k=xN(w)߬vNLwS-mtփ6JĪ6TNƹόh}[-sOni]q:;Hq}ɾx^oTJRk]gQ?!D䨳imX>F!zwc0c_T~Lv` N:Spnq NfJ7$LfB;޸jsM0ZWOrw~T톍\mӥ=$%cD]kE՟+ˋZ|U#V[~7juݚ| +FeNV޶z훯X}F{WqKƞW8d(18NOOeu \>F E .~Fk +n6kP=^B?P9< +Jsnr,%z&M+9ہʦ{R֦"@um) Ĩb>m3c9M9 E*/irrnGn&]$ ϐ$-̈́H9|;LnQq=>uo7ޢE4Om={vo6q8919\T9@:~('`0i{G.$du~ ~e:#%<8Avo2M6^~-w˜2mh>(܇{3w̡rkAe„,RP9S%vR-IA5ѥ |&QI,˵b6iY0z0.ḷU:<.](N$#U%~|e +}Ji\rLA+VIƕڥdJ`lҼFȾ ]iU֝9DQ1o H^~0Y Cc>'92֯'0DVqJ(EL8 g }[ h&M.jd ϊ'cŇ;hpw٬e2 0XuE"Ę!J,s[&-uK(boނw8(#w!.*IEl[HW₆h\8NvI4=dHa7:ٝN|>Z}rW\%x̱ݵpQ]m61~e^M`bslҕM"N3uڮ\ݼ[7n\ֶh< XjukmK7Λ%.+l%.70j8˰Bb6ԔiJz7`~ӌsh#Q9όz= DJt-14DC}h2UP"!.TĖޤwU[ J1vwʷhV^ێȒm|2EzUya ڂEԴ`M;6瀚H;yUh"h@:#55G )e5*4 0M +endstream +endobj +26 0 obj +<< +/Length 1859 +/Filter /FlateDecode +>> +stream +HW[k7~_ǙQt3`@ V +tiҨƒd5.V׵n`ܼQ}{f oE7Vn4Q3 +~unaהUo~e7Lp[0w{`{ o#<£y&9߃GaVT*a"k+Ҿj통)W҇>Bȱ\sge\ޥDaͷѕk7!gh=t]r#b39Y5lOa 3]"Qĕ,I#Iܱ$ml<m?O#2 ~p2AҩpNfed]৞,4OOB(~ٔjݾo]prEj:jUic:?BB /GZPkOG:*%&hitU~G.'S=C4GB|\8 V8.HQ' s O='?݂ ~?WGr'@2> +stream +HWmk9nGzY 9zh!>J[wzF/+i%Ǎ7)4w%hgm:ܮWo֫׫61# QCXBWW%v~\,m#RЖD%8a^lOw +>Ilx^e[u}Kl^ ,]k'ulv;e. /|tckLHNnM1&xHDsC7VHzB8\wQ}B`c-}F-fӉv1f&L=SlD]qK *9]W~d̽fMvM U72DvᱞP;-[`CX ٲP!O9 \&7ë=iEߓ@vCR`dFۻwAϨ976Tkih 2+kim?E kJ5/W9Kxl- +-.j& +o<ׅ>x lNa,9g cwcb3 +@F^ΐ#܈Mp(J0)#qQWjTk5cGᾩo"(SRܟ3L;UIlB~16yΕTn|!A^Ny+XIeuEߣB*mh+J#k<ED|?RNQ3!2)">LFoQ`Jd1<яhL"0M)x0K뢫vvQLñSmjDV١/Zحh>R+iy.B$>ih|^d,SG6jYk ,F*2mqand^-7Ƈ6OHRq٢{.fu>I#\]]NsiN h;FEeI8`Mu7[5s +s)*VA>!@kryyq3ړ{rȹnI-mdmZz* TPevg)[Hvg6}݊Nn_chV=9*LR>xya}At 0ˆ ׇd>PQUVFEm%?08BOGˢ4Lu0u-/qј*a5c_m }ڪ͇-JJn>ov6ߡڽ[Ĵ+8 ++Au->=N2~le:]vZY:tIM0-dyOFM9采k>Nt +SFеi<޿(ZE[  +vg{۟ٲnZqT_\A}Zg-x +lygIT%SThbjcp\ Jzh=egH{kH&1f\ʊ# e '%^˩ħ-(=l6SFH09Q0G='d=rS/D)[)(4f?<֋(݆yo9^޳`07J FŚyxb є젰bʝ!aFW2sS "΄ %VlY$ 菖0HZx^ZP-3Gnv"Ȑ&+PqA'\@3$AF?B}O)U$B8],2@ɱOCm,F|6J }>.Y[ +bGc>~8(:ł~Cp~HSbƌފY Υ'fr=FX*_)% D"ܐT,As#ێ''"5]N)7 +endstream +endobj +28 0 obj +<< +/Length 1978 +/Filter /FlateDecode +>> +stream +HW[O7~_Ǚc|[B#V)R&4&=xC`\;: !vPJ᳗#~uLç2Q _.χ/GˣͯG5&GkeAH̐khtw9[6 +]y XPĹ&uԮaלӪswDn8(e>ܜ=|q>[8:vKǪ=n83XTeu.^F''ǯƟϑÀGt1$pkC ݣ뷍i}1(l"Nc!E@LbYY[ m7;q-Z85Cnwִ:p)"aHeL +#ځ˰Ws?kXgƒpB^`PގۿMyV}JTYœj;7pɪg WH>l 8^e(՘JֆoJ u=3@ՅQ.*=4w^n+(2i{'JGVѤi.v֯n­{lKB˪hJot02 ʒٝCAOpY%[m +($EUN ހip,m595}!P@ 7A1S r–a+R*z p/ ų!ɪ t3(ާ(%GPZegQQ{ڡ &kX^>L~b% 21\kռQJEyf&(+=/ +6kJ%tvKX T*q*q޺zY<y2AZ'A\fߟ.@,EKȳ+O_&/r +ӧ.GU9B䜽2QbQtŔᎧ#CY)G CUaH6 w~jQ.mDd٬@OUhSF +OLqq>%j`> ; a/xkjXy> k12;C!'x ~υC,"! tDLXoeB] +M a)kts{dЊ~hI@3pk^s13YŔ«醹[U"M}))m{ξd3OC޿köƭ"F_`?B|XZ +꽟YA +endstream +endobj +29 0 obj +<< +/Length 2000 +/Filter /FlateDecode +>> +stream +HWnF}GW.jih)j nTGM4v*(ZKɱ&$˹93xz8[\ޜ-Il$lAP Dc" +٢FgV 5iC|+:nICjhzNp{kRsjr5k~C7?-V`gA7?" l20)Gk,П⮬T|/kɊJKUˊeR+hЃ}>ٔŻRTiTVמrw8IuʋNڪrB:!\-J(TP_ZjZFWWAW-: &0lx&b`3=.fkV =/nYMfGA̚ +rV#lIT`-1 jy9Mh$Vz⍥?>>9R.f}=i1ng0l&ݶݡpTvkm4:bh:m6J#d-kB@Zn*שECtf>_0EtpMl0{nD1!LTg1\٦JQ;96|*c;0"fޮvw9g+;v ꢚ "jGSi$xEx +K 2=^?! 3j0ln`ƆL1-U!+ A~x= xxѾP%ϹY})pljH@9 C`H\"['î.*"" #YM7I,';"FuK} ^n0OenRT-˥*o26}B Ď໖vkiΠ+cz=MDuiyyi6b&~t\/}=(zzT>A1I]%ܟRf188Ja&qԪq.Rd]ńͅTX)!mb2Y').zIޙ7JZ{|P!eLq&M2nf4Vwd'p:on>Wܧpb&:Cχe\nvp}@89iްl|;W6 v@ *JЭߢX!]O +wl xV [~B3ޛX̻RMc#v7x^GLpVbt}sP=QNU锲)l)<-x`1MXqO#]H7NZ@0xn,hsVZUAW-: #*im7J sUfEMV.].IW=JW{2-}`t0ؗ ۮ1:v܂}"oJ_JJVJG)ҙRv gC85K$; rU{8o쀗jDID:PEd-dHc.3Jok9/ hU5+b2 ʯ,AaٿByitdz'oy_(؞7nIC ݓmCB\=r餿>,v> +stream +HW[k7~_0;#2 {[bHЇqBnH׉ 8rsVo_W|,](u]- +Z4}Cx!kFdq^GYѲa(Nb:ډB-.ޮW ӂ!u _׫VU\^mCR":R##TEFsl7eUo݆dD4fINYiOCeA]Tl翾[_ =2Rr`KIR u)67ueY5nˊp.gZ _2;TS1R֟ U} A94PEŀކt74K3;mpVq7,Lg=*PYX)xQR! +NK6{U3rXS{x6(Z>5Uë̅7ߚ*; U=D+6;e^w4hus Ypu*{V1'o mbN;Q|m>~O{QV g Kۦ5T|]K5% +Fi U@AܲYr_MDĐ*[A_MDM#QU6*i0\']&H&FWZTfqlZ Ű ^aRX%J043~Tsמ8m褭k#zF $Zrr H5Q8rgbғr6@a|]@&h75w:Y#ŋz"aKW +\vcb?㨉ȺEK6LYZSݺ((UMѥjcάy&B5 ߪ)v'59Tsc<֢'5gC<pHjT*ǗgEˇ8= ykR4#Hh2M1FGAbq’fH_H=Ĉ,Ɂ@8X#"V6{w÷K+ +sn٤ZǯޗpO:xijŌ+8*YD/fUqU'L=l20~ࢉ0 +$BSzaI\ClRv-=r[Gx@dZ| '@6 kX6QڡFw.{"Hܹފ Cw4XOΚpNGN=zKN4r$8FԎc`mgp +c 6ʣs ha#CuCP3 5iLENXU95mЗgB䵉0N5%L锇|%*L'؄P.6%L()/qxF 9~餆4B?pgj7S#/Nvrpoc "^ +endstream +endobj +31 0 obj +<< +/BM /Normal +/Type /ExtGState +/ca 1 +>> +endobj +32 0 obj +<< +/BM /Normal +/CA 1 +/Type /ExtGState +>> +endobj +33 0 obj +<< +/BaseFont /BCDEEE+Calibri-Bold +/DescendantFonts [145 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 146 0 R +/Type /Font +>> +endobj +34 0 obj +<< +/BaseFont /BCDFEE+Calibri-Bold +/Encoding /WinAnsiEncoding +/FirstChar 32 +/FontDescriptor 147 0 R +/LastChar 122 +/Name /F2 +/Subtype /TrueType +/Type /Font +/Widths [226 0 0 0 0 0 0 0 0 0 +0 0 258 306 267 0 507 507 507 507 +507 507 507 507 507 0 276 0 0 0 +0 0 0 606 0 529 0 488 459 637 +0 0 0 547 423 874 659 676 532 0 +0 473 495 0 0 906 0 520 0 0 +0 0 0 0 0 494 0 418 537 503 +0 474 0 246 255 480 246 813 537 538 +0 537 355 399 347 537 0 745 0 474 +397] +>> +endobj +35 0 obj +<< +/BaseFont /BCDGEE+Calibri +/Encoding /WinAnsiEncoding +/FirstChar 32 +/FontDescriptor 148 0 R +/LastChar 122 +/Name /F3 +/Subtype /TrueType +/Type /Font +/Widths [226 0 0 0 0 0 0 0 303 303 +0 0 250 306 252 0 507 507 507 507 +507 507 507 507 507 507 268 268 0 0 +0 0 0 0 0 0 0 488 0 631 +0 252 0 0 0 0 646 662 517 0 +543 459 487 0 0 890 0 0 0 0 +0 0 0 0 0 479 525 423 525 498 +305 471 525 230 239 455 230 799 525 527 +525 0 349 391 335 525 0 715 0 453 +395] +>> +endobj +36 0 obj +<< +/BaseFont /BCDHEE+Calibri +/DescendantFonts [149 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 150 0 R +/Type /Font +>> +endobj +37 0 obj +<< +/BaseFont /ArialMT +/Encoding /WinAnsiEncoding +/FirstChar 32 +/FontDescriptor 151 0 R +/LastChar 32 +/Name /F5 +/Subtype /TrueType +/Type /Font +/Widths [278] +>> +endobj +38 0 obj +<< +/BaseFont /BCDIEE+Wingdings-Regular +/DescendantFonts [152 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 153 0 R +/Type /Font +>> +endobj +39 0 obj +<< +/BaseFont /TimesNewRomanPSMT +/Encoding /WinAnsiEncoding +/FirstChar 32 +/FontDescriptor 154 0 R +/LastChar 32 +/Name /F7 +/Subtype /TrueType +/Type /Font +/Widths [250] +>> +endobj +40 0 obj +<< +/Length 4181 +/Filter /FlateDecode +>> +stream +x]o.@~+ orQA|m4E Eu__]@rwp2L_|ӄWO鿷7a'yۛ/lhOd3rRl4[6w_~y{3Z|we79D8X X߭3h%-Z(po /l1Lp7㧇;{53ω4<dC\Lcbս}yPAl[ r;q :0/m6ϘP~.^*75 F[KF082D`tk9z%+(4h9ԛU[/UvY3t6{r0T2H] L~,A$lh F+&.,y7Rjg"Z (|NӇ`uG eҤō69LqM_m)d'Ȋ PBVk9V6_Nmu:>JT ԥfIX=Z#.g◔# M](=J~W'ҢAp%*A)X!tX`k Lz5of>'*,ܒ:ɚ [lh=F/ 1Iz˸JV6QZVZ}Z^lX}\zrzdZ q- B~_yY&`>l#8 m!^^8]2a6Z/SXOȴ0 +VDS$yCHj{Ò]` 3w \F@Bʀijxzr8z͡JK3]{T0uGhN",DYmj4 }OZ) + '&0HHY-.8F CĎTKVa* +Z"'07InM]Jaƃ^CW @lHR +w"v%`ux[]"C}%.7ƌAVYNI ;stSgZ}0N߻)a-Wd5=.frlPDD̯%ڝ>Xi}-V_?]!kO ehF"h<$ ˱<-sEE]"J,lۄ-1Zh8eX< c}<4EWXcx\YP HhqThq s)_ֺ!,]h~TŝBUYR5pMYWsXuX m'z`݇A&&>cdpXt͓ج☉bS0Eu>h*@f"FxqCy`3ko|ke B#d8mw*RfiCoNP@x"Kf${d_HWwԏCʮ$-tvrʠ{[i^[F2Upjk";ƪ41y!}W^=y:JfC}XH@wGz!ؠ{9" "SXE=AN@ %7<Bl;$Q>4G 0-r"BmV RY`M{"§keiJqXJV0 r\ d(h^M o<+*%*j EqV\7[iكD \̵g|PI5Bd'*.J6/tqs!Z;T_`3!DI pJZI6.!`bb|SftRj̆WP2ĽS.uZr;^sm l:pCXp>ߎb:s]oJd1wBo9\+67>!MafvD4enB1`n̬m{N rOCu.yKvµ[ {vƺ3^.vK~; a!v}tAc>c;ggm]pm]t]&LZC\n(Ӛ#L{YC}0uԠ +Z]:KJf`AiџhVMUlJDC5p95 fѪٝ7fj{uK|(yG#Po%]=ߋfF u@*8wk +>v^bP$N3[PfNɒY:].d&G4ƦY/1#Vf3N? + lıT6 Si#EmX[n 4k`hqQ̸Cl|2qeVӃо]Ah&桐h>`NjPba;tw,n +嚉o~+c=%Y}~xc~dǥ28/?$iX{pv9"뷠WG86gԝ[JaȢJ?!–M&Aqf _>UgXcXdzkgvMOT]X;?σL5v Vz:\K8b,f>;7hY8;;(NaLޙwI,raK(#&1'vA&:e/@# JBF$ClOh|_[,տZCUwIdWI E[PY!&I5y4Hbpі:aTm0Q&Vrp +mb{G|f{IRx&!+loҽXV0Y +W٘ ͆0 gNpA;A0ће-jk>zܹIg呻_uT֎@OK3r;DÞ`![x$(6a>saYW^ayݗ'qo~qdn >F BffM4)NZlCr} ( eCdUy{%^tdYS/TedEJAAwsڹl*s:0Zihs=:_8wF c8&fUd,_nC zN{ԂX쇱X\b/9:k.uy*ĂKsbޥ1Dl !0愞Gaam +$NM C + +endstream +endobj +41 0 obj +<< +/ID (Note 1) +/K [131 0 R 132 0 R 133 0 R 134 0 R 135 0 R] +/P 17 0 R +/Pg 14 0 R +/S /Footnote +/Type /StructElem +>> +endobj +42 0 obj +<< +/K [100 0 R 101 0 R] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +43 0 obj +<< +/K [102 0 R] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +44 0 obj +<< +/K [103 0 R] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +45 0 obj +<< +/K [4] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +46 0 obj +<< +/K [5] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +47 0 obj +<< +/K [6] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +48 0 obj +<< +/K [7] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +49 0 obj +<< +/K [8] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +50 0 obj +<< +/K [9] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +51 0 obj +<< +/K [10] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +52 0 obj +<< +/K [11] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +53 0 obj +<< +/K [12] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +54 0 obj +<< +/K [104 0 R 105 0 R] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +55 0 obj +<< +/K [15] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +56 0 obj +<< +/K [16] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +57 0 obj +<< +/K [17] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +58 0 obj +<< +/K [18] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +59 0 obj +<< +/K [19] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +60 0 obj +<< +/K [20] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +61 0 obj +<< +/K [21] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +62 0 obj +<< +/K [22] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +63 0 obj +<< +/K [23] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +64 0 obj +<< +/K [24] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +65 0 obj +<< +/K [25] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +66 0 obj +<< +/K [26] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +67 0 obj +<< +/A 155 0 R +/K [156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R +166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R] +/P 17 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +68 0 obj +<< +/K [47] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +69 0 obj +<< +/K [48] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +70 0 obj +<< +/K [49] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +71 0 obj +<< +/K [50] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +72 0 obj +<< +/A 173 0 R +/K [174 0 R 175 0 R] +/P 17 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +73 0 obj +<< +/K [53] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +74 0 obj +<< +/K [54] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +75 0 obj +<< +/K [55] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +76 0 obj +<< +/K [57] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +77 0 obj +<< +/K [59] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +78 0 obj +<< +/K [2] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +79 0 obj +<< +/K [3] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +80 0 obj +<< +/K [4] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +81 0 obj +<< +/A 176 0 R +/K [177 0 R 178 0 R 179 0 R] +/P 17 0 R +/Pg 15 0 R +/S /L +/Type /StructElem +>> +endobj +82 0 obj +<< +/K [8] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +83 0 obj +<< +/K [9] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +84 0 obj +<< +/K [10] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +85 0 obj +<< +/K [11] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +86 0 obj +<< +/K [12] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +87 0 obj +<< +/K [13] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +88 0 obj +<< +/K [14] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +89 0 obj +<< +/A 180 0 R +/K [181 0 R 182 0 R] +/P 17 0 R +/Pg 15 0 R +/S /L +/Type /StructElem +>> +endobj +90 0 obj +<< +/K [17] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +91 0 obj +<< +/K [18] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +92 0 obj +<< +/K [19] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +93 0 obj +<< +/K [20] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +94 0 obj +<< +/K [21] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +95 0 obj +<< +/K [22] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +96 0 obj +<< +/K [23] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +97 0 obj +<< +/K [24] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +98 0 obj +<< +/K [25] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +99 0 obj +<< +/K [26] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +100 0 obj +<< +/K 0 +/P 42 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +101 0 obj +<< +/ActualText ( ) +/K [1] +/P 42 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +102 0 obj +<< +/ActualText ( ) +/K [2] +/P 43 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +103 0 obj +<< +/ActualText ( ) +/K [3] +/P 44 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +104 0 obj +<< +/K 13 +/P 54 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +105 0 obj +<< +/ActualText ( ) +/K [14] +/P 54 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +106 0 obj +<< +/K [27] +/P 156 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +107 0 obj +<< +/K [28] +/P 157 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +108 0 obj +<< +/K [29] +/P 158 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +109 0 obj +<< +/K [30] +/P 159 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +110 0 obj +<< +/K [31] +/P 160 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +111 0 obj +<< +/K [32] +/P 161 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +112 0 obj +<< +/K [33] +/P 162 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +113 0 obj +<< +/K 34 +/P 183 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +114 0 obj +<< +/K [35] +/P 184 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +115 0 obj +<< +/K [36] +/P 185 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +116 0 obj +<< +/K [37] +/P 186 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +117 0 obj +<< +/K [38] +/P 164 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +118 0 obj +<< +/K [39] +/P 165 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +119 0 obj +<< +/K [40] +/P 166 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +120 0 obj +<< +/K [41] +/P 167 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +121 0 obj +<< +/K [42] +/P 168 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +122 0 obj +<< +/K [43] +/P 169 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +123 0 obj +<< +/K [44] +/P 170 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +124 0 obj +<< +/K [45] +/P 171 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +125 0 obj +<< +/K [46] +/P 172 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +126 0 obj +<< +/K [51] +/P 174 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +127 0 obj +<< +/K 52 +/P 187 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +128 0 obj +<< +/K 56 +/P 188 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +129 0 obj +<< +/K 58 +/P 189 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +130 0 obj +<< +/K 60 +/P 190 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +131 0 obj +<< +/K [61] +/P 41 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +132 0 obj +<< +/K [62] +/P 41 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +133 0 obj +<< +/K [63] +/P 41 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +134 0 obj +<< +/K [64] +/P 41 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +135 0 obj +<< +/K [65] +/P 41 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +136 0 obj +<< +/K [0] +/P 191 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +137 0 obj +<< +/K [1] +/P 192 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +138 0 obj +<< +/K [5] +/P 177 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +139 0 obj +<< +/K [6] +/P 178 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +140 0 obj +<< +/K [7] +/P 179 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +141 0 obj +<< +/K [15] +/P 181 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +142 0 obj +<< +/K [16] +/P 182 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +143 0 obj +<< +/Length 55207 +/Filter /FlateDecode +/Subtype /Type1C +>> +stream +H\V t׼_wvb)j!$<HB18M'̈́ٙdv$DkQQz* RSBAJ)(H"EE0DX Cad$RLEJH5R#" iFd$t iEC N/Q4r P[hzZA2ځ>cY/-m;ww]Iyڿοٿf + LM-p/8kՠ/( `O/JpKpOp!4Bq}PWКжо{ X!6Ucc  ۀbاE5I6|8> +/Yxށw=c*x?߅GgWB!NBEB/We(f3Ōg1̴1bQf9$yyg^a~żlb2ۙf/9aN2+b v4;.bcvUZv;{=^f͉Pn87+&rSrnW~%8KsrrOpOs5ܫn+{{{;} (oK{i|%_7w]|_˿#GiS!7o c L~ /4 -BR0 +~aU!  +'3?/0(.P & A3P@;c`/~^.8 "") +`q8R-+N9bCQU1%.{ŕ/u-O~xTxA"~)/ +3pIpk3dxMx{)ȑ"/D6GG>\ DQ:*FFGGESYhKԈvGWD*QdqcKjak$\8~BXך1IUJuN:چ[ks!倊#O-).m== pFX1W1XFJI5ZḊ1dܷu.(+`y`46k/gv 6wǻcw}5Z"&*DIS +ITIQi+RJmRTU+4j@Q:s?{wJ0̹={h4-"F#,Q1d$&ܘɤ&3+垏W<:( 1D:k '&xR'gsp lB:x-Xt:ӳ9)Xg5+BF, ˺M|#G<y>|)))))))))))))))) 'O ?A~ 'O? AVN5Ԭ+#y׽%^v2o4'Wo4 +MFхQSSSSSSSӨӨӨӨӨӨӨӨ Q.D]u!Bԅөөөөөөөө S LAxh44A&DO@JJJJJJJFFFFFFFF]u!Bԅ Q.DNNNNNNNN]0a +A=]V۸mCva(w|X.SAlFx.'s2D>2CX𪳪ȝfTQM><)Lzf?^_qU棟I2Z7wHc4;sn'hy#,v,7cv='{;1qJnvȂ.\ӾQS1L8M;_&CSpD'SV,\^qmd#L{2|sdN)#cFDB)Ғsp0S'dZ,%`98I9g1#5*HAIVRrrII˽v[fZ2&'-(;̤,37)js1ytn`@'(*Ŝ0w;^܏QTc(!AQ\zQu⻘g`ދ`(Y'Q&`Aǂ>7h^9X۰/cQZ.Q',i’XrqKXKkKϠeQ$~Pve(߉(GXփeOa<,?`EVXq+`e+۰"V-Ī}XV`V +Pщ?XkbX;)*O-ۅuX*W`/AC6njQ T@4{~kPmTjZPӅQ| 5PV6Z AU~x Gl +b(6}Ӹ||[4PE.ԟB4 .4@MSyx +d7[8|A9  *_C @!pͧ| -}hy0bQl;ma;x5Յ]FV~ j5Ǡ6Av BOA_}?>ϱ{#vOg{V3 ƾоh:t vxN3 .x +^x{޷Y؏Xga$> +|y3z+у+߃2w,,~I,cK7,sbTgsxVسb"+βҁ[Xi6 +UXuCXšI!`6'xZ+ֺv ko#PO`$̺1+'hA۲>\ʆlxleL,&濳ًWbÖil`&/r¾&la}b 'c;s;YŮ*dhv''hCxב3%ҕHO" ߛAHTkF':jMb}ˡcr8n"-G&q$}91sHEN INv?'H|9s vc!C$ؑ- IXIVHGFRKILRIGIɩS9uΜ^#HdOəN ]rfpn +9?pK.bK^RH]Hj!iCG.R<]˥\q'Wΐ#}yd##̿U-Wݹj KETJv'"'G\kVJ]ɝIn9\wF'gEy#! 7sc?(\Ma87fnS$:sk2 +c=)؉Ps55f:5!ԤQS3O? /y񌗿W*u0- ovv8o S'䉸fl4{,J\QG>.cĢX<ar(H+%oic&mmki{TMv5bW։UhƋ&GY/*0[:/ytrNyb*yW. (DKtwk/6b)b{IlŮ ;w*ݮ}{׋vZNڋP-QQ#q8qrLqT-=HXFzႱ4mhn sR+!tiRMT귙׫mbe!)F25&zsK[1]ouYiTWz*㵻>^]>*iQNxgci +6U$ź!pS*M:D4pj[\LP2w4l)ڽV2٘B1ĆeT7ruFɣow[C箲oMVۭ_~׭*ҳݳUj(hk_G\**=Ir⏘gs}WF45#~ wdQ3K?[djha8'6}h*͛8%ʌTEJLjt27*@XX+W\zj Fo긱`di^ǎ}o-;|N3\'ѪE宮2~otjrvlt:499}MΟd*mpZϝNiu|]_fyf{_8\FΝ<ܨs-Bߥ&^a]9lViTWm#D"T˨QFVQ[VYeuT hHд APE"ڄ6q3IŹxjHzy}}{u68n&AL~crB*a^CFe8yĘ,Z~Oݲ" oJB{#i2?kj5vv +cEWJuddXA,R ^uZT<1`'1BwmLAЎfMLh-`R1SP'6 !P +A`8:Iy o;5WcMsb8H?C (O2 '1Xe($Q#m*Z&D%Ÿ$?Y$W@\2i)<1q1'<%1tX)TrjY(W-\8+̅:ζB`*B*brydDz +^ [wQ? DVkE cHikE `qo/8H"`5Z:>t/` l)(x֔:2;g ~乑K:pCB.\?$+ /D:s;LdVާ_yElWnrIwV2aQrV>aE诣l|MG3KdѸWrhmqc]D@ +5맖o@J ⱐ[`юR1M"ebTk +"2rsܜ,JT +)Jf;<36v` |MRLyg%Lha@ Բv] 6 P VX z܊:`67vs۶ͤf_P(عIѽFQgqD^4El nN aEti=|$5SA ;pGs`#C[T ]GuW [u%:F"{mP&(qUU:swTK)ہ+?@U0:IlOh1'D'I2k^OKW˄3'ٰm}OkZG`:!Ūl9ma> ,ͅOoǷAN +'). O $1gaS +FA *j`jHs85 r65_ûix0+æeI؟k +,x´Y+xޅ%?Y7W ?'fSQ;OhmX>hap4q +T3{' +bq)"|("$C;{Cc~!"<Ϟ bp|;\hp'nMh!ofq?=#ȩnjb]M:ANdS@cK/'.]ؕҊr+n3BS'QڊFL_)kո3|㺲[51%l`o5yd8;E%_$C].gE.ӻEo{×/Hu1V*tcM\(uLv`^ʺ'd.aCc8φ%oNOc%Owre 7sT': Z6=(iRejVjqIvЍZS # qEׅثNf$+ :b!0 0z74d _n<78׍ +:|'4ꆃn-g2@~7F`n*4U&Ssb4]IUeIîvh EY"*4 68idQ&Ȫ"F (7;hH# +q9㭞מ3s2U{wؐc9} @,O<ȧ +y@,A霥>x0@o>0߹BQꄴHZF߁Wwx@ب h]}rġ?^`YDy +8QhxMB^ +iPM$H4řl?E5s 0Fξc\MG$#d 0X( _{]W{z)JGlc/9lIW8_o$#O9|Jf1D]`N^`&(f6+reҫ- M8,3Áդ +[p s%{=S~!’3#XsoXA^b׍rDT;\0|uijCl"SKOaFpfٽƝX]W Q/qYU̳G{O_}љG4΋oz=< +֕7R,|𹎤#zJ +7䞸b~I:2-n8v& IX6}]B/狅e /  r!r +W[q:eeT#8JI؊Ÿ ~#V{DWR,NGNJ?8$1aK~#}P@Wck"o- MRU{ +j9 55ZgӶ0&22aq5W5 :PMHd\& +i O~ +߭ +O[;W7 @),1oѻH <|Lqt6Q0H|K`S MeKw Z>&8§ iDN- "ν_O4?8fNYpZ*~$墦[M/`tqjA="wU0,B3p-1igtButW=!O-[uVjo 3<6xhiJ$E#{hXQDj +ۃEMݭ=+{Z>t(JK,hk>yF5 :7mx\ >`8 >ؼ#Wk?,oۏ?|+3cʷD3? xO^W +(pỏhm;4kB4'!¼.mv}rWdd\鲫1oƔo b|-fzN̫! +K+|#n7X"M-S)Ҡ_ÐG/evHU :G!6VڏEܝDEXSHu PY Q4!j.\MN=ǨpJ/{Bs|O={z +3+ +pOa &RU^'W\ˇ008ZgO{" :b(IDr#mzp|LVZ3UkF52 +38@Gp|dfA,nKB4 +\-L#'(wsB yv曙 +;&_puCvϙ\*"G8%c[Єtj2I&y&`r9kX# v !>d7,Y )-.ʝ`BuA7ԅ $T]LOq#\=ÚfMg]v?`: sy| U%7UHϔ$<Բa$y”SL͇^!v|[0;xx*53LEU- %'KH=wSrm K-G^~6#̅*Ef hD[sq>d{ Z4xXjq9[]~.Q*$Blp]`DZhP t<8 + C@Hnz~⛽Ƽ +!jy&3;$ -pp +kjD#CXA.Cz$ȭP+ +yyK +kf=w/)ڛSyƺJ-hoh1WϏ7' x_vY?)V"XP%DBҫߦ8X/RMҢsyIZeӲeRefYe67"1R6yǶ=$5& e;?jQ4Q}`E&ミ̖%DSgP' u=Վ`UC;K%"ᙺ;֌IJ1 +,:F =dal Sy NM@>Ť\whMS2#X8(zy̅RG+6D.8lpLA2}-1g;M. h)hͷd5qb/\i%knOTaH]{*Jxf7Nks"rG=0[ Q/e*M2 |`UO=D P + /B4G1<OX_֤ZEE%UHơ^>׸ylweR)<嗡`P;khK6]ł?==ݞnn;\XצR%*~!! 賍jEEت\qnŢYTh=T¯Ewje13Aid6/#7᤯Jpk̾/e[835f35朶$|xӉ/BFB Y٫qqc!0vjh]`k4 a~1o߫ 2[qaEpR{ +t]l0e +FsYd6t=: # +Wq}ۇ{n RN"43bFfD9ӌzPlXuW0g7]ZNΥ@LPuv~E(nڹŖ1V*}$&Г 'c#*7HKU谈½3_~Owt?ã-08<`[RYZ~]E?oos(^fSkس<]YyAThhldV ?XN{:46LW{TtJ΋E=uي6vX.//`@ N^Ds qq_?O'ɎK%U9 DqL*ggLlom$]-|!Y[ +oӅ7G\ 'F!(NPF"4 3nDT]($4B9{$} z{q:tcdz 屐"_0~"*,@7Ӈbp4bh*L$e'˙S^ Fd޹FFyJ['>:&Y#qT|('"i_*+z#<Yh 2(.(`r#MU%0 pHcayEd˓pJo si{Mo ozpVo6_["=A_;yRx(vϊ`zid}]AQ\yw-SĢmUd7b'2'p( +ph9fA.f@n2"Ȩ1fJ4꯭֭TxUU{z`g3 LFs^}h0|ox'J:+$2؃:%ٗ +hw%v9"[}4P{ sZ<^zXZb{P):.8tJeϺz DO-`)FU+|W) +W +Faj*?_H%$(}1Lmv fzCm[Ll0y I Jod%ZwI:jT5XcdM\}U#˝EGL8^j=ifU".K y;]/B˃Y*Tqu)\{ɏ8g(< wxbG6[ϋJX0vWw_ǥk~`;ne^'vnġPpc~\mH{Ú$oG5oފ!qLOj[>~~A\~05flm%Q^o31'tnyhΧSϓ$O>&]t^tIm\5 [/˕JQ|1mUV%Z#bwM9ay /knւ/ah^@-sںFNKsMg &_)^)ny݌H Jc"FEפ q-8 ,בJTDtSX""Q +y.$= Uъw4(|L@V&Obq060~[<"hdolKcMe_W"=z4bwz?R mZXy{h5/>GRuJba.4n +xdeaq.{\ r̋C&T =${P)Cq37Sxh&zACwoЏ:-CZ7";4m![&0 W|~AB +$)c/VK!{+w'!(k6 +b{XԮlt׳ &+s6l-Zz:vLM,"`$ۻ Et +\5SM;)Z?UQȀ{2ֽB[G +>g9ӐQV^F^VLR&*D&:>3< +(\V(  Ԇs0l g_LN-^߆6>-`"(ON!y$qQsvC:&{I2%7#+MIL a)'‘.?!WC,<f?;X%"sENMOwk;gK\G[+GJ}8}bw(7`n +wvͲ~Y)Una~sI̭cEprb;j..o Qg"D+Jiw;tIm-}ۼ#*:T ;0!`1ZP/ )jp-p(s.>x{ouD4݋SVc + jlDx{#ė}Ty'yʜnۋg÷/Ctp<U|#e?bHAkX دŅ*'ELINqyNBZa_)`- SYlֶ)\rR䆽<,ctNzuT0.B aIf 0XH`!^'z=2a;;a+հ_ꁽGݤLKr$Y?$8q> g?,gGW;Ԭt g!qݝ;-0#uzѺ`tFwZwT܏ξ|<%|KYg/eO.q.N!%E &܀Y!Qom͛ZΏwϩ4/9|B4"CZ0e&G>0<_h>ks1 Tx>¯=vAEsQ" Ɨ0$Ԏ:\Wavv3 ^O&d z!>0 sf%#, -!pN~_ՖbTװ>!lA٥F]iyZwn:W@҇jS8jcʊMETXfNChX9"uVyDm]mLK1O=;=IiQ +4m ?d*ȔF BU޹x*j98;FLg)JM)UH W *pkd sE0۠me;rr^!Js2 < dnbdΔ89SyYm4~>cȨ [#E<<e^Yg[A/(E c9c;LWCx+ljz+=Bk<׍LtL +uT*(d#%҃4,7:c.ғ^ W/@;RK#qm#FWNl{Xay|y>'='3ik|}uv¹ںؔ42!CklPcCv[4/c Ӊ=(ك~9"gIJ8˫†ÔWm "ū{NazRfȒb,_+hQY 1Ӯ "WΧ]&đbMcaTŖCfA!I +/>stiƹ̣q% fJD +nCB6vg=MndاĀX&kQ;G^I9r‡Q|l%{aGaC`D V:eh!Vuyޣ6rFa9a'kMVҶjgɣt*(}j*v4t}\KkZY+v$a*v7BkJ L +٫TmU* j*EC*M b27.m#؊hقphGDe7- " +ȾE@iȈaiE1͔BJ|8e$!ħFW,aBSϞI CTwQ,n04Jl:ɲgV"@5|mƦ7l:.qE6wVSy3vY"6μgVp9^VXuu :X6[&'4.46>*a ]%ŰK|J79q 57h54̈́6z>[gr%kJr{r%}մWAgż]$5 Ij-@ڗ5ڗ];oU~Pb< +9\ {tYƲ# MHI1N>MR%^jc3ұ|4ȋiMl0E98WV+:%67`YA kqKՔmexT‚bՋ#Ѽx"QQ,ťIdҡe0vUc|҄j>-i^""iJ5P|7~ؿ;9-K ~0X2ZɕnJg~GIԁar!7z ѸUn +Ga1sQ]%soN dfbZy[V "v/VkƃUS{P<`>GfR$R;ݦdhw[8_UɗIۥDf{4ZwxBNU%G@*u>օ&քD&ҳEr9+չPDsK#eE)̉6"N& |/-kfF^4~$fJ>0A! <>Ç!_ms{Մ=[ +?[7.f/>Dg$ + +w+n2w?fC)*MQV(8{Q"3ŽjU7fʣߚLIZdo)!tf":"Tz*X15$$D _uu8m~i %hD_ˠU}G{~Qu9&KsVLebAn,k7b}F\cM`TV@+j}Z]K*, tZpHTk]iDLPH/jBV֌|TIӀb eHY~8c4LFYlp+1:_a旒d5cky^bo&/ۗ냅)fڵfvJH-~ *q߫nn + ϥѱEI'Sb8j< M DPbDf`F<'!(VGjc~c^0 ;Zpxj™T9Cz laƲhYL&Od~!DpւZǤt1-.e+7,S*cR:M"IcWB4IÞrVnv693丸˾uo /Toj\ũ4Wvm^DZHkڎL7N;&:7nށl,&1OmpzJAl'=+Ƥ&b}? [g +"9x7\BcBY殢yK^gd #b3DUҴ~~Usϩ"#j<8|M(mmJSM. gw3 1>'^$n\`=!vs.q `1w&WUQ|b=hEV>#@ PbFIK*J eiQ!Qmj +k9̀SiSJcTnve u!%Pɳ?+I-2ؑ윓{ —s;; ">{vDll>'4RW/D6+іCSչe\uf쮿V^1^j`AE#@kTuW`.Ĭh7ι@95a&Fn4w]i7?gp?;>І ڈo d^Gw n[DmuXjy`kW/׹`w/ A1P7Aά + ix ,ߚ[];ǠO6# Bp ջ˾G]<.4`? g/tONU'Ծ1 à?6CTG*ӦvHCN1OGp_uk8/>SUwɕ4]V#"ѻjӦvàHgujzgu3hy iKbl!蝖]i@֗F= Ym{ 6x.<~j`~,{HLp="g 3+c0m33wX+Zz6qa܃(Süb`k,n3ɽ.u.@Ȉ6t̻,P9tBU1.XrjihR<}qqal!/oc?-ݸ@,)3)#=a>fWvh3LlpLGsj9>aG"1 ޏ-(RHӅhJ9-p+̺Ƕޭd:nwYYuL]oՐP`D"@VFA-?Ot pQ{랻NCSy\,ZoƁ x`Yp'x%rDڈM0VFPVab %g32qcuv.똵?^ߦC{5u'ޛ])״po?V|G]uAM R 4lB |A>ъآVguu{s;sfrors~u(t;i-pIV~˛m_\:zl^5~>3a26o߁NwhkOޘ}AiYB0]Ʌc3~z]ڛEl +?0q]&oa^;_+݁mZԖ| u$ R~2}Xa=Cr/{oA{SGxn/.s^B?۫)j^7w_@z:6LzN.]*޵BC{ M.&M~=ޒz]+ ;I~.;',y,S^kWV +BwEɛļ%y}/͵l~ =c :хwb>rjyԜZ݅;k4Hkɺ<"TbA>Nn}(<,H%<,C4"9+bOfn?;_Ll0~w{pvwL4#H8ZEL06. Π69Vi uU5NS`i&쎃OV~=cfy9فD@TEg,Q]/kbFExBPhmF #[q0RQD]El~@ ' HiwgZxP)d +)8D$p @ue-7I9x2Im`1G֜%=ị]4Mv#[ x5,>,BKG[Ƨ&?dM \psVWX1|&>e1(Ѯ~n\KZP11'm^2Ml˕VqD-) F#>v$r?BYY8?2- +M#&;r 0CcBMOA>]Ǭ$e )hn:IzMX>,#1: ìF6i<-X̣R! *_TZ ng 1Gh͋U^ߢ^gWĖ)͠ Xy \hw_L7! kB"޳lC)̼D-od}ړwx Ӄm' qcjϕDҭ!.Z I6!',#bԇ ږN.>Zav?^Wb݆EQi5]:% +3cF x0փޫ)PHV#àeº'JHXU'qSlS`xfF%^/kԆMjڰqeA)x +Kqv2Yv|$LTЁcGNE ÛaZ#aMG?;fYwf8%,('f<`Y念?19, ̦SjK'S "J&<_BzzNybܰ,^(Mx >B-B*4-FaH /vT=hT@X \^l+XB?&={.) Չ6NDs$NDh^DF>P#ٜ +Xv{I/1dp" +d"0la[|!@C%6$g}?鞶Z',-px*p^P Yjօ;+V?0T{6T㷮SYߺ!noĉ;[-( "؇Z'Jۘ)͎1QMMt[oYϞS]P"3 ejj=I8mVUjcϮmGuy q+20[9GT`0f9+VW(AiԜ ~FOe^l^,׈"-+_ŃKS[ϼ(}!πߧ➌r*^NW=ZRR蓩td}J&_*.O]pKO!V|KhtG9O;K[;›}/d H!z+ND  +5+1 *8 YWc3_R*EfVRzahNE 1 +D9$dЄH8Er)ʐY" 6V}7ҙ^WB$dj]Z隨 XIeLAtYV5!؝ƆٞF#!mm:TȵG)IED05*}sIou>[ztq#?ګ4(+ XcC/yE\&3j4FpP 8T\ @d]ATn#MPtd@Qy UsTƱj]}}9'mT jЦQpX . "bl*h , |.]Po͍j-|v/uzU;`,]f _0z>k{յ7np+kLFzB:Z]V!iiWtz}] gcr#2v+:ha@`+ 9 ~a" k#1LTtķx +M щq߹PLѢ]^*^yͅrpgת b%fGqiwW >i+Li +>|742O"e+~T#B{7$'e΁n8A~)hj!v{7h%EV*]|Ą7O+1GB8N JDx>S!v䄅PTe- M:<I5I#4$V$IݛbhOD +e4r@ ᷮHFH)^ׇ!^ AG84 1kgg5FaÎQ``*R$e]=AuvDz0K9k։耼21l>C9Zʙ/9!2 1ēU*8$q1q +V7'ؗimm6%#e&tidM=~]Ȟ!RB'7b{"&844zccu;2B|>mQh W4sH@ד[fZ4ޚˑ?(u/CklRJilVEGj3 +d )g9qI+,`8.+W8i4ڒAj>]&\xE>|HłPK!V*Ho ‡T9LmΠ5˞Ar[tyjR!G县&$V)+hj`ar O /I#}"4$ "T;:]d [ nr>Fѷ&0d4/gf?N_'R[Z!԰5l(Ϝ{`HNˏ*ghh! ж:(g(DU$qEࠢc + (&ޛ D7 e)o$YzTW)Z~ N`Trk,j kkw߈~ fN!qsEeeY\ "B9iWbu9Ysiſ uL FXqB>F{H^W. qXs{!G*gQ rA,Zr Wd;3÷ΕpGe1mQn#{Bߔ<0\n/ uTry ]; +:M7Eut\q6O"3IW[i04Z'cѭb[* 籌ǞWSKU"zڨp[pѬHYbQNMKa*R[B9+p;ᐱ.n^H +SAAZ ^$TJP!?u_w=NqQJ-SO wD$p3PHw3L n*~i[o _`6ƅV!vjjE7Zg񦐌7Z[.ku:>Z@UKEYG$(R(vtS(Qj hu龙ôsn]:r=>g}4O"S=ws(DVV'yt%ԢJ ^hLNv]2$>iM$D7<$yN W7p2xeUdےBM$ ԞRn`ktKnW=GԚ jҕ RwiY@4S5mkCC,'3HԋI K +{*#!ؔ[@}EܠznwacE|q?ܯ0'$עoҨ|.[>G˹v2f#=QB6`Dg+j.c4YHDe: mVҧ+D%` 4 Ks[4;y<.('KcVrAkZF Z"P b7[ fL/a ^Ep +.Q SO`cbkk,tRcRbJl(F@ȶ_ZX#f'j}BU=~B㡦k~mA_ (*s {?+-.7Q]>f +aK<{agx0f'SN+IܤQ ZF"GǽQ`n,7lbH~'̫H *'ކ;ˆڷ!li/4qGrmK FUJ||"LԚr6XDFJ(sUs`fm"r{Xnf$2_וb9$~oe7*S0 d<\eݾ?.>_cc=}2FɔY;켞|VŻ.<7eu_/uIVjIAJܝr]KU"'(՞|ag0f'{WiPk_P|rFLa 6a7zd#>2PҪh +i;ѤpÀ0p&;Pt&QF.grI\Ɛ/}On"_&';Qᙟ,c%/^Edn'BsBeF#ӥ>zfXy zD&7covb_p@|]EV X] :!BDPFaXht")T`}4 džAL;8&RvLVosNK,:>GWy!T?9ټP .mHMEǨa?$U$R˸". ]IJYj±cx(]֣IITrGEe9I{ذT(O_ګ4(+J&84Aaz;MB%ґH*?ƶG+Ϸ}|S^[Ewaø ;Q: vA3?XtH_cO}B%_ts_W(;D?oXB4 -FMaQIeb FWȘh!ɣa4kr6'֒T%/hmd}XMfD'dˏ0/Q ;'O){zgj`YYyR!S_浪5&4T?c Sd#[浳grp)i +QY_hzEctpdhD(G޳ykOO\^`ȣdrVA(xS,ח! 0nH~HI=  9>D--B+vsg??(PY0{m$b5suxܠ-W +h y56F]<+;|yJПiE"b}T@AdmflkyL?Z +1v`;& Dr߫$?|Q)΢eBG+8``8H Q;zCϿ2!\KŔU[GDSSrW]g{U wROӔh4P6QFW#bu6|8oByS"Wi5є:} 9tnt^sfj7GUw648.~IKXGogh+CXoR\MpT\˳^ţ5TҸ=Ly} `NRcI䝪KN~B 0 ]ӊwV"%685o 1~F.g0hL7QSM]y4#ӧX4ޞ[E\H q 48\zϩHg ++PRϤPV3fY]a>G8(룻`[$k`Ψ_Mw!UYVWU4c4 +dϋ.asF;rOJs4Q ّR=n}XX"DP +a 1D! Ihގc;/2rIu09C4,{i=Op5[FFn"z,z?rUi蔤*80/Hg#[cu`8SMDhK'Պy^\kÐoAMe͕fxK|ryqDCOe#j<}S=}W\^vٮQ)c\UJY vrTVfv{rRYDm %v֬6Go>N_%V1;v1w_>bN4 i'oh{Z'6Oh=i{*EqZKm~\'V=P`ɓB)HK0VM^t}>@>sLu]3R{}4b曡#Kmxf]5`tšx%[obwj##8v? +awC f7΢:$.pBsހDl>!hG$ ыќ$v<ބ`D Y宫9m$fB\\-a?^//m+;YH46VDJF]5 ӊs偙\3Mu VKs0KDwǖxOxUkAM5{%lb|"}EaχTa}mkn0F/Y#,` +n7I0Is$yHBNT+c|cXv:M,ZZTrQ=+=S{5ufqp/g{٘k:>ve+n[BҭA "/*/MWE@A +]Vc잛pfDDpqG==;ww% lQ^..qr\a~悼PG++S&G܃qF; u۵x@dʄŞPlxW(+BT)ijQ;q (@~:[7)n N}9(0/zWzf\F~z|I_ 4uERq&>.tAZ{yx4# e`hFVB.2aDuIwRGHXv-^%5M-!_Oڣvv)#sEsqz;)tw:F_bctINAQ2_ȕ2L,rp'n<ǰ5 |_12'u妚7N5I1XmL\Hw?=[AjCÂ4+}jG2r̳ +82[ZD~d-H᭫ҕoCU3<6я;PdU%جN!-aIf $Q#,a1ƬQ\̝hʒ[`!gɮe4>(5L{d.0N)ڰ/I֊hr+ZNl$ +NW'T pOV +t*,y?j97G`&а vb6/61Ƀ4_tk a~ +%4کfhgɓ< ڌCs 52X>h@H$ACd pŖqۿ<#<*7HXJLK6MoNXo֫=tdge'k2RMH"]MJfL.!vm+ 1%!*J2 nvFcηyη3s8ggZ.St0֌8R#^"oE V[G; uT/~u7q+^d/gr*k{ܢh*-t@8יž +˘ܕaz)O(_0C9II^&-Cݏ&÷ cb ^M &)9iMh=*p5V5$+05É&x yH~r×mUEL%G,%NqlQzΉ7M]Wmܚ +c + 8j;zaJ6@jBA/=H،NhT[HW5Xj6ʠ;H20DhO{?7,xl\2iɫY1)٢׾+[GA=+9M @HN<aCX[~asa%2`$UMI{!ZM#?Nr"l`DS`O>A42fmvks;UQ0 +3$̐q^yfs0יJzsKra&]CpXG0 jZ?]}=Ba-Lm=e oNWA@+J"G2uC ƙa-;"< P/P +CJI! :GCچX4Iz2T'(a:^xW`hpFa#$?O$7ldH8"0 fvB*9[[M[0﹅KujͱBNjIXzJ,r, ;eGjwpGΪ=ƿ%K_gq}TG8Mp[5Oáfbxk (C5pj·hUk AQUTST1_UЂ:zi7DCn7_ɨ[m*qR=d MqM#go?`Kٕ_MS ʄW].y,fң;"H6uy +S8߆Z7 [z΍J5̼,ZSzy[PР,>웋yKf#U!똵_!VNi.!L<LtET4w2ԛ+]zXur,9^Nfe$g>&R[g0}FۼՆnb5%ߧd{`,fg'9!LjU߈Y <$D3 8s ।KQFcD$KaE?8=i +R`7S5JM΅]IMdM=\A f1r B"ڰヅd+}\uhҨ$L8mU0nW\]EEWE ( ""DdQ#ƠM5zKΙ]3'vWn}_]u4JnnY7DjLh0"DT2mI^p,x17xi1Fqv6D RSSuYHEyk^8 yk[WA0ኇ|8FRc,Дxw0N҇ԋR㙈0rƲ??}!)47:j^c'6#k8wn@zڸ}H/Aĸw2Rъ5k5t®> .Pf4d KUſ2"٣ڥd,}DgK"6?`9&c[Bn2:Bo9P=sVކ|5>a>!C; &ݦWy3B8sSŕ }sАesLwd3~Fhmꆵ%2 + 0AUrlj 桩r0I8D75$R&-0<議}?d04) +k"Ck;&#y4 +I4VGšH LpwBjɈt, |XʊHDߺ_UEmLkģCs'jrd)bSQ}X|6bU q) 9V^X4kȚ6ҝ5ePduYS- xǩ"Tr׀w՚B(d2Ki֠ld iʼ;y.l-[䧤{WHARYVF#Vx`$eD_[gv?ș4([svX;!ۏ--1Xhc.0Fp@QK.!>5뷠"4qG7ǰ1) +!ETTp2zRO !|& +Fj@j>sB!pBy {axn߻eMXjBN.^"৮ӿg:~pL=;\!+t1cvr6PV ˖Wd5un~j.,x œcg?+>*+OQnJoCٴ +ݺ]F 9burfI 5=L} +#<;P|/GބukQ1: *EQvX%2!`hQŅa e?8Ev8T +ꌶ7̏/*SxΜ9+y{? +GBR2|Q$PN8SC6MJUJH`C+ +v{;MY[+-6NT3XJU0Q[Zwlagw#YkWՏ7VDP9]u/- f}hcka2c"*erˆ7N8%d4|H<爮zW EUFi)l%;,88UO[[[ 'ڡ6H388*f!CgWL, >yT0Z΁bs+bi6-(KЯwJ"s,ȺȤ Z,XI$>A-D5N!>6 +LJAP(~4Q_fUn@<(JFYHY*2ryno_Zǟ`81 nBӓZбTeWg2١}GZ8j/v~L81 wZ.րCUe[1.9Ȧјg;2硉gA"#B尘k "7w5`6Fy"*戹{ixE C9jbSqYtCrGa#*//ԝO`(Ln3;ڀ%y6>%Dw$'_:ᒾsn$"t$N |? +QDDz;\ JwZʵRLMV'#qehC%n|,&ơ(C'@ᐺL0`t# ׀ ++b +Y"W_aQ3(~7 +amõ[)}k@S^UYSX] g7+ +ܾw].{ TtYP h?fd'7!5;6\݊YGc>?%kV O23Uﭒǩ:ӭm~#5l #  +d.n񒐌h'@HyĖLB_eߩ OXf#ZRάHb&g0n΍C&QQOmA;ߑYe5{<6CMCДKQN<&]-K*I"ȳu^ +DC3o|_@ryccNlZzSe=֌})I'h*ӟo!9H-hbse2/yh}3HaFS/Ӡc?h `hNb~: 'kx^ҨBYonyoZfPoXZ%{2g %D \0g ߜ7H,dD<_:Bĵ`jp,^$~3 +Zb6Dza#}8P^}v5x\Td:\Ozb\AfboɦiVއo uWӫW E}MAZ+Q"{yXo7mE#Y~Bc Z4'[3fdЫwPWEՋaz\uN:Y4Z>Nq`3  Y #$AkOa6ШM M܁%>p.Mefh?</O,"u`):0y IpC= aq uF/39lj9sA"+*"]Y$ $\. ++\Tr)`@V4*]}ѱ_jwѿ2g&}b =5xy.4M)y.yk4`6Wd&2,5zaӤ\ +f.m)ڨa">|W?̯ x*I1{> +cx 4~h?{7it7 _[Ghvc~1Y%GK8*;. r;dA=M7VcD l 8XP}J5׊-\q38q3==>~?[uOzʒSԓ'beZE 4cǼᓇ` '&>T72,4ŨbJQXmmV`R`b~xQّʓ}'^]pCmDE^愈 :d<'LiJb k$ ?WM-snnS]N)#% ~z%U 925ZuB9Zhl~}5e((<_zSJZ~Sl2e÷ ^j ܇g+NUk7u h}=S2ByfdžX;l2kCOߛ+(D1 +%Bd o>q࢜M|C?8̱ӊ+7UwI5&- +ˎ ǃFbEhXrrEY(II QSv::_=~4N:iKX7 Chvt`C=QkfwIMG3fӿEj!д9˂ѦzBڔ)oeQ= +!%в~XK̠نp J Ip _v">ɉkt?hu6\U/oX[TSتRSWFqFn0#9jI]v^xێjuM𚜽NBed +0-_%?Kf@ŨmPwarI76nSoetT% -4o>^uiAD%Q[ؚ\\>#C!:5G1  r$J֕JHj) L.ن50R*ːgoՖ8Ik.!vՆ\12,GXevQ +  f.c(]GL@v_TjU+&Hg>%(Q%"5(LZEfEF9; cl?lĀm7XMЎI#2䀬_[a&z3akD9o._XN+>Yۋ74/b;hxO&B0i2r6İɗh7_JtwLOc,^N^atA~q"J/~iDDUCMt\;ٸlMsJrJUBRA< _E򥬜=}ARMW|(dАhqtV~=À]Gq)[4V\IYŌذخS^B2#Kq8M$ G'gԬ4tj`5I aΧEJ?ҤwpD! +ņo֤g: (.셤Yrj8)\fr7sRk1 +(ªm]Zm}TRB $  +(!(<*7@|Tef~t߽nk3;o>GLIU j`udRpxIpi1n?ΦoOyw寳W~Oopu.W JD^#Q` +z`C:xEg(ccB1->TqޗVK0lZu2-CpK+ݓw.̛Gy`ex9c;hfnˍ@֝i)8qs/(&lk\:}*m-7y%zvX?xŸ;r"W)`;^ܸa2dp47f82w$)gLy8I7,<5EE34t[O—FG3$65ĉn:L6񩩉JcJ#v+碾;.X'9*HAZx#<*-mOYW\t!*vPd AD9(S1n1#:E壋ѻpl.ܻo=!H9Zr3U/\|3.#L>ͯ1x~F}&.—.6D>H0B @$X@PaR6H,?+#8zl{faΰ%d3|G2k +LW3"l M=7TژƀގěZNu;fZD>jEjē#L;9rwA#~G ^>=H1|>>H?=hh4"ihBlPߺ2?uG<=D2X ӱ2A_7dߵ'k/Jw'Qŕfu3\e޷dI2ʄ@zѸ{4k'Ng@049-i㻋rm}1Z wsV0í밿g.e(.Aѫ/sRI}F\0~淝BSMZsU.;U0 +=dcX[ &>=>r$"H;;۫gFlk3+}9{`95S6r4nt(7u)P0f.}U>kϚc] &^Sm<7n\W D[^#]a2Z;O0n|)(wV0pϛUm`zQ ?͎MnK:8OU=|3cDxcC! {:iI itJv {PuIn;3P!Z!1b~FLj(#cafmö\C%s$Ka2DKavam+E!f` {__T Nt)j^:ۣJ*K#ó%\ K\h, W>r ܠn< ㇸ$N$ W+26cV.;" ]ƠrU&1(ݽ8l{<v>Ssh\]6rU,X_čc-죁$*1. W'I Yo5S\P!5VH"8VrM/ ko3bGwn̡VK**‘l4R>x\Ƨҩg_Nþwyڏ5sOk} e]-ϏCKE(*NY*ܬ5%ψRՑJ/wi6֑FjW֗/Ēhi"REֽ +?g +|ǎ]By@welCrf< 9%:͌ΈV@9Sy6b=%^HJKbcshmn+ +-kjzPNBΖB=!bZ{-to%gEԑs"~v3#PͣG9EC1dz`Ko%&-bȀ1LTIB#ڃ0d՘F-vE8XFN66 +U. 8`x tX6@] Vq85w]8L'{wN#f$d6Ty^AVB؃ȰÞ1'׎^l8mv"~Fo W3szs7;VBN$< 7E8)TR"XANM|iԡqt|cёYQnH=zsX$|X EoH &C:'_/p;Y*J#[Vf|8-݂a;rW@H\ -x2S}DtHyCzYf'z1gyZGeٓ ꛽ QoO(J^#ם-xFyʅ"30Hb߁?@Z +UVr&:^f 0kn^n067q 11ۗEC`^Xf+z%%MzM!8g|Xt558_֣[f@)zdE)fw=;JbQsÐؙ$:h*+k}E'+|M +< EbIUwѺ_akf7 ƴ~imDk)4=EVr&W4Iò@_NH!0yKмjKР)XY|ȬGmmEV2Il`,֯qǵ?K3q:86$|A\dl?\NP 1&)e(ߴ@@rJJܯFÆc`xGDJ8oډ7iWS\.Q狻k ^,KObJ?RZϢm#=#̽ C:MxYn D%#L`:'WTJ\MBbܗ1_ȼ}#6/,&FMSM_-Z~XRdTFyF}/I[..BU Xy$8H&*g8ʫ@M-1O}HŻC\Y8D~_P~vMn- >O֖dm%GYD%ڥ!oka~ k!-!/nn,qy%x-7c![b8!V#i\!?/.YNy\= Q"q[>C [Yu2'%=/ЬQgf]ZBUЪ0k$)qF"r{}l:_BB|l'#GA6wj Mq`2Yg%.0o +WJo&D-\ed?c+U,qVXO :`9<*@GL{5KXnTCֱ$ad(Eu +fz WVX9lYGt:!ce)Jjj]Jqת4G~aŮ!%Horb^4PIA_hU+"F!{ISH^>R|=aaxxalXv Đ]\s}*QۣKL8m`r>$5!08M:?{(2`*80Gl +lx7.8z9UH|b(n+q{X=(Z=54mxˮ |28U5^Gn//EnԱ2JV--; ,z8_'hmnl؉@_jO+Ot!<"|`~bJWhp B^ +EQnj }0!-0~J v8{I_^[*=%+ح.* eX|e\?3޴;L+A&1IR +QuuG/,|-b0#sFcl+CNItߴFV-Ls -{6ScɞN^g?be %Fzl,,e+1HQelZ6|Z+&%f`՞2BIsU*,=ȁ|ݯC/'3zf#k{vS }[ɗ{!7MKaA>.P& ^FR'_k1ʶ38v^U K\%&`Hd-T@x\wȹN)Š);ee 9U}MwvnOKja!K/PC.R'D&Bu5 @jUeGy#3' +lnմ7hyo1@,8V!,-dOg$[b -rLimtMP V*_SF?2#,we|$;>; 8Lv/g&%G1Ў-Eh 0&0pJEEij,َ BS@_wzME:GH 1'm \ݑ8Y!҆5#`^ȏ}'1A M?GCR?Pk'#@&aYM%& EMX-?xc!6>%Ec~Dq,p"QAixx+VT*q$ 6#3mGYrX +endstream +endobj +144 0 obj +<< +/Length 36 +/BBox [0.0 0.0 103.007 49.3506] +/Filter /FlateDecode +/Resources << +/XObject << +/n0 193 0 R +/n2 194 0 R +>> +>> +/Subtype /Form +/Type /XObject +>> +stream +H*T0T0BgU)c0 + +endstream +endobj +145 0 obj +<< +/BaseFont /BCDEEE+Calibri-Bold +/CIDSystemInfo 195 0 R +/CIDToGIDMap /Identity +/DW 1000 +/FontDescriptor 196 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 [507] + 3 [226 606] + 14 [606] + 18 [529] + 28 [488] +38 [459 637] + 47 [267] + 58 [331] + 60 [547] + 62 [423] +68 [874 659] + 75 [676] + 87 [532] + 90 [563] + 94 [473] +100 [495] + 104 [653] + 116 [906] + 122 [520] + 127 [478] +258 [494] + 268 [494] + 271 [537 418] + 282 [537] + 286 [503] +295 [503] + 336 [474] + 349 [246] + 361 [255] + 364 [480] +367 [246] + 371 [264] + 373 [813 537 537] + 381 [538] + 393 [537] +395 [537 355] + 400 [399] + 410 [347] + 437 [537] + 449 [745] +455 [474] + 460 [397] + 463 [397] + 853 [258] + 855 [276 267] +863 [435] + 867 [435] + 882 [306] + 884 [498] + 913 [498] +1004 [507 507 507 507 507 507 507 507 507] +] +>> +endobj +146 0 obj +<< +/Length 516 +/Filter /FlateDecode +>> +stream +x}K0^޻JƎcP$ C]UwC#$2a='G*)X;mw]86m쥻ʊ=5mDsQ70V粏b]{޵.Z,DO^wO˺;(j$~{kg"\})ي^voۋy_[! b+ۓr'l[OǨ}e˜R =S:ۄuD $9Z9sU=JjmymtŽZ6 (f (5ԇ3qm'mT'J8*OKD>AvBIdbiDŽaL` JcOLȩ )\Q͠$ h3|L4'@A.A- +}7p_9@ UYdЯ]RzcrH'{ɄּW@&f؛C|>_޺Buu7nB BhZ֧QD +endstream +endobj +147 0 obj +<< +/Ascent 750 +/AvgWidth 536 +/CapHeight 750 +/Descent -250 +/Flags 32 +/FontBBox [-519 -250 1263 750] +/FontFile2 197 0 R +/FontName /BCDFEE+Calibri-Bold +/FontWeight 700 +/ItalicAngle 0 +/MaxWidth 1781 +/StemV 53 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +148 0 obj +<< +/Ascent 750 +/AvgWidth 521 +/CapHeight 750 +/Descent -250 +/Flags 32 +/FontBBox [-503 -250 1240 750] +/FontFile2 198 0 R +/FontName /BCDGEE+Calibri +/FontWeight 400 +/ItalicAngle 0 +/MaxWidth 1743 +/StemV 52 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +149 0 obj +<< +/BaseFont /BCDHEE+Calibri +/CIDSystemInfo 199 0 R +/CIDToGIDMap /Identity +/DW 1000 +/FontDescriptor 200 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 [507] + 3 [226] + 28 [488] + 38 [459 631] + 47 [252] +60 [520] + 62 [420] + 69 [646] + 75 [662] + 87 [517] +90 [543] + 94 [459] + 100 [487] + 104 [642] + 115 [567 890] +127 [468] + 258 [479] + 268 [479] + 271 [525 423 423] + 282 [525] +286 [498] + 295 [498 305] + 336 [471] + 346 [525] + 349 [230] +361 [239] + 364 [455] + 367 [230] + 371 [248] + 373 [799 525 525] +381 [527] + 383 [527] + 393 [525] + 396 [349] + 400 [391 391] +410 [335] + 437 [525] + 448 [452 715] + 455 [453] + 460 [395] +463 [395] + 853 [250 268 268 252] + 863 [418] + 867 [418] + 882 [306] +884 [498] + 894 [303 303 307 307] + 913 [498] + 1004 [507 507 507 507 507 507 507 507 507 507] +] +>> +endobj +150 0 obj +<< +/Length 585 +/Filter /FlateDecode +>> +stream +xUˮ0^. EH R}iWUD}7P %щg̜avz`ᗾ-v`纩z{kҲM V}ע B|{=46XYކ^6U{s_پn.{vtu6Aʞ]EZrpu>,;$adʶ(m_4{Rݓft.=Y+g͹dX=J 3C?>(G9tD*2BQ bh$%Vt J7wZdP!%!-@ BpEB!^G@^?!Dtzx{f3g}`;Q 퀨BEz 4Y@l 07H5/(Ƨ>+$j85OIHϋS> +endobj +152 0 obj +<< +/BaseFont /BCDIEE+Wingdings-Regular +/CIDSystemInfo 201 0 R +/CIDToGIDMap /Identity +/DW 1000 +/FontDescriptor 202 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 [500] + 131 [458] +] +>> +endobj +153 0 obj +<< +/Length 226 +/Filter /FlateDecode +>> +stream +x]Mj0 >̔B!M{V2F6+a + gKԑO9VNԩmڻrD%T]qIua;!{uqFJP z1`ΉvEsOalpDc MJYQHSh^燶-=s{Pve> +endobj +155 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +156 0 obj +<< +/K [106 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +157 0 obj +<< +/K [107 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +158 0 obj +<< +/K [108 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +159 0 obj +<< +/K [109 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +160 0 obj +<< +/K [110 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +161 0 obj +<< +/K [111 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +162 0 obj +<< +/K [112 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +163 0 obj +<< +/K [183 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +164 0 obj +<< +/K [117 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +165 0 obj +<< +/K [118 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +166 0 obj +<< +/K [119 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +167 0 obj +<< +/K [120 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +168 0 obj +<< +/K [121 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +169 0 obj +<< +/K [122 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +170 0 obj +<< +/K [123 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +171 0 obj +<< +/K [124 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +172 0 obj +<< +/K [125 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +173 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +174 0 obj +<< +/K [126 0 R] +/P 72 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +175 0 obj +<< +/K [187 0 R] +/P 72 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +176 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +177 0 obj +<< +/K [138 0 R] +/P 81 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +178 0 obj +<< +/K [139 0 R] +/P 81 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +179 0 obj +<< +/K [140 0 R] +/P 81 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +180 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +181 0 obj +<< +/K [141 0 R] +/P 89 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +182 0 obj +<< +/K [142 0 R] +/P 89 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +183 0 obj +<< +/K [113 0 R 203 0 R] +/P 163 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +184 0 obj +<< +/K [114 0 R] +/P 203 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +185 0 obj +<< +/K [115 0 R] +/P 203 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +186 0 obj +<< +/K [116 0 R] +/P 203 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +187 0 obj +<< +/K [127 0 R 204 0 R] +/P 175 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +188 0 obj +<< +/K [128 0 R 205 0 R] +/P 206 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +189 0 obj +<< +/K [129 0 R 207 0 R] +/P 208 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +190 0 obj +<< +/K [130 0 R 209 0 R] +/P 210 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +191 0 obj +<< +/K [136 0 R] +/P 209 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +192 0 obj +<< +/K [137 0 R] +/P 209 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +193 0 obj +<< +/Length 10 +/BBox [0.0 0.0 100.0 100.0] +/Resources << +>> +/Subtype /Form +/Type /XObject +>> +stream +% DSBlank + +endstream +endobj +194 0 obj +<< +/Length 308 +/BBox [1.0 1.0 102.007 48.3506] +/Filter /FlateDecode +/Resources << +/ColorSpace << +/CS0 [/ICCBased 211 0 R] +>> +/Font << +/C0_0 212 0 R +/T1_0 11 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/XObject << +/Im0 213 0 R +>> +>> +/Subtype /Form +/Type /XObject +>> +stream +HdQ[K0~ϯ8osri> /x *խ뺉_o:.B Hr4rڒ͏fkݕmQ6|m4Dz:Cz7@dlؽ5ӂk@,WV2\_*do5^L^rE+<}e~BB3z m-8[vUWEWW%w78KSm+C8Ifm<ҧ0.q )ax/U8ͷ +9Ƈ$tNPG\!? ~Ys +endstream +endobj +195 0 obj +<< +/Ordering (Identity) +/Registry (Adobe) +/Supplement 0 +>> +endobj +196 0 obj +<< +/Ascent 750 +/AvgWidth 536 +/CapHeight 750 +/Descent -250 +/Flags 32 +/FontBBox [-519 -250 1263 750] +/FontFile2 197 0 R +/FontName /BCDEEE+Calibri-Bold +/FontWeight 700 +/ItalicAngle 0 +/MaxWidth 1781 +/StemV 53 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +197 0 obj +<< +/Length 51744 +/Filter /FlateDecode +/Length1 133000 +>> +stream +x \T> fx000 /QPaD@M >KTQ4+er51-nyǽeIYi Y37`kZ{} zHP_^ZV'OOH(tP{溫r 5 4~ Vbƹ M{_ohIaM3ef 3,1E۲UΚ0K.^,4vſ2̧̚pUK0s56{M[6,nJ8ƄsWO t bˮ.EcOO4}AN`{O{juR7->D;h~,nP@vE6i"ÓDI3y@l0o{T f}4݂ =>SBNDYȩ~ }6aYmՊX|kK}"Sqjuoye0l*=َtY6ſ@Iou@ۣBX[T9 ױ:7!0PMp +Fg7> ׿-,JGAu_N8K' _{6; CpJ7Zb0s3\[T~Мf[0l'UbTW*Gߪe +FZ_gg }㩶Sz_k}.* =ro_xT^[Ҩ3YvlSVi^<"mg Q8Oǹzf_l6(-Ex +c0^("%(wYĖhvagxiz +z `; :W%#ϰh,m)y_ H@ ":clxG^O)l,L{wo *={Dj=;Ez>X;-9$m4%Bu ՉZZZ:X[.17BxR)b L_8R7@%cPkPNE-G:RzhmP,}, +;]`3 +M-,z͠΃a)["= 3hb8}S`x \1t(r&,c/&aJƳq1\ H a~$  H@$  H@g?ge9S|xY93  H@$  H@#H@r&a#H@$  H@$  H@z924*A1֡CjGFZZxއh H@$  H@$  H@$  H@.'$ >$%cx?:5d$ @ 0 ƀ΅0fB3,`d +rX)+cwr%&vzsdn2/6Lo,_a,_ ll}/~?lly>\-&xozӠQRx}_ ~yPV}uɯUiNӫ?5#lxԳKsyBV)]JVH;hCFJ^0 f +,g ezLly]ĖkulgKl3BV"6BRJ*)H +ԒFJ:P؉S_$ ;9 }s.~-~#jopZ+ Q1=LA=clYTЯwxc1}\(_J_ouBJ};*L4q:flY5bx尊򲡥C%Ń ,*п7+ݚbIN0CuupJDAVֻ%/[P6\/{z:s)tty2y e.,66څe:]NӒU051nVo.wW\4 kըZNW͂VL-M, !U -7Lsvd r+Ur[|p5kO˪6=LNLkr XE,oimtgXK?)OwgYݙljlW̭H[-oi?(Sǀ'„4p8$>03.ʛa{f[%{%N^_Uޒė}ѬY};Sgq6LoQj]nG& fѿ'1[Rr@\W1 Zn{y۲TvB`kٸ5򡎏5Z6ÝXoseLr;0|u:J; v$(¹w3W]Q㫅s^,@%g2n؋σz1uh%/yաƤ$3$oLTwPhsơ7P|zYhT)X:A|9+Eb*޹hW11fe΂{1c-oUzK^m.푣sC3P܃Far+[yJp%RU3A8iuxu֬R`WEKCwԖV~Vo2|Z5(ukq)* XUmi,<{J[-leuک0uy& /kM2N3C +ʍpx]U:ܶe;[rR# .\f+uS:y;Pi)e6Vޑ%̒+ߛx+SƱA,Fbgu$Ghz3F[tdGd.+>-1USm ~oIE/9`zGdJ_ ckpYLu,ƓZnIn]<-AKV.ֶy,I&},7&wƆS }NdsKK + ]`! P!xN̆;PD;LC]zU}m9Q1S fG݆*zђVSNě+4`8b9YG!-ddҌ"Wq0an RET/wU1 P?CqiCWC=z5-c یflь5XÌۄ$!zby 'G.R?o"p& ^#JOGx2uW %‹{ #&D E|*C|H''.? oQc$ANx*a?a25W_h/^^D"R穣hRc{&چW PW_/#\B1EIaANFh$L%4 S   u\8PKl꾄,B&!NH#X 6) AA"A 0#q/ҋډ-Կ@} Կ蝨WW+-6p.\t2feUD2#eLyIRś:KEś95fgmgGňi 5@m{6GX+oh"\fI͚ 6wJ g3!{>3~^[秤Wp~*;Vs6m=o޼6{fb5-uTu~4n z=#:7Bm霵ismsiFTg969y$DxMu6\gu:7:klαm8A([s*[sJJ6V,  &n201I)`‘)HBǭC"%61vM-P9!jV M!0n8h %T:%Po%m y&qtȔy!bhϋzG-"Ts Av]nN\c-¡KI(юNъ̡fT|  `"33Lpm +)9UUm**wИ nҝZïnJ78Op2v}]+ֺ#UWCBi;7nL(riCN{yХ.s f. hY،2^ y.gYvZ<4/<7Yv9SrƙO3;-7" OL_aP йo#\_w&O³2 35U | +_wp[d,,~, +\Љ{@ CxͲsђm?ֹUr] +Zvqa? , ->Vm[ ׌\'`r'. OӸ{pemϟٓ^x^/W>k. Ͻ7p[6Op>.| г=ɏ|ޗK[8ug,1NS|nWvyչ_3_-+P<1~ דxzo5GV?~GUPw/KF% A0 +΁ݠcw^^VVW4f0W .G$K?*0DJ?x/ +/ +ڳs! kDR)d/Z[,˷ZCٖ_пX5 bR,<eXޑ",IX`щAAbIge)HSHAJQJ+(8H~UF&#;SNr\nBWqrN#(J7E҅!xU!Dݧh::5.>1#=.=d )/iBHK GOjuD(FmIVda5?u:L hYզ%X,&. +,1aNbJJJ¢  )'ŵXI1s]w/;y%s s yYEk&&BDKZПBE,bԪUF +4is;J~Q-y+ 6ojJH1#$\#)XK QD.lZM@()3m%w 7 tL'#G )EFcF7΅J;cA0PzJ֌Q7Z̏M5) qIq8k2H?ҐdڱGȄ0mJ K/ +KMϊgѧ#2ĭ1IdhǷޯ$‚w쵴<@ k$v\%FjcwˎlG8\%6c;gԥFmVPpouPI+*Q%ˮz1?`̨V:$86|zŨ%,1ܮSkذ蔤K>qZKY/)c@\'[}BFY6cۘN'zPIggldv{Xaݮ@Hlg/K€ɁL2ɩC;.J7I:8DP`:s5<ܹ3ԤeIԱi&<5{5x0Z՝k51irFWK&sDJeT1Zk0$;½Gtxx{p+z(Ɇ66a#:V>Vpe5ssbiq?C j0FulupF!hsӬy&F[{M11&SzӤkJH7gib`{Pjk||h H %<GU'V-'Kۖ\h/U6'.7G9>η9Əd +ީooAY1W0$`]QUɷ)xƥ mdž#Ϝcw|{m2V*ON2dC=2("e-Fk4QqG_urt5>+nCK2fsɸ՟Z!,d7L\kZI֫JH/S؛=,t8[oB,c،1rHc#v>ϯ#uS0&^140'EDNcJ73!|57QfV7u!qvF M-DPsg 4g [XgZXL^ܚ&s8 2mlZozA(,I[r޼m1i7JgTI,R\)]0禥'jb;bWDi [ѱ}^C+xG j jCJZcGTp:F!бDu8y03~yg*y`&6<[caq|{FA+OA6͡egGj[LL\0m[JVH)jbv6ESz~5 +21:_ /7/h{!O/܅Gg`H2*ZK[ׇ6Yȏd[|oʖS߅$y$]Ԋ9'6'j.lϮtQ ^j u6v?vUtS\}4Ó;}.2Mo3dw /dC׷ԭG`apx‘T?I)5=.g7cjI&ӂm +o(oMZd*퓛F81_WuZ{Ujy˫}/J%y.o`;@a 63g"b cOhҁl!t_2!Vi},K6Izf(>U\w=?9` ;БdiGnC%oUP寴tk;Od&2f'R2#>4u4?8ݼ`ܗ-Dy-FEO0:uο ) .g w1N\xF(4|Vm[ 4cL\+8V&Ae%ag ͬFsua W1T,NEdž֞;ִi$4Bl+mٹ;1 Mק ٶsp }pw61:Pg<k_䣓ު\FȘ&Γ+~@ѯW;ZFD 7+E *!5,0w :>}QO=9DJGo`8[w$5c[ S0ͿK|0 2;8XZCcI0 Y,^si G_?҉!Tޱim?&Ҿ/܋u*f@3jE֜4J1H[,ƀݹ^q tN3XE㋤.0ICT/YCAz *[/9Ų H.fx^?&TW+V$&*lOE~@=c)f&i35!5cYx%NSP\K{I*,zwP5(L$`?4 UW;-6.aq܈GN?G g@[a;c9՜&DޟYGqے3xf'pwWfAJj9EGP%r0#USOY~+bm͜/뎎:P#OESNe ~v:ע=m Onk/`$UaK^\{ҭ.r^7oGV i?GѢM:sc3l4]HYS-'LZ|D2f$e,۱+LuJ/#D1Y}Gz\g5^O{=05X 8"BlEF>D)6O+U^tH[V<Ϗ,إNJ97|K<|[+`玽p]ksC\?HBHwNjWՈ8ϲ<*֨lʓTBuB8(^Q>IR+I<xlʘZlrJeNNnl"CXN! ul!!YDC8J +,a[X 3}oI1Ol6G5*ĊjƊO7S؊, `*a |QT~Z)s F;>pyln֢d}:Z7AgN.$yΙiڄM$X2JAtpGԼ2[!, LHЄ3&hV"eJ1A*ywZq+ц´ +ç;QB".Tz@G-53hخ3ֳ+bj܉Q=W5k)E#kUw غMCVuM>ON|GLJ^hͫ =U d?8>Gy˴4=ړ%٢ >v:QCs)vJؓQf-O?*$xP6j(] *#zObj"¹S-7WQo!֙]"ΕnCkxnon:n T/e]Mx60 iwWSYQ C6H#*Q+GOC1NW ];OtY28ڢ)y2uߪAfE}o]Y qY񂐮 1Gҭ\ۏ߳:,*g|z4:|Ɂ9g`:HtFkj1M l/l`Gl'i`>6mF ˱&B`]U&%;7nKd"2 I;rJNAD.A #^z OSչ8h]Ou~`;cIx`YۚDJi3mF9[Z?} ]1<>6YÃTL h#_*sjs9IO*T>>tmsT:m9,%uRM=%Y7IXJ`qڜ `:d53 vZvv5$.U*aTjh]Qi򲠄E甌1;VDR6Dp悦)Ho mKɗ sª,+_P4mH&#H,`s ǨO՜݁u}`SPw'5~c`j+?&R]P|e)Ϡ- !8 yЇ/|T2'DVN {Y=+&h [ޏU`'l:n#`R*]k sb`OF,dew;(z݇R7F^e˱J\Vfz%@)J"]s9QN,unr +͉1IXf3 +tȢgђHrRKS"}Z V:U''7N +KA(n]mE;A-װ&mBJS }j+ֹu( +/ {[w=)M Mk#69+nO@g@cvF^gs[\V?VL9%X> ZDV#N=t㦎,r*+c} Ill P(ө\\ S- "]eSV&Q ʊ:[M]aMSxAaH `MNYwH6]Kt͍P)=Q/.W™U0+FԼϯn>s'M~9v{%6$#|ۄpH{0'E8AZ!6d|eCJϑZ U& + ;/wV 5-VjDR[>~SxxMV@10޼o#}?*=IC,lm k_|D^ɷ7 pJAZHY#'dwf_ n3ro"MnSf_t!zWoy$8MxH}IKn`B}U5N%P*U'Ȏߒ[|&5O[vdj0ˤѥWF6w'^>![ +.'{oLB %%B"Oέ_60FDlΞM yql)`A-9zÀ#u{ZfL" o{c3 S ?5%n.q} 3ci}X*:‰_+(-I/Po273R3*D&%L7-6'%Lan}Sn7qPz]w@JG\hc8@zKBY}5Qc!rB2D6cV6FNu]Y4B]wR^neTW +rXc؏|܇܋95`O#r 1G'ۓ#qPï稃C[^HVhmFRdiy{ oZ.̠擒J8NVQ3 mw@4 bQkmڶ.;=1U~9ҪUb%!h=;5jOx9[JbuzVK>5tǢ\5L|to Ŝ)匘k;z&tT*jYWíuV7me9W$0mF `D[diOUmʞY(v{R;D hG!'SB`IN%*m!].*$Fg~Ece#  /Rz3}\ѵ'7j@of>hr*oO6۝8V[_"\7jO(iDP; G +EV;BnHn<al:ZBFM u#stsve"gK Zș;iU6odpväPO/-l"c%~6 VgZ'b +pZ>8}Wkǝoߴ165`Pv˩֩*Ak*z79l>V<ZA!cӌu䙶^Q\6̔"m/DxK/wAG1tJPBYV(egauRkSsvt54nY}xx +ٔNnvR) Kћ&uD0[nkdu6F˘Q$(N}b$q:ȣApFJ#ϸEVD?A0qT?8XSpܦ |~CK&o8T$mn 3“@L药pэ*w 5 3y`U]ϲ~=ՁMu{xWWÿewiթO9Fh`ovD-m-JԤ-x2[FZ4>;b}c '&==ںJskmN7mum) ^`;Vcv٭l"<"XS(T::m8H? r2Vo+.Π}95DNv15AϩZr7U+Az՘zRyb_ux#fBf[ |y?ml~=unBJ#cu6sbNMȮr&l_|XwK`cRؖ^f/DGa(9Z{1#`bCBe{8~?-yGfHղڳcbekʉ6gm!ÁLALa5 x۽`*NSu^s =k.f"QzxsU@ +J q|=|zm)RBz}Л @ +aoT* \sf6J6_o[v5b\bZLdVƎAEm\@:ܺHT)k?[o?Sj +]k~luZ*as, +Gƒk 5c"B2Y* !7D@<4pJ|s܂?VWkWžH.$Me c)CmfT:R$JO]*QnqRY0/2ғ[W'Swy]HHeېi8XNn ;;kҡx =IP2EzLqA򛥒Z琎*CP8QBeJ:\*q4]{w飍1h?` ACw0k*p3Mb8!AH~e6+sUIO=ʙ``n N~`Z mפAcͲ@[]\iH`Eڣ߯SZhn ]80R:5Xt,?%d]Ŏp24‘796仮627vZH +JW'b +t6#j~=O%wA{)0e-ctTl;jk5`r_5܊4Z0Urt.\ ܅:D*ꉧ׫ajڝc[S7SraB纮 +c| ƣw +I~]-:v@8p7cN(֏eξ]>7h;4sg;|Ȕxg?m|#;lD߽y7?RwXޱdxBջ496ގfz]`GR_Ѩz/˩ހnva`Wwpx<(= CޛR|D^ag#߮9.__S:q`vX\U+ B)J6:)AFjr $e?+:3*'ݰJJm{rݺT"QV 5YG\(Ғ\~XՖnjKB$ 5=H+>cQQn@Pf yg/pC-B(5 DnTK'$2J1XU\ BϢd2]OV #FJ,+m7 :{]K)ܛ]=0 H`op+"F.ŠQs0i )6x$ ,,"Z%V@zoRh<8dg'W^8Ox|LFJs+M^IlD`$RK3)9vY1֡^NυC'6Xrh Pn]g +Φ395bNɍ.-`7;B%!O"""E۰nqq +֮.B"JǐaxCas|?~w;cX.~t\W3IiIP_ga67jl +6v"?Qh(,SS ?$ +g)Z34vR32;9d#]c+"@oXpƘ/a[gWC>g,Xy,T+0B=FDZ'*R)k#0:Yð[d7dо|xr@ +s e0?;* +̇=F\ѴypOysb[Ahk,@iy(U/ Г$] R+\Y#T.  <bazZ +M<omʃv`Se,EE7`IK> UjXpcyo ){8oW&jeQ̖?bV$8 [f)8 |9 +SZÁTH$.%0M6,kB  VV"i,蕏5bY($P hLB&_׎Y2 xyl#pfwb|n9nC4`ɷCx> &hO'yN +5'! F +]ipw|F؀=v. csX'~Tz/? w@>hojFP/M +n}-㾺YtW`jS O䨉*H$7kRgcvX_H%uE\Y!UU$bF[،%m d9*$ lV[f_!-,tCҡ`0xթwݳX8*ݺU]]KuwUwW^՛Z-vɖdYw˖ر˖Ą&YH!؄<0!@^3a76 Cex v[-! QR{9=sk=:O1D`y7ꍹѹQ7ILyO=2-*I8|`ʪ$NJ|1&/!naJ?r<+#Y^i/wDR2Z&c8^`9FF.eNFkn puJnW4DȐ;OyEF4U𩲦fF?,-7\8E(Jacwᐹ6yA)GAߵ +&L'UBhGA<{a_(Ӵoa̘5sY6v^|x 㖲rIsI jMY5,^IhWpڠp4\)d ho(Y.KdP<7Ij^K#$YJދ|3Y63ϹDT&P^F[m>A^XS06ִמ[|&%NhT)xLhJ9 <^{6bvF>PWqb ,3m|pfe?K<Kh+|Z_"/\yƂe"U)\$H{UO4LvE(TΤ-Y"3sJG9(9Nm5i(Q742RHZ,d4m Y`X8Urf~Y؛z]c |7.**#a7ml/D{lЇm~=MJZ_jmJ$j2\D!.pbυ-H/YbX9'NY8⯀/Ee~SA^ari41 <{,SO>HXަ㏆G-٧ {Kibr"{}YY>ݻ\!zriUQk$A4 JS^7 +&~$$# q6,6luy7 o7000g5a}`-XʬP(8Ijz36ޟqD6iuR,>l(g\/1\4zf LÎC*418 +`kcjXJOU/Z?-į+t`W}dLXdփkC֊F}cdaok6 MW=!5FmoA3W']}^]{t2ȍt hN9 )G3xؘ_a2')s$?/g7y5/&Q-(k:w\ N՘U}"ktN6,R}/tvs&o1cROl범`R[qQĘܡOy}1A}zާ̴M8)\&S{&_6m~VNm3 WR9WT"L9a+[vXY>3ꌲ +) ߟNQserQRRb]oEVvp23Qp%,l #ѥ$e m~W_ +G} RamvIMj8jyc#l2**ա7dL"/;`_y2(¢3@5JǞf=/ksT + ?]@3u,H.+G*ۯiV W o.$l67_rPd(l=reIYҡqѿ$M &BIK{ _* Sm˵Q-:6pFK4 mY #'syl#w/-–qB[6~֊8[3 +ct%ЂΔYFNfG8u>iս69b>9x!*CN.C#>wR{8-P8ǩd_qMKᴎ^ 9HE@lƿSҹ sn_J=nޣx/[_}ZbK8N0eS+cA\Dia'`b#N]5mcJ--Sh _3*RTIq'#l3~AX3O( HLO '.ы_!1%b)&Xԛuҹ#ő֑BCrOs[׈`Nɾ[Ƭ>S7lS-/sm8FnG'"`+O+IeH k|8Q_q8f#DH+ +*3 +e]*T#B?/ ; +<bߟ mhAjN+aغl쎘WErFZH$mY{:OCkHi; *TWz4VK9jgoFWE2V.̂'XF4Z1h_ſUr6xxN r{̃j~еFȺXvU_}OWÑVm. +p]$Bͣib6VhhNٞ+w,_V>:^n_,U-< G,yOFc||ڊnΪ }X{b +_{e1W!yO \+kNA=rla֢5:KȃjG7_nZ&aPjY}e8!~v,ħa?7Nqԯ#I]_yn:XopB~HE1 McrY2 .WKq+k'̂`Y%[bB>*7p9r}P&ϖxaEbA\>Θٳy Pۊ4ۀ6L+xǩMċx|r=]!{޼ --Α뛺iLUu +QZ _8\Wʆ8Rՠ1'G6S>c6K-hbu_[%ߠyhZNgTwhq +`Î$q\156W~uó댝iOHu:5<uꌭG] ]֗]Չ_'}]>߽&޴eZF-䢎FevXe9c]KvTmajj]HxT0mW"89P+/~G fP1B>_2PP%< G ? > ҌYT2*Ij\*FSNh_Sqr^qUj>S4^)]aQ5Q\PǏ l8))vXs$|-(*דZ5߈ [c8-&h9K.HLlqV:M:K|x ,ZV,tGF4ρPk%=2+bt̊y\TOk%oԬǂ*[ hQƔT[lngێwjeNMRL,ڑ]bmީѣuղ)Db})%Y +JQ?Xg΂2[NG@ո0.~E`P CdGiٱ,/02U(yyGid >}w>MB&i(f擋Ң$9aň'Bm gҋ^t2T+lRm3<魀i +h~Ƶ ^ +"s_eǶt\l'$ \L$925bOTdv'l-$oN,J%&ʼnun k<~lwY{ȰeiGUv۱=f3ooSZ +%UIv`!Tog3e*3*qr^Fnn/V͍JSzw&i)7.+*b#?q&8czKt\r۬%loi6ezX ߃ 5id@*_>Ťd] fA2ګ,W-sFp׫q@j7[ܷCMѢ#]7vK2\e넦.k~4Hoi`{e_۸le-9ɬ[eu/[ww u;ɘ9|i_)ْgxt)1ym!j?'sjk{g؉;5Xiм8!bpwÇ/~Wߵ*Z~ +x#$ YںY,?[pvN 0^YlO!_hDQ^u J/g|Ixh(\fܤ ulVdķN)I.79(AqLUᘶ`~a%C=|ZSuBGnw5qyf[Eh&T +5C-7HƟ0K]퉡궢TX:d_z}u\_q4*lY,^.eB mB\|oXE;: sK+;.rеZ&9#7VyzvMttޖ5%ݱuiV!*/Zls޲нkq)k9-dM,%lHρ%u 0wP4ks&d+y"oԱ<{ 3 ćd̡LPNX[҇H/j + ѮXsD?1Uwπrs,<:4r.}P&f +XnAX[˙s 43˯%onP~bCZhG`΄&Z6tzm-oCyǿ=-w<3:_Dm&yy<xr}A[ +fe#gKg4D+3XͼPBTmiD O$H=Ҁ2_-EuW@y miAmCaa9f0<߯!N/aUk+g͇7Ԛ:cȌ!`Xv t Bptӽժ.f)LĦ/ڳrjJ!#Ҳ7}tP"[Le,t|`n[z)W礚d)C4驾nGFhob`ݜzcƭ[6mkWݳ!]~Zc<;_=gTɓJȦ˧}lJ4rB!j72Bġ8TVa=^+[[o{}<5*v;ߓ#7ȎTfiΊw⾏{.޿ʻW誻NVY|cZ;y>~z#G# c&Q gQKruA̤pR Ch712}k9#4 +є+ҜhkE8!1x20]|96Y;&U/p{ըn]'"RӯOrI1T(2 m+w~ducj]~+ +!+ϧF[DsfȖջ捻}_thD/*bFO\Ì~9Ê e{h/rE%]Y N Y&T@b8*~_d7lZxJhLKbae6dP]M)QQŋ$*ܹIL7!ȍݾ,͜N Z#^ f+SQ/〃7Mxi6kkwr#T<wϐiD(Z.Mq*@X~9#, +ʌk+S3 I xwd%t ҖjƠd(Giuƛ{*n/hK&^dj͙)StPՉ9 giWUh>l?։jpa7=Y6`7N|y^ +(NG@ޜTM! J*n׺C=>n , +K2f-{,M!N4N׎cY3,Xc dzj*F5>%]'; +8DE@/]yExSH- `b'Ҟ{^~݇dbs{A`śsJ|`RiMXo 9J P,F>C$Rsi2;KD"#5om] ,@lnM[> WRbv?l)9nYbn@_w;@6ᮦC. [XΡwS{h=ot%=hWۢA?oC%Zt}v8Fh%}c1 HMs|>n#[ns-3xzI/ƽ\j\z:6]{`pw>QWd]v֮(GkYCSOr;a&x"?/H/9IrW8I$_~Y;7$`Q)$7X(k!DC,#ѮlSxe/c<(@gȑ긵::?ASGB>bNI7aUVjNujz^}h@$xq3rc4h:8\[4rJe/j5ei/aT'$K}O -Ƕ2+Yz[y%S__/=u/¢e3ܲbr0c5BlM:@㨎~Sƻfz#iNԚV['x>< .O؛7+H=l}d-z&Uy1_$2wnr|EJN!X;E` mح?p/Kd\ߒv{@G?txmV*Ysx9ddot١ g Ƌb%5xlm +sPU%OۗIQ9[UuuUwW/Ll 3 3# "kHr㻆h\eP4h>͋7k_јD<{Nu0H;hW>;o;մ`4z߄yFڳW".,1#}.""N?m(脗ymdu乑^}VW;ώ߾d/TS{n/\y˲xowwỶd"rܙX ώWu.ؑtT{f:;=)Xp4:Zj#5Do=9dq,O->f9Kn*=7?ugo4.rG'}{yev {7c[\5eCuVfh/C\$Qz!_߄!)`崇HJ ZjDnbk?A=WMbe[] l%`UHb{ jѫgٻ:ky^8}+栵ֶ/ +Xzh)6^ v vAmyߑ_Fw}>VgS^mnKdm!-jUrx{+wvmZ\mHgN/aMxa \:^65hdwM+v^7Ujejfmd@JD?Ԉ+dJhag5ʙۆ;ΫH*3OT +{Ҋn ^tHwb9/Rw +\1\0q1 dFNl`o`W%.KN&%et11'4zay. 2 ̤?{pR󑇶RM8kkmV39_]t$kԪIEzg#c{>Y;rG +[iduF*a9m-E`.cRMȍ߂-2%s r 4g>ϞLB,F+O].<>%q9fHObI%֚#v8┰(jR +f"P[X7p B6#!<눥rDSOW1Uu@3祉OͺWV+P5E6}kco{zP!ҙt4sw;*Buӽ?{҄=7{V{PZb@{6!3$bpA'N0j䱻 8#)H#TkNq BJu[, +b)=>( +!Ϧ|ɡɔASpWb}& 6J];U]P :=כ"I#Xt:hVqťDI4n"1yeԾcr]  #;>g#(32ؿIXw゙)y#r#+Աҷ즽qN0δP&+kno]J&u>)^@e-- 3l#wL^;/0'd! IRS,:40$2i0Sw҈}11ݒhWѸ9|,y7eZivciz}MNь| Xr0?ŔH:Ȕja'MᠽmMSF[F +,-Xpt"$٬k"]˘lQߠ~#3R28~3?p-wN"JQYS PQ > R@-j(-rVi '3˨Ek.^D-ze쓿E+-)+k]s@-ѺN;pU~U>n[`uG 3TsFXrGBx؍? `k4`g|tKW}qtl%ŷ*JH@箪$ש z^{ɹڮu<5ثn7۶j ]Au.nBm7ّpTA@R +T @)G3<%}D~. p^NmLf@Y9"(\O;Xm5#wS eeRḄSzS3& à ƃ6 J6a5$l9Ou^:0s ̈́\b1[uVVH}םź>X|{Pkn75cA^ yOse^L_yTjSN4q%;C^!ڕ-f>؟)m-$ŴuOh6r:{ސJ!;]`(MsV +t8)VsuNR+ `%xig8f4)=Rъ[A׷DzJSk5Gxf*/5c7[:Z1&?j+qxoGA3s S`bYs p_bƾ}vYXp|{>1h=r{fiag+EΈ.tW|ĪKb*-Je 3CW_If%EM!qCDSwq~R8sĊW^x_9bXJ8n`qz5N>+ȵz cR: {cD'aDɣ.:MW-&=P+uP:#s rޢM}N+/=h4ZWت۵,[zks2%=\>/[3 f֖Gꌕ8Q^I~h`Ra~]kz10Q5}PE ^;hV!y@S RjEѦ3f~$Vuz_t[$ϧg>eF/28tg"NS4\cN[ ic|<9?U>IpX,eR47d7ZL{:g A %TgۃvAZ2ZL#2 4g1 x8LxX<ջy34IQ/6ngl/W;Uq.M'iԂJTzk{$/jzV#wsB­E$#R]5㵘ܢSgkf,crpˬ vƪb)e8AG[GhO7[dmZ;CS,FS0WQ;ןVDjplN}Cog4//l]ol~~VYqX6 f=TvgICIC/MT͔E5lc F& +pۃnUjv&cMc;ϋPNTQQ◽yF ]m^cF[2sf+5ƟsE_60n5j@-^1p& +H{1bj[r$'CzQ#/2 G_(q/~u|Vno)֍~@կuytgz}ݼʚ{RZ艻AcV{Q=_ܚG|)=調s>Jii$ +/LVqn520Zg>DQ&hU5gy?~= kOr  +Y #J(o$bk x4.Dnd +Ы\Р7᯽\R |z xB]]mJT&,r`w1u jDl x85b'&,.IF$EN<[^AW|Q7gU YO$cB҂TȲ[VT#qyqמ"/,eūgVf^+ GF7>' +O&u֬f>UlG?yp`o|/xs_[礃z?A49[ﻓOWjG0IB/P_7[?cB^VHXE2qDHL_i+L43Z2錨.obq`ftB3;klUѨ*1h=v;le e#ݣ]5cvmϟfTUZW3vMFhg@@Fg +OT QM/Si+ϪߗkD?BaX4`juFmNEE*ߴ*%ؕd%cOבÅbR=<' )2zc$vv3hύ`EIZu>c:D4f  ,w5xas! ^Իɖƛ?;Ygj5~,E8 _5]sJk7^3ik6yD Vyh36ư"^׭!` MAG$>F< E4jc$m,4(ۘs)2~s3~Z7kl#4c׹ouC[e:F9PWp[E[ϴDЃiQkl~ a47_J^A I rxImͫ!:გ"|Յ(a5ZH2ԓ;^5nWxZ$|*sF3 +$ MgݾyՃ ,]K+e܍n7T_%|noY \B#2,aE ~J ,Z6O +*J5TXr s+z0AjpQ9MH{R>WO+bon^iװ,G߰$ٽ?lYk{6aaKV'8𬩃0#R Q^ԹHwPlWzǝNM`&7h&Ҏ<踱P2aIch#w͠LsDuX*XWfuvy][e`O_&ރ{ kTgV?h))܂,d%^x4R=o|l}9NO>: fk?4 +:w{ޤ|v'p3*5eu ݴc+/2kE@RA^QG4#4̄PcєggY{|ᨫk5X5{125;w3[Źlɪv^e65bx S{aHՇE,fJ;xb֭bХCtZ{052|Wf6DBYf:W 4KQUY>Gvp^CU]HCsHq'Ѹ#ʃͣqn59P|{wsޚYgkXӟhPFg̕kxѓxnF?3/f(ҊU&=uwiQ#EHjGf<e)vbɁL\X :H(kp!IE]6+{ղ;Jev#Jّ'[uD(DS`/+$r%S vi9Kw-J3FQʌ+e@{VM;׬MFzVl38,,~ww&g}|gM8 ŧ:^CxB<4NWUm}U θ+_Iȏ\,Y{v/C#"A qN$w&!IRhle4F :o50Dq0-%ִړVjᬻopqJPݕŪWۿt \?(9#1;Nc\,ML(o4.Cϯ-UEx(, +B"]C]]kP9M?6#hMϼ~5YO*f g`t$ol\nw4+frI S +BB7i-S#tpziZVk']sI)`>c ./ؓ_iew:FWUe B{v.4kHFb:;F蔂)5Чg'B˪s.,xߊLQ14M35v*s:%]}E fWJ#8f$Pι w%N +B< C:::φΦIt l~ IVh?-Ho/0jdBM{U+}2Y:,GJ) Ȇй^CY؜nU nݲ9sKBI]|Ggl%{UΜ_Rk2/4D)(a3 0:L3ݬݶfݶmftڌ|7ʲ&&Ιy3 y~};qjnd(}i)f%O>1wIg?K2 .V&.yԣl$L,c"a@KM0Y3v攱?wQٜ>aTq?Np8qԤcGJTϞ0-wȷS<Ӧ7O&CHv%~̈́_6DQw.arˈrTyT鈊ZȢMDwsf_u6*5o&ƜM""ӎIBqEbVa0ȨyBcrbSN LI,cbiYN3Q9tsX9q'O˄'e|{1IL:&.LVH:kY;kgTs3eS?arQYst2hk#91,37R,ߓ$??k+g]r>-Toꗖ\ #ig]sHޜ?z9;g\.3yH d3 syN2ĈDܺc7rgY ![v^y^Wl90֍6u/y-d璝 [liһn_}Y _Zk+[|DQb(S2dZIjI /xtBeƲ}R>|uV8Vt\rcCn⁊*vVx⭊qח I* *| +|e{ʷ*߭iµbf 7i^LCkEk>D[/]^-Fl= F)Ǹ9=[~fȨ0G'y*]16*'EMx-[&^祸.׻ +W= N.JkE:1u9zQ?|Vqe(Pow;~pc{RHڱjBCU6(_7k$9^KƩF#$)A%M}bXiV.+_w/YHݕ R [ff ɄZ)sUuXk!Xy0c8z%|*2jqGFzz=)ќNQ Mzx2 程ƚd? FZDo=/X6Dd9BP7/8`OB?ONNn5rσtTgE֟8C'NbH\l=vH&̲.O;5X2U8$ʼҼ-Yᣖ R!N-Ir.&C54Hl0j cY+6 1]#h湟P#Q{DfȄ"іW˵!sdY痲"v)^f0-.o괋V7YWE퐣<$T%`'bN$Oord@qrP>Y䩛2C9Ř<v$qn_ Y;63;D#rv zRkALO/B݈^ZG'}HVzޙW]Oꓓmn0=dV(^)2Q2C1w޹%IU7z|:dfu2|5 gBҰueiIT#`<*\;vΐ;ٚt:@?LGCucqݱxS$?vYySD$œ`= +7^)t^F,}GO9S\^~XDS nn;%:o/5t; M<=##gSC,NZ}ґW\ݒU7W{蓂{߲]{(k'dN~b#Ofr!~LVs2-.餪2JRx"6ȼK'j ϼ=itc?G4O WNN+1gGG1N|RK}fωjЫVXUI~|O@ R/Xt?Yl1^NR:R1U3+h.FcE4?FCXqLG)ދЯ5.ia}tk܅t+ѕTrUZG +I{ l"\Ş! +3YZq1P +莲e+|i6 >b??"vIfSf3]%XWFϦ>3kygXdWR!1"B^eS 5QrK0[NOb\K=-Y%̈E*zCP%䢽?K"ؕwfKiU*_C+=+"R,Kwhe ɣˬQc ۏ69"ϯ"}<.l ,4閴Lq}!1M=]S ++L1廪7]bW=CtMrH4[fȯd׊vXѥZ_ }kAPt/4~2L)w$ك3IqI ՆBTLL&&`6ګkd)Vz` б*YyP(CK%rH4JHpHp8 +X +墯 +K@b-{A >NKq C ʰh2E +֒35Gd`F"Ϗ@oˊ+KbAXRZ ך+N.CzXQP_\ĊJ8O.& KJeebqXEKŸg{"PRU`-#ʖ[Ks^\PXP^,yP-d(.KVY}.brkQ9"֕eمtڗS\RYZ$\/.̵bpe/.TNavd17{y+ZJ2ɺ|+~S^P\D).*/E7^G.((&٥eb'pbY8$"XB+ʬQ[rمUF.]b4h6р?xE/A#GWC?&щT Q +M4s^ +_s|~c/rc"dכLd`;dd׏E֫SN!Oѣ^)7t?T<MC!.梔ZPnGh~íp/l7 +GF{n>ďq|?Kb~51~#[ =eokn~ %N#w|Bw)_+& KӄB"KPDX(B@V)\M&s/w _)z;Ê׊}7·O#> +$ F06&\l\l |l6.ҩ0d+)6l&lM  +l6kf?9lzAl"i(6E1؜l6q +V \ l~ l~l6C`5l`3؜l*`6Jn61l͗~XܩP`c6`6mz`s;5y<lؼl6͇k+F  _ ·B)6kM- Fd 6g$`l +`6A`ln66 |9yW˛t`5fl6ۀ} `6oLq +b",6KM:` +l~l6ہS`*lo+v>GN|!!|)$ `lV' 6`s< lv T͙f&Ylj`l6.6GU[ؔ:`s l6;kf?9l= +S3"`ج6F`s5l6W`)9&TJBaV8]pf!o3R`Sl&l67)`l6WJf(6xcleb`ӄu.`ؼlqxE`lZ`67M79lq +5?)QLW+rxf l67?W~`w gB:%_ o6ͭ@`0y< l)`7`sTJzg +oE·ʵ_S6 G[y j5fsjӪzO;}0b;ajw{;: +N+VJ{jh*9JZիqZփ#owkС`[tW3J{Dk_WW_wWWlpoy̨-Ŵ + +׵˻rb}jV8,&Z'0pd n`jusw?ݫSp:@1  Nٸ:N@]>XQZaVSn!pH_IuIN8e^4֪֚0"3H1m% aPQ +%e^X)4eRՃ{\fHf36?B!V9h2I{,lQ-QўYf6yN EgPʌ3dіGz#7Bna쭛   iВElPX~pa)#!u{.}A'{DYYȩz!鄴҉([wIrun ~G::G/[ZN4K/ˏ~"OܥnRU5;1l1[enJZ4 3=M3o6hxxZtSHF:kXz7lD2'&HwaP`Pm%(Q::hAI25:BJKw_ A{6ė (ahc&G5-#|?87|F+D Kr@VГa(ER( +1i86oqy,5PT ;I L4f7 Q"f㳲<vم-=4R,ccdf28#ͦQrFqrK=htA/1]-20ߴf5P``F[ؠ M=׺JG 8;Y j[t+޾]{;` ==i⍭olݷiFZ z`$ajaIab;:۩o= Z;Ji֡J!7~Wwy葑i1-(͒VPL951JrІæt6Bs݀t wն t7[ qesh)% +\ٍ +Kk ~L(큁C4ehLLyڗVsA_/n22A{!<٠<G-eD}>F}BaܗG~U UȯfW#d ZY-[-`~ZajDx,)&ΛW]18V\%Γ> +TYwqRO)ARK@5'UFřSV \w&r))l ͨI[=H\ F=o4N>"rYg۠R+ɲ68c4@w:wr{\Z{N5x)={ffCnj:tn!Fo4am;`u:m]=z=t^JNBDaD@g{{'+*7ȵS"BղlEbʇb>Ŋ1> +{0O%15lݭBϙLpdlΤ^ 6M ؓI0g*Teq6fNdƄFUlA!;Тg3)xӐ댼.qx`7`ѩU38g3ռoPme ,1#:d"RL3oLQ8%ً~c5p+,mvK6=&4g=pemSZrjBXQ6r +hG+Z&󦍲$AhMY:&ZƓ#~u/meF:׬/d[&nJg9ג17sUft-?XfȼaryqIit٬;ћYEkYt[2ζLaѣ2(KV,¼DzEswⷞvi߱y3گi}ãkZmybےok.jݕ7.x>}OoznYW{c/Vl_~v_Gi4~};{+Růڳ{/2/=XSfrSu杧zޣ~8{cxCKLދ~zFzuϘoU>z켥?}?vV`ʜ}в<7ޓS_m~4v,xuuҴC)ƪܚ}Noc~Jٷ־忿'K'~;'eޑ*mWOkjʗwf<է|;噳_yiɳ]n=7]w)'/޻,Xe.>6_~ی%2y'[ɼ$ka]mE>>V$S7o&\niS(cĔ?o% 2r,jx,"2~R%kX 4Z2,iiV͢]KgON0vNm֦lkvܖ=kM?;eM7?<߱qϸ>{#ǔJ?xޯk{eIWޒsc|1ι|Ug)/,wlxHo^%~1񡹇/]恛>8pڮ9g'?rfU~l_޸W&~~=B=.a횹U~hW:xߙ8>]_gC5}=RWxg\tWo|3fVn&&r2jSrgՕl~:X7_}gGoSEYb?iXIW5zfl%-}#2j>kιUsfI9+sY̹isCJ`Qꭶߞq֎^Wz8b +"]b$0ߵm%c%@{L \aJL r-B#1|4*x>JgMs&[)]}?G\+8nnd'YK7Pɾ˒[CY2HgedeYoIɖ. +%=Cʽyuyrs^tkQ>oʴNcPj +np)y]?6*@1*_ɬR3ѦgŅ?K&ZʶT02c*Y.JtQ k +Cݭ44"u:O  3k!-PИm"S)vq+Ght峍5\Z Btȣ bǐq0±h2n+ي["p%fBj5́C/bs݄Nw O:~~]OSGvjݘ'zİsQ>wf p o9ui.n>~n^dˢ0 uYTt*>kTdml5 |{W\X Wɡ=Q<+ {XgւJ-9G]QEo*韗VOmHS\j>J'ho. @MwsIj?ϟCX]9M":ANF!*iduSn{{ēd.~*~n>~;Ҁ)#ȓ-J;.oK8G}"v~hq|#jXxS_qiS2?yi;*[5o"8C͸@_YYs +杝ֿIhxBR"ֹk/`o4M*#`pH3cIr/IIWi 塌7XWijMw5rNi0Θ|F=^ĬF _0lx i"ȘͅڷP1*aĭ*cAom!{ iD=šI}zrGy)(H 0QvN flec(ŝU6ɘ:º%6FgvzX`7OS`T^a5+0@PZJߏwNؑ] 6 |x4LWlՏ- x8HD]Fӳ@O=ta.G%7#"?O=W*;)gR~4UCa4n)QDzjs>fඟL~(EI Vjl Օz]BBo.TYpuW_F +i Y͚/zsܻ+GżxQ9*bzCh׋z2׫sUۣF]qn('ъӉuS5=w1*pBLIu^?˔(VAIm<#yK=Cs QA1.^E:m ß%o(8Wه^6uǤ'`垥@*猕:*9. +ԃ+mGd= CfRUv?!TtzV\ 3&Utm/˃h+^9E9rXErIzp;ܿmz܆S V#g6&RxnX>ДДeB܊Ox-‚ZrH81\+ӓI'KYv*n#U+*R.J|7O9&tuƲC޵vqQ -~G8aD`rG=DL)yP9vGl (X( /? |8ohPA6P +ٽnan4ә'0@Q u4&[|L 6kfv,=x?JFs+F*][3 C :("VحW0vU/,4`.`ʲc1j~i^~K V۳iYR*^٠w?n(:n $v?Ӽ^60a:2M|jd*_?9zHRF?6[ԉx +mg + O/O'?M$gKJ);$rsga0aNa?OaMJzN4k\u,(Saih6LriKgjqW Ejh{ހTnuLt5V_XZ0XSUbJn<1%1OK#>}2l%qUS։F%#S" #  d&f 9q(yGtOU|ma) u&V8;twQ_2%-LĪi8xǛ=D┲6[c6^cV7V8Y"cf/:LXS_R +zJEckY~󈛢iTYr>&}lxz5VG)3L]pX@~~nPg4/ZЏ76=ku21\󳲙:߆n+>oABgOTl  hd9͡ 3R hIv_m+!:₹FjwEkPmϯhG/ _8JGQ +l? OXöoFLK߿Bz%@t@ .XpUG +8B0LBa?=Cg'6S@d\?ЕܐBmzѮiAz$XYCń-u%Zr\MU'y)"TRI`( q4XТ.&1*ezU*4-9@B3C%5j&%{Kv"g52W8Nc|e>u\3 ~S';k{|YҜz^ceQda+%œHcS6쯔 ]?0Ht*?; ={B{2szW #'B?#*Nb5̈́,J>8$NJ!J1 E*3 /(\vW#GiVUKopli\RpvW#@v^E(;h%tWx%+\xWgU#Ԧ.Q"KK70zDZG(e.7QyXyg/i'~NJ ʾWq,9aAƦmJSեd/QؼqQ7P55nDf)6-a-Q,bىބ +endstream +endobj +198 0 obj +<< +/Length 63774 +/Filter /FlateDecode +/Length1 158956 +>> +stream +x}|TU{LʐI%d3ɐH dHDJ @ !  @hRj{^@ (.۪XU {}@BQv&LTQ_0cOԣ $ww"kŸY'_DTQ5r7k@jB׎o Cd~hsV~"Gy[̺3fj~%⩭eR?B}kY֟t9 TF YUUn-%POSd~_xללqic!}957i_-X꠵Uϯ73Ѫ4ɹQNuaD~yoZcq2ݮ4k4K:DGvN\8nҟ9Gmc֍}(ߠ)'N8SZNeGYQY,m݆3=tt} 8#]x^cě7$dZ]=W+OX5]-kfdImўm_JG1oiӶPj:?TSC{1F9R-EX~A7^2zJ3 )(_*=m|3Z6i1߮,dGoiwEtq;]lw?.6A^*]KkTCBɦ? YB,d! YBw9Si4pyY3sf۟1C,d! YB,dv݃,d3qpYB,d! YB,d! Y8S,0H2.@wژAÀ z@>0H}ҭw;m,d! YB,d! YB,d! YB,d! YBv|k}ABDgKR)au!6!Sht:MrOim;F;aI"_L˵A;)}S H24%y\]\]K].N~+RhEݩ'QD mTR=- 6aHA ]+\ ;yp +UڗHBԁP_Gibk֢;hoORIOs͇$_ +TP5h9ZszBM hJݫ>}WZFVN^AQI?Lԍ0LYWTK h!&]$./D%< qX/1x^E^WtI6Ma&j +7E"MQ&-(,ɐւL6.iS_2?x3pemg͍4j>;؍ߙ)D+0[L7U/mWF#֧7x+eY:;Bgǿzvx֮YΩ}Ƭڙ3jOZ>erY[2qBqcǜV4zy=9Nzʐكݫg4gR|=nM&gϨ2#Giw%m~\c +#>҃GDz8s(R]CihB"ʊ}ݥ.^C1)HؐHME WARm/*\EM92"ϝWѫ'5GDBFB7Ä!C5d~=?WHM-5|g[\dBWsϝMizEfTrϯWP^t?&Ý$ ӝ_t ~sjy==AOX'R4!_iBC/5UMGX㴋;,k2gIʜFsx;U>$tW};wU+k'SkAs,WV`4Yxw.`DQ$X秊`)VA엫";(rvP]?~P2 +|3 +G5 ϑbJݾRvh.h(-VOsi*ć;w(2x\FR>ܡ.p +C+Ճ7RfhHGji*ot9omSC}v5*ov v~jr. U>Α*KO΅OC5K>$ƻ|wk3'&xEEe>iWIIgsOV -k0ӡa%G=JeeIOK, aλ?.ퟞNճJQ%yث8܅n *[Z75{I +Gh=$X)O% +=r#kd"2,"oʨ1fiF:o7. ;[C02X.Zȣ08ZZp/Mmc8;O?rFҦ#əzZ wSv<_V!6Zz|+3֛@*ݣ F%pѱ}R]ե2 +]oe mkڨ~J`ffdd.ȳk +S'jrC(n$|tW+ y1n.?"3܄#oSFդ +eSS%>Qc%>Rb*+%S]%Qm%RM%Pu%^SU%^Qe%^RE%^Py%SY%Qi%RI%PbVq%Sb*+*;hQb+q۔تD@f%Jܫ%Qb[S;]۔U[YبčJܠJ\ĵJ\J\ĕJ\JlP2%ĥJW%.Vb)qMJ\JZ%(=B]{u#ԵGkP=B]{u#ԵGkP=B]{D#GP?Bu#GP?Bu#GP?Bu#GP?Bu#ԵGkPn;Bvu#mGێPU@aNܙ]@p@!FNbZZLg1-cZHZH-fZy 9gRrA19LuL @g0be4#9Téj*LLLӘrrNMaTTc:ii"bL2a:it1 +4id140(r9o80paL2 SpLL2 3ZNfԇ+bz1dd:Swn\uS:ٕ͔U2 S +Sg&Sr y,SR y#S";yvhvv`1Eq^$SS8Y,LaNA@bIg)DVF8_3p3S c i"N}ӷ f˴bcLsgSpcvsއL}0.é +t<f$L5W^azC^bz/0=ӳ |I'v1#cL;GfCL2=#s~1m $ɠf&?ӽL[a̴@"kqr'w;mL2t3MLnnZgejr w'K9o=%L3c#/TL3Ǵ6P ZH:iu a ^Pc XHZɴ/rg1- $Tr%L150-dZUs3@󸲹9i6L\-L .^T͑ULә**1MAsϦ0MAqեܐt$n˵0MdTe ry į !ELQ4@y@*P^ - g00 .N@L)!43ebFb|2/t2G ȁ Ƚԛz2ere'1ʺ3uc`JY:ӸTŵ8pLdN{9()` +O%2%031r.`gg4S&SGFrd;ÙL04s:$=)q0y +~`~O| +}߀/wCSc#v?>G/wwmo:asnp +-2"_ysB? SY'm'l3PϨq1ӺG|(`Q ;`;!o?poRe{";7Gpn\ -V-(sxcl7@_\}-u]J +r`p'$b∙u9/ùFOwg;Wl9Fٛ++7F++VbӊVxb"{yڴ̻ԻػdbZ .557,llD~ 4j7zM^_X7]QhiݹѥY^o睿iw93Y3fzgdW{k6U{{++Ӳ˽S7{dy'o*f#~Rv׻;1;aSw\XXdyOT=;jHBoO]u 9DnDZDcCNv&k=;qļN:]INz)I$Yv)ӱGBJ'91%3`ՙ(N t[M$8 uA3 J2Z4o?/O2~M5 qq; xK%Fzͺu[O 7x *5!4sꂆ>ϩ;=QKv-:ZDGFkht>&?Z;}Fۜ6M~D 9nQK +#7'r\+DSx8qr˙ cꂅ7RA&3W~/Xj0Ҕai ` soO7Gw7yjR88hV+r,`X, B`p&0ul `P f5@5PL* +`0(2/PL&x`0QH`P@ <@0 8 +  ` 0N},7 d'=@7 Hn H\ t@"q@,؁h`H ̀ix+>u@@T-~`Ow7^`%7 g'GnC}/{;[k+K s3S.cNQa!A`l[ {-=f`p7pp'pp;pp+p p3p +\ X\\ .. (_` /_` /pg pg pg pg pg pg pg pg {_` }/{>˭тm.fҒce}x:P#:h:6t1z9o0#j׺@CeHř\=֯}}VX0ڴWAh݇W.ҭeZ;:(冃9(2LS*Vgff6k"o&>g 5 Q8^ }8ji!5"|͇^Lɼ3t-ZJ,ZN+ r,3K +Ol:PٳΥ5xjto.8Bbz]z|]Jz@tŵt+ 5t݈5#.FC܇Iнt1U55/399XncŇfk%.iSbQpejDr-d-+#{oy|\ff5RR= rVՍnPF#} JYa({nDuXU[IO۩Vޱ[!z +yvy_0| ?#-8$=Yz ^4>Fez^ >O Ǐ`ƿ?3s2%_ZxJ">ppRcm?Sk=xs7dƩ@NLch,]_{l$q} ^Gpȅ;D4aQ-׶:s|pŬWdٿ{1fpV^o'>ٶE 19'.ǣYա3_|1d[*bRc w,0wZom@eGrZp +9go|s:xoG3L:: Z Eܞ D'YUDI +DFF7spb a!_,iwDj$9Plcjr+b=8H8+ںZzE-nYڒYEA$Y)cCY C! ɐ=&ؖ-p33y^yHbcUj/@2{s99VxA=k P:p/\Zx%k6w`R%fUjPX5(V +++q1Ҍ*YIt1~U6ҔY[8aOg*8A Z239\'zTy)`ZA6j'uutZ_p4q99998}zC롇CZ==Pҋ'THa7?1_%i*!bpJSތGb-͊Y5p,vrq x2s +ѳY1H:ZN{Pfb4Xb }80NPj@]{us0e~q\8b4p受?]] qi_^*jNڰ f;z7kF.ݢnA{a/Œ#pI^"`1}9N9:00_r: E SJ6H{6V~e̹ᰵ5!_b]c޸+L[;mrcfįnl 򻉐ޞ/arDz{#ď:O^ c_G@,P5-t0f \*4}4ӜOwbz \yE]ra% vj5;2ЅRi.7$P #o8/Rl غܼ Ɐ_|v<a_ooW>p|^_߁=X&b9Z*M֖7-oZ* .z!^W7y0=a(_AT4zV[GJPQ!_)=A'sU.Z5mPre|_[>!M*;n}|d{i|oRŅ2\nHS|Bcrp94{jKh˱d|Lv0p$j(mZ᣻ +x`o 5X|J8;ءl:A50vq +=GB6ɀ)lxC,i`RZӾeO פ;]{]7 5 -&}#tOvc&a#2ހgHcK;gF-TEg8lXK$X9;/=bN N NujvՅT [LAć#Hw;`[7t?nA/ /MN.Ν-v ){ضe[=25>*AƐhnY+?8BL(斷gWku C<2 {u]孙lۊݐᚁ9Xg!;s`t!B܏@F'#H$K/uFK0j&({ޗR !+[0@%HQxD_UQͬe5.<f՘jc #IeH|\A +c-l6 +M¦Aa{ ?lEƄ1N8@SSTEH0 /Թ+-rKUx{VN^q[GSo|깻o? uTg +XXv@E,o"{̅'ẍW;jӌ:Q: + 9[6OMז!U&KGW"q9&{)SU|4`LKb, qBrp$$p/Ia/,ຘIM4t1]:gwAL 'f8l2բ:0lA`YX5!Q>:QeY|#CAUF5 +Z^alVV䝖궪s&Lpgq pR%@/|F03 xbΩL ʐB,ZXrXr FvH4wL ʊrKbfL V [l[5ԷZݱzٽ5vh۲bfąS'ajmm?^S@]PcT U1 D;6> egCk9F' KH|/|+.HF$i7EkkE1mK슥dBط|4a[e$fj#ڀ\_37L) 3p&fVBMEb+R6E]\r]+OgdgY" ذui l3amqVt%Y/mXݓ 7=n1UKO `Q-KRuF!# zv!.R8'%2۰SPS'G WD 􊸥83C +hEj5.Z6nu5,)hqqg BFՑ_]A|+\"r3Ml~l* h]D G0ޠv\!a~]D|",s7MfJZJMiJ>f.U2 ..⏿tWĪ)?jOtc4_|~+Pfp|&0jlMVfr@8aq*~^W<3րU98E{GW(QU0Q^x ΁CLq#>Gq;S@ +:FpK.Yt +Lf,]Y?{pFL$lso6RV,)[?f2RsmϞfz^c^MLOp'Z:VʞS5U\ +vP\3G&AK{IFs$ϸ"1 wQ)i@Ϥv[%ȐGR=A$&g^xƮC!x`pc(ک ) 0%e1 +&@]PU菫؈w.C 鮅Jl& S\`+YI\z|`lb{>o9_~ߩuzG >mjjŐ~_A a#J:R HTCFc8\?ch75&0Z)l [:yfh"j3 h.@pGjKcX# @G4"  04o_z&kXv@OۦVqutJMciC.!HcX;%zxꛖW3fOdxQ_((#55쏈6, fd!浅2gҐӠRyUU$|\ P/r؍4b'm̑+~K4` 7$ą`Tq pgiI49dk@Q WcK,5SAY)xB,kԈ_Y7aD"Z0 Fpۊ֣/ +aϰ Gq~G9DŽlQxDg˩іZTQy6[Ѧ"u&gco ox-h=ecgU;fj\I!T'~ 8w\rJFXѥjnx&l;jkM,K.dLkjB zIBKjln4+T2R nSQ`R*}\fM3r H Q +'#p:s(ꠃÓg3h'^}P>J(S ď}U.C Thmi@Pg{94NЏ3OC;IdQWVZrQ}wC=P<83-V% CK+]?H + ~T9Wo%VZGYlm'5'4. [.Cu J0 WX 22o f͒ 5*(-d.?y؝]w[gn[p`1$|w'^GGFlGK׮Gќ~5>s4 jHUj"t|SZֺ8 :@A|R"aK5@vkhYV$}=קWf͢NW $O)n z!%6ڈ h7[Zv h8/uHM\h^F٥6[ElL>ZwЪ'W#u 3*K5ѠVZ7Xx̀eKr&﫺ӮHzc30j B7.'F5,>L_F^v"A>.B5L^" ,jc˷.եC' u2! hD*d©y5eW³y֨S\+2ƒŸP 'R%>A\l송%# 5ZkrTﺉu}U 7[ZoBs l ՎuU[F%G0Vpްזl%ѪlϦ¶`s CAѬ7^OdCۀPDuua'fH]kF)x)VDq⽗`*r/(хvxNϔR,{ڰ%0o#xAE m#,ش0^4Z%5 E{wn Oljpِϯr -_֔~.bW!/3[зv19V|nj. ʗfLCPы+]+O^#/ge-SoRFWJ9 SH)0 2C';^OHbs Q1.x/~\a0³Fc䆙| ߃}ȻDv4]ukg_\믚4CvHGx VH'rtby]5 (~*k)섒02 +R]bрa1CX2)} ,V̂V!W*2]L]y3W¸X¡.q)V0.2Be&Y3_ #( mvL,w)2bLVP őEh?!påy  ].xnXl`}acf 1X Ś~éYl6jzs[hyN?5Bځ0K;6҉'JqNOfO FoBCpmد#]O*PY, kKi@%P 2 !x.Ѿ=5Ͷ}My(ݵzKæϯ}KS]uls4Zg%h:@&Os!'QSg:t^)߁t"=~Û:^,`&^ei ;x"b^&<=HZ<'oau}w( $mA24FyM: [Ǒ ʃ˭ղRmɞƐl\ֶ Ný*x!#kV-_:C3Au&%_}*8% -Ƴ:`2t`^_^^X u+nǦ1h B(GwrqbO=P ie}ɑ$QRh!-ɖڳѳˆ! ++ +MD2*T"z^W$-@/P+j*eG(p|DF!+egK;Lt+J/W13pz<ףM$cW@ӪE.JoH1pC(>_VU/t/vb(6BBύ@w`ȶeG^Kl4c#cDTa0 pr7g~`UٚlJTn/(H!3 uLj<#)a +([ +Fܣ1_X3.WTҒR?(puM0_dPJKkdd!r6KXԛ›^{ceu,M2&O<,%32{5]DWW7Fƣ*PkրЭJ7v4l$e|QVj{59?۝vHPg!l4Di}6w5 `+wSQċ*S'}:6x{i0qo{4ⓥ*}=% U)G,}Qm3 &L<ۊGeH0n@qD+|7"Y0q!_Բ4hqܺny}o ! VZ]V䔌78rswgz|m|ڡ A{$b#q‹b!\KA#Z^i g.d`Mn25>Nyش{DyRF4 $sԩ j-~SJJNhm#:b"ndq}%;LF7:ۿaq[\q-E!9nh@Dʹy*!X҇XZϣ&n-sb/5?]WjAD|(osCB?")QS'? 7F+ڵnd:QF%Eߡ P3V_mNN'OD]rh&gͪu IXIP5}G4dy 7ejoۀuw@ne^@_m|wP_2 E@Yg2jyn9 uR`yxpSPγ6lX; v;;RhN#<w{zwM?mCk{: Ugbjցcu>7V5"~jB\L +4%4D^O_ar <0 +h~{EJ-We7@5ЊB3ЦϮVJ65SKFsWkZ +n(`tX-1NS/mܤ>Ar/"o-o_BֲVwm|r3#c''Je6M6r ܟAHR +2T>ޔe;g{z [ Ml+3{$g8p}qWe\}9H=PsX6(QxCz{fzXhp+w񁴆w jJk&YZ4_}?LF6"؎ܶgj `{?X>-װZa1L^4eƶ6a15r`۴R'f'Uczh݁tC +|^DV4;8=g(W@.y9YXڴ*k@܊r+&/նcT+`Q&v2茸7 +Cwu#KJWOJF[TD=G|ysvǥ\jՑ x}PԞܙFȆF5VwZ%/6FκeN鋈/y[`6x#qJ.t^f\=6kZQolRW-DJ8RY(MJ)BSQצR5t=vѭYDc|QnC<]<77-@ٍC9GB4Pe@F9x[k1 r_/e'w580;8y1%HׂR0X"xCsc)K"P$!*GI{  c[2"iVtF/\~Tɇ w0puj|(df 9O7NTvl7P8}Se2ˢf +'QOј'>"ȏk%!l y=BudlAXy-˾gO:XITR0NOkx-,)N `2@B+Ry]z GZ?K!¶bV"ɱ0жwL혟We6Q޺UĸRSBj՛$da6[#Mi5ZC4D=ك{o ZҌ<\'EdJ&םcAw ZGqs҂21>Cv :4L2 6 <<}jǘblާ>]kR=Ԙ f ]ƦY\K%4ji+h>%& }gojppo.5W\XEnKUĦt+AgjAuU˻cr|+tRz@GnkBBZTȯYB5\c6;BpY;sT RSX+%sg|{P^a#Pʇ\d:>_4^3zWeՖ-ϧAp{fw6;xKܶ+驔oQB +S@|MFAKRRq* N2}%pYdgdĨurGMD~A>G>\ֵ2ۉAIIXwMNI71L`X9rxuTWKK&1W.4kN788mph@~H6:mD\5 ?IS=4x ++)t:1% 򛔿ŊLLmUd*ڛ2}eYǍÃ_yYWω}O֫񣓄NJ7#LLlNs{!uO>rѣ۪,y6P֋B H,Ls$XuFvcc58~|ȲQ4 -U̼O Q>ʾJ:-F)W*tt>TrŃӕ0&2ѿFa!]/Eyu-l{B X7o$ a.AjJWa,GUW;K{:VKBxu^r 9S14~;.3-rt[iplGCNALuuwAÿ񕾱_O %4˼2ylJ ɤ/' ^h\8պu>Hm|_ +K|p9B) DԸ1G DCE XhxW Dc1=)|"4 swMul=o,d~u7@ޟ"pλ뉪sjֶ;'G5Ѭȫ>rew4t\'3>Me1+WMHFZYQό_]U<1z[(/}ep%lk/7B,9IpYt/$s +G-|M,Y56@4Cާas"hߔԯ^R (֯}5+IװmJ 7w^oy4@) {ڮ-j;&2jirE2D =4#\b[B!)t5&MUM~濺9??)BFĦ}M۪^qE$7f] 1Q|Ɂbxa zBÆ q&NK1QcM +0⽟,? c9I=U#B*x7H1/YA%p=O͂j+d d>jcNa \ P x{!ZQ>YQ}UڮBlW/cf҆}'&jѤ%(Km-a840{N z4bzJd諕i\ѯ +q]H7ӖzDϗMD{?D !yO-zG!ĴVЭI1d~`*^sW[^hX.4+*ʾ9ҳ\EhptjoU +*?k)Z:o䈲@ԊM7{<A=thQƶz:T>m=+ +*݁8돛1f.6'Kh(2 y,.L+fRu]F1O/JC ~E|&9`i)7]I:J(y/GP?Zf܋e},P1TnuaW]SKzX3[; ^ RݳaCk[îi<6Ph\~~|,dž*Z}Q#b/ԹPd׹qv-qch4=r8*%WR̬Bný5+5)E1pGIdǚ,xhEZߎZ4PqHKm۔3;ϏvJW_vac՘]Lj`C˒Wf VPNu85]Цlb|CsZ$c%W>;qx0wpކ~ +~(3 +@VAew)Mx8GxTGx*ܦ«m-@ϛUjI#FjXY6츈 c8!lKf{9__ cLь2=-Gѿ9 +{5t` +xW{`ԏ;ncd]gOkLȠnFP}|4U|N ïV;h(13u󁯜 Z:p2]?p9,WeR$iwN\12׉o[]!Q~+JX=y|^O[f%5T̀ ]ƣ6Vh  &Ivc )cQ_ +K%+#K\L qWm495XLi󄭎\wh5gG] HU*ҒZ޾g4f jJM ^04fKSrfw%aDm^ղjQPg($ 0Yr9Q 5Te Q0^If~٫~øٸ۸`$6 ?Ƙybm6`/ 30#mI=)`90F1dl^>H{&s7 WH-bۦ˱̉0۟*HE6{jَr/lRMLH+ &SKiMVZk`hX9q0P[\ADra^`/lp:DW4v\ c K'9op 6 qҷ@e3gfLff{ƶ^`v$Ln;%KnN} 8 =C:=ܭuahpV 2T^4z4em%+]?u)8xOLD|$ yRSǤȿ27r$M-ޭ3'vv]@1j4q_$cn _lv6D6?{o~A$W1dEZ!iAM -4rtF66r +5.C)c^ k+t *R'OI_.׽ƉֈCJڟ*ʞ;y}\4~}ڽU[mQR*jC\!FPch].넓wL/>v~^l̲?f'Ru74Ua2$. 9 1flp,?㇑3 N^Wm#AYҕ%lj㝾r2d?G`rd&sO={2u}϶ѐcʤY'uM E+,_Gu"_!y P0q>;LC<& PJj0K',ܳy:2S/هgQp-wDсS nF,({QL3’Xv(ˈ%I^HO`=,DmԹ Nn&av`X'ݬ 2jdb!-_s/4KhH{V hع!I0eY vrB#97SmhZFQӭ,^(vy9E@L7Nh(D7NS'8|@n;s7nXdg'`3V0%K"&h 9 fvP9;1ǿ 7o$y}I(r~-YJ_[F ++ ZSݧ$T6ԡW % uW]iă*r QI%^"R(À;}CSH(;']0jcduǶoy6)Ո2((uD<>4k}@EEX I d@3nc2_boB11ⱡ-Xq>+!P!3\ Kti iXmfsWW51hŠݸbh2FJOx'hr>Ao#KU9h:{ЇZLC9j8*!m4*} +mެP&0y6Q>j,:Ia]eUsWm7=xlzԮ6xo'SN]eD^^ nim-wS{(F;ek*ٲ 6\6QAL*ڨLW۵& T:Zװ@tg>MxKo7 `D #<~<ã^A n~^V` e-& 5t{Пetİtg-R8w)Am)b8j#'sJv<1PNPkq6.8[`g$1`>I B0@ [G%|EAt.~#!?Wa7hQQ8N-7Q m=^N]OJ YCAi}?%Œn-);#FQ7,8K5"TExbh|Yv:qS9eiSR|e 'h3G4F[>U 4 +,B 㠉,b-3Fns>]@A3D.ƞEw2X?un Qe!rwYO3x.Su&yT4|%IX9Á3S3ȐZ\wG94PI(X-\RlkHZ((gd?5㋏s#[uhd0UL}FOB*U +jtHI:2L֙Ɛl==ٻ1+Kr3zVj_y|;t.1OO=\ttB8RƫPGoU7'L>:M +ґn[kj3S,}" jYOETc,l +Wf<ֳ>j +`;vL:=gQ75Z޳zOHe,r#o| *G,`4`69Td)f֋|w$&,j _R.Z- ;#cg n*g +¨x5v[k_y g٩VN%Q4ep 'v~\wXc]AVay)1-jRL{gVlh+l&dh ZkU#g*|2nwyǟ:j2az">[6vDrgGGGe,\-9c\pG,LdbK]?]PO+IyZNs\X'5@>Mc[ު&5Ӻ:<}vǾ\Aq{zgJRgHxvcc}(L X6['+pr^M@a¶וu 3_>ճߎo?U~XWab\c`v6^k/;|Qv7N0+ nղ8tW]zʧ8x@R~\GJndG*P*I0,6\9gM7Q KA_7CuLj]hՎ7{S1?dF^W¥r']Lw}|42~`I{-8uZ6 9a#]&{uYghY%5zb\ /z +Ƅ#O V$A. ݘs6b(uT *.Jр3s\1X +'zHbNdX` _}*Hڤ>M/?KןxxhKH=O /(S/ LS1KzWA0ysW`:!]<{$jQU|b@邹L ZLJ9A_vx#'-\ 1`?;bpy!Y`1˙)Te)k@@\Ewdvh65 P?[`ܰ%|AIʞ#Ֆ)JE-$'!%,@tz%=WjiZ%E2'J9 "~@O0vl֒)kӀEذR{qFg!B 6͆gə VF8\}I֟ON@ +RRi8]8I~,#F6*ĭvX nFL^ZZ@Ӛ&дZ 9 rغ7^b~iRmھwvI3fѾX-ٖ-ɋdy,oxĻĉ%JKHHBYK.[[n{  +i'% ?]mA\J۴ۖP,sf$[vۇ'3sf9sYޡkg{bJZoݩS;Raw3Z\ҩfō6FCW|CPlx,Ƣ$ƪBOczV$0Id4`(F!~#\ݑD?=gӂ5,(LSQr7/lS;M~4!?-<h!8#܅:y7[_Qgiן[iYJilQs`XRϣo7ȠGبn#? 1_Dn8bѷ%Hf+T,ݽNd .խg*ޢ՛\vèL+/ ؇9H @@)R~RjXHm$g_'dZtz M'e0y.7da%S| Ẻ?(3 +<7\2ւHjE o6`\;5U~g{So7ϔ!n?x %MH"ڳ7OBDI. ao$TQt ~6MI>qCNctk//ᖽr%xZ7Wm‡AU7įY 3XeH}|J7 :h@g0?VCI\&z`.'ޛ iŀ_C\ O6cx3"&w8y|_H{˘F?v`fQk{|6wv{r +2??'lxE໎%:-ͷ S8,r<3ǐ(LS8,)L @+E#aUwÃ$2 fwE@vaIGJ!%v76::I R͇dzRnx$})ɐ",J1oJKk3+5fBɁ!c[a]qRNa$+_C;?Tp4".&z_LY]gM?`ͯ \.kA%̯J1iι *rU#J0^"#'XiS8Ϫ( a| =A*HAD&:*|BH#jn}tW3YȗQ2ޢ4gW]A)#bbi\Lw>? ΍LҮ[okik&T6`0xAPo1`%@_>ΩgM4`- |$$  PH]Yvi\D@Hpši<@'.l8 ^1@m*hi^Flmr,?79]@ `%@hS +5M +7@?&Nd O\!4` W]Q*|G?V3л\_ u(>if9HBkPS$֞ot<*N#J``yY +0兄`V"/}ԥQ#G`~}updYmN uXN, ~Ad)&8[x7Zn"˄ +v|^*J¢Kh)S =<+dlHhpG+z!3Fե U2#U{zAx]H]zsWy*U؊}^W v׺|mM6?V`jC@EVdQ1̼XqrnSy0FWolQj J7Jf1;`)+–znZX7GR-`,DZG}9ϡ岀$%_vEÎ)*F2Z*䗖\ z;Ҧ i(Zz LϮ$kFL~pϢ XޭI[?U|o(ó7MgݾgMnvkr1WXն֭{d8>a G8m`f1W?cFc4:wawQƬLB &Nz JܲT hàw`ܪ'VAixqf~&~M'Sb24eW-ΛJ\ *u.fs*ZN(Xk+ZKj6qRW90YXUEPxQ0ihpzc~Ze޶ұ_TH;t&?}R`1UGOnG<#7fZS6FfQcnϻ\dq5&Gbei(J7bnW%z\h29[u+C{/C9ԟ:TÞu LJA1]S m7)YAYfg|ku*Zi*{G+tWDwtv޳Jo3*M1pG]2άӘ8kynY= '"J,fk& iŨ/A y^~w5bI-+nHQ\ΪRC׍|j|p8 bekFY9SQAg>"S2B\+` мIL&J\ݼʧ!d|gw4 ˓s[ZoўjjUUSߚ(9T^'gFQ?$a8CjsxxN(_%H1҈lg^,V?4%XyD韏DlӚ YTSDLBUBZB%˖s-["ȻOe055Nx9J)|u>_>8@{H_<)jvƆc#56o؜ے-U +g󉓫9u 6#[[e ,,,9A;v>qǶ(?A $?V11#JȩG'ӤޛI7m@HJ3Ab N*d6-NRֱV~1e6r Z"ZhUP蛤Ҁl~̄h\m[ X=P1>K*IߜiCf-@(XK6us[LݗIpA )(fSH/@Z=5YvUoo96m|Avigk{&޼nڿt;ж#}y7mu:uJkkW-=ѱo]u7:\0:9 f @8YYEpE+ 8%].YNjteR!.+ +EEQr' .gE7?3HCRȭWkz&N9X)Whvj菷݇9&3s8 zWU}hS@pѺџ +pҫ1a DLh0aELhHcB߄ W<Ԧgzjs-[kUц & +Ą?8+Sъק`>cDkҌ1 Aݟf60]?F&l_\J+E?F*܀LPPHz v!Pd=\ (o 0A yz) "?E, `T*$ 0L) A|l4BKc~Kq'`I Bj+iV[э$ i}oOtñ }RzChGcv{#)S6&e'SpX->`}-a-1ngjO W> b%_"Zl.w8uE氄 Kb ]+X9UPT}|S}f_2Q+vP3T1VL`~2u=u}wWY7Qxt-e:Ukt) oX؆Ua E֢ RmYmP8RZDRD?Hv{-~8 .,Y(8lBj cߌ +5Nq`r^˄Qhw>8B2h3hmf +o)Ŋ7w-@<"ěDh: ,1|D + +Pз$c-/΀D8pUp>!>wݑidtkGNT%ֆ8#gdt~Ī~o-="hVVHfS'ʧ~sB0U* ^n-5Qr)h$݀*/ ,>҂E(ZEKhvbu1jUB'Chk +Uݹ;Yi5HP*g?DY1  _@}o|u"V JV'O_$[s8f9m50P`< +nm-8! @iKѡhl& =؁QWz*KgCXz`fi<85k)*T #J+R R҅@ ~J~5d]_=Hk@lHq p"-C'$JðtG°DB+GT<FQ 5t`(>|np_6W%;Y3Cl .}AD`. m.#cu2ȶlmȥj/am8 DDSDiX5KB@T%[RxƪlX_ėy:SV N?_M"uGC@E$_Z?͊tSWmNGǎ:=ﺱ=;,#Z2!b r{o[ko H"Cx/z(G G bRd!WU}6*{R)C9,g}zh$o;oySHvj&}}3jZ {r˽]xC#0f#MUcu907[D_&"|4; 49q5W?ӉG~zjDb;ܦu.oX%V{Gm?# c^#p!/D*3N[{ƺ +@GqZ 3 y\目0Aߣ)I2E0yQL?a0 W(SH}D1RLqǷ\Cwo4Er_[S$'7|ego;{HJ>wZHZPYDk(󗬍-1B·Wzo3}OyfLS}mNWe2xVU-KWкtӞ} k券HG> ?#Jň=fJAO!\H4{.T$-j.bW2L~|bCQ?Ѹv'JE]xd}C!\:v(W:t<[j$毺3kZ 0s 7QjV0Is!Qg4̤ڤauY➺B'#@ A';xI ̢OXB:9vn +%`=hjL=]Mh݆p~C +=`ЮEv巩| K~D+)l\Q jQBe wGK;cJ BY) j>LQɘO׀\QqB|4.EyR\ޅsOblhoPE%;̹n;gКo࢓BHRY!wݱki7k8ZyGdMHNF;V\t$hߠ8NQvWO51]Y]wm]ާGdUWleڶeh;Z|a9Jb`RӁ[^XUQ`3\Qצu5Dm[/Ys3PgYcͯ_LkZy=o$^ՉLLȚW8oyh;ޜ[07eQM [hC, 4o5']$C~SPr&P/ZdIL +x=ː'pزe7?l_U +ƂMJO[~?WXѪ|.@C꯭gEynF0(9`:>DZ7kYJꬴ3h ;Y -"[ u0P닫@oHE~ J*mG>ڞx>5Emp5 sp]'yi(()!9BMw49;zons<-l 7ɷ;CeZ;ڿHsGvȕ,C4JS>vh)?г\jΩjZ~̒ڥX*[ΘWfI˛PgDskǐ= +y' ,xzA?sRR"HG:s#EHmZdѣ*U? DrxyqUY ?½oƣEӧ[o' xLS+*zcޑb{`M#dcPwr{Pj`uX""ԶITw+`gSX^VPqU~ {,h_*|XR./ JWkgGJWդW6H5v7%\*7^e2o8X F.% +eKi~[bykX^sS`֢ݫܨ4ڒ?|[pˣ-;ז߱.i)<~{{jNeҚX%C il>,΃EΩZ[\busH'H;:,ĎnmYc3cO[ާ|WN >}qW®1G'R"S'Q2.~]:%/_t>h|6  +@ 7};C>R.w{wrOSk3;祇ǟrtNx2ɳRpVsI}0:I'}~bdULbQ3tߠ_ttE,-Uq6f0Pz| +Y:Ws9M 5n; +! ~RF*oO_F^n=8MFi)J =?w=vr^N*5Sڱ1w ZHm)QZ,}߮=-GsShG ՄH\yp:)\ +(h{ÜE.LAg+1~uկr1Հ6K`b0QTӥU 艌qrlFiHW #aL5 n KF?yYU))4 ECķdnFoѮd슫Do﶑]1?ߴ~#oEcT?{Rk$fYnP Br 8 ,^Fua |"*1j)hLĩk(EssC+W8ᩐqv +φ& 6<{}}t},RdƃFUMI)'*% qB^TAE\"8H aRЄc0+Gyxi^Ezx9}7%﫮-ŮM93i^*UV@'˃X@{mҶPPAF}9saŮA*sɵõCbİpd +8~e3HQ']IFNzSwUUMqs[QeL\!@V U=Fqƿ6{!cSLw]Pme`"?.TŧjҊ=FBp<>Zv*tȷMV} +4<"II/^E 쫑E' +ZJ S@ a7@P>AD$$! +4 r_+}iJЉXQ||N٩ W<(՞2bBAo*g%4JOA F$@5l00,*Z2Y͟_ ɟ`HA!:{3kpcm68[ +ؾ)R{NJVO8 ߝ/)ޑȇj&Wh䳤ܧ~[R~ {4Z=4)RcXc,籨)(尜B)آj$JY'Xq<_Lؓr8v-Ŏ}짂/Vѭ)|i.Et+W<- 4VWv HY:Zvt"<ƔttȱXadFx8XO|haŶVlt-(rGGBdDZ -!8t ɄvaTdraCL_E^ Fǘ>aǨۑ!Bk/hX9HU͏n k5xWy/ۄ;5VXOub5ֵ7*yֶؼeFsw!^G*F>HU+F V߯7.ޡ\6#U @Fbcmp~+u4J7jvT;:Q}HocPUSa ؏Z|#ou+1&4¬Ǫ(Yc>|>Oxɘ*ÞۋM?xZJx.۲,mʛElÌ`л`>Qp+vxqV. )c?Ҿe Tj1pxYGg9-ݒ4T0ZJh,dWؓ{gL.}2:e?YDz+u Qٽ#}ڐ#Yk%12U)]ai@:F˯L9{Wz'VY#JS=j`DŽY.]~ȁC͡fk +ID</,[}"鞰;zVQxh5~+%>>_]6PdZk|J7FRW#;Xd1kfWJ>bKj͌JxE=#<=8#<'Bѐ.Q@u`ĊH,F~u+>REn%l̦}:6vy7_ܙOXoQki~Of)'ZNN\7dXV0kt:8_X2vޟT!$bvbV16TՄE $KIѪ|oUlA?ԻɊc\P8$8-.oq1H a0jZn1YIiO'둒`qǷhxЗrmWVI%v:7 \.ş81l1\/㛵u]|(GP{P]@'+݌>w#ljy1[L$W$kOkmó5Ry( f1 B-N3-M;s2:56͞##-t4z.gnT#dF ^F# [9# ޠV<80J4ApHwSsьw~[~A^@G/r$_Bu6_%Ġ|2YCPwU,)0{N'0HN$Thz@ S(w-iQh%]SMz9$@"cvDfh$3ΟFZOfF6&CHv"i"*^G^QNYӚky*0-G8Ϸ-tUs:vK̰/`ik%bOڳ6-l8X[Hwxh~w:~kT܊˺г*Qo% E@$uL[PNF. 8\9]%"@D8PFk欓-fِ6]NwR +j?}ʧf +LHd1vff%ZgԾZyID"E@ c)Lgf?9tAte0NW3t5354Ҟfm2W839ҺJ ܻ_>H-ֵHpqBZAABZ98m܈A16,l NW`P^Hq|o\1_:srdJ\ R[?ΈACGZIW{.wQQ"J ( '=D2:'[Zɝ&8e[;qi?:lqk9“zٝDOK +={sB0T't1YAc&W~YYˢ3= w;M$s1OxLf$'qsK!@u /mKE٠LŽ)$ZўlȬwoC%PɲA<{GȥU?&zd]@\޻db7wĞAͶBo1Ló-}חw;8̭7D(\6 +5Ud.,viR +Bg +$3h8>ikkljCF6}Rd3zI|d[pƝfg m<__ 8,ʵ S?vYu ,q ]spVZZPv6Jñލ=>f>p T% _oY9\vuU2l6&б ]fWݨGѨm1W\YyxU b|-L\h &n L;'7t8"dǺzTO[Ɠ(6uzS%b8\׾f{pk@.l&) (yDUPAyNW ?dw63f޳r3 əe'ܒpD1:T."FD0Dd|Ϙi4;KuI%Kv_Z~p+w n\}c pɍX7۱cTt@xϓoOŞV)Y+ ቶ>B,q4n˞\ \T8k BPAdQH_f3hwg-x3RUG-һm#Kpu|s`Jc5zx9:i5ى+;PeMKP9ifc_%3?g0 2Ae~F(5jQWyCڒY^?з܁)> j '[}&hY|h]>вŷ\獍l)-7(:PGnC6ulhk?Žskk:YlüEgzLk<-z[6Po&^xNF?z. DMMج\@oa#7XE3&-]:+99 ;X5tYE^4sƲŗNhyK>#q㹌QӣxK9fjugG4Sfd{ͩ⒉?y)Ր*_:~b:9K@m27U4{vVhVAMrv;Cuk;kO~^~i˭V/*YWV»6n_g)_j,ɞBZrϹfϴ.c;ϫ'ul2aŽmm^3aVeI +/0}%[MpKJ]βNȴk-Iix^Zђ>uҲڕ|Ku%Sl]vĥ3 ? +4a) K66{r1M#֟zLcc G+(T\?7m ӦOZw@{`ѾXR%Κ0DMxO|~p(D센8yjl?>Nv1OS)G W+10=b")d- RoLTNSD3!wC^g򻋮h{TxS&[wFI&.S'NΨʻϕ;L^?"S &N yɌãec4tq~qΕK:W2LgO$'=wVTSDѲpEfo"%uKV-}o٘,*s% +*eT,Wr+G^?-+_^k,㊬P)ª-)n񼒩%K^Yz PvYqO~6kmd]/;+TqR9r}垤$ K|YUՓZ?Se#dxjMڛkQ7j߮ &uƤ>"q;ŏ6ͷn\uWmmr nh8cSߵukߤoJoyrvg;?odzvyo5>Wofu`B`zু} 0x2Lׂ 2\2۞ٱz;.8ɤs\knu;T{^tݛw;v{vN^מ/X^ /,\.WW]ֽ^q{]{[<$%)IIʿt @v\sw~/t웾u߳7T%%)IIJRo'$%)IIJRW=={C,8p'.7ƗVۇ6OrSR$%)IIJR$%)I җ +,.&) +f"a*߅KU"7G\VōQseM\ۡ\qջ岞]r E ڻ岉)bg*c +%yN;"N"q\VōQs;&]˭x@. s岞3g! |ut4l&L%Ser91"ǓuMHˌ3+3ά8*n ʚvƙgVfYqfeƙgVNI͐.ˌ-,B. +9jBh+D)w;Z(y8Dj̵/Hk.ta|wbd +WR#Z\\;FTA :NZrh6:fj/t^e)j[L~;Zvhcy혇ppkQkA+m}zkמ&AVވjJt6:z7@[0IIhom\l"t>/庂#\\+$$[h{([ +7 B!]]_YcsH^hcՉZ;J!Ae)@YY&Ŵ؜^"Kg }*҄m`u{kb,+j_nWfi㗭t)dF?] -CxBĪVcy^+~͘Y>zu(F:2fqz[vshf&J5tRmrV+{2Y?ۗG]ta66c]+kalvDwN}D@kº%v:C?ffW|Uo=Geвs:'YG fٯsَ{1E}O5$3L-%.F<_PQBs'eKl={rdEP3"7hvXtz Ă&j-sLX>~kgȮnsLII32n+s7lʀ^WLKMWȬkv(,>ټyFevAi,fJ4<4X˞N,ckg6lポ|>9+Zd%l-iAɕ蓇^G])={W|Urs˹!#=4GY;ӮD;;̙d/]' rWgӝӲSFё5*/hnOndWh#1B˕u^5*wΓ7-bO5t@6JGCItOw xO9s =f^b+{6]s@>} +\,̯Gtع)?:"JNN\c!?k{g>o6oQM<9qe-{TvS؏C +ܣ֭{EM$R0S[RwyyĝFjK>ڢ{K;Qڠu/]82IvʱG4ho+'Nq#qgGS1N[ZK唉?SΉrJ]A+^5̵gGzvEo\1JPۈӲMBAԊZL3NmP)3J7WINj0Ƚtbh#k +godxwsK((ո3'pKU~흾5 ;$ٲX˖jTj:|h]kJm / XK$D]VOfbxȇ KK؀V6qG=\Wsren"r-N@ +؝V{`;YҨg64;|X +攷9yEiM B\iU N9`tgd(Fz` ,{pҗ#mX +g%[reKNwf~ڱ@;N* +~ (&2Ck8l;po6GvY֎I^ 照d籰 f-":= +! *VPYn̂ $@"kz|vg"=;Cr}# 8]ddLO$eɆi!R`rD 1YF-5ڃf +ed_pys~msI-#seSIS#[|Fm/qQNr(j#8X̏N7 őv\/DB%sS` 9] k[hL آiHKU%um5RYT]SHʴբ-m,+0VYI*lueER5ŵRUTVQ]^V5jWYs uUPVUV\KUj[]V^V)[*)$:K&Uj +m5Ru}MuUm1/ʲʒR\Q\Y#mRTR[y9Vk}U՛j֔IUEh\] lˋTXTa"[*UӻXZL0  +ʪ*2 +*jP*kꢷn,-Ζl5eHIM*}L A-%z}mq̖b[9tՒ$?H~,&?},`_ɏ5?`x @y#ď:ɏ $?&_1bǍdp.A%\⿗z5Mi2#l))d{x o6 Nk/tq?M#UZMK96+p+:$lGq7!u-#>DN{>'^'YW rJ~ x}ow;|IK . 4=aV% 9aQ(*ū:!lS WG#ϋ{ۄo +?~&-*#8$| +{Y8]8_|_?aBH܀*f0.0;fٽ`v lak,f|0b00Avٍ`v+Jwك`0{̞_ٟ}Y:y`f`Vf` ̜`] fa0>0; +f0~fYqH4YE` +l9i^c +Zl>Y cj;u `0̎` >^ϧ0*0[f!n0}`v}̾ fOl|`$L+# + +̶`v l?f78= +f?'e0{>m M1S|K\*-*0kl?f_`#0{38fi`6Y`D ̾70{~7lgY&-B0l;]fK`v=fOK`& {_fY.203;s`vf`^q(aqWQff!0 fwQ0{̞_ٛ`6,~BR0ˡ`ց0fP S`* fg ? ̮:0/{`zO#_j;Gl-m`f׃0 ̾ f`  L6[1G = lf_q0fو*MjWUjJVmf0 &2,.U`V fv0 M` =f/هq-d0[f`C`e0̞W-0;_)yp1 ̶Y`y0c`8=f?'DB̟!7EY t `y0!: f/a(ަ$%Z$Bl!K|Wfٽ`]0_`}L/t*^ +'<_ 4N_(_:UXtj {rǐN _/R'O{#JG7:!YVz{6MCo*{tjNEt+ +NUTe6댜-uKkk!RXJg35:zzZXC&ԨxO,vAtg8Щb 4ކgHtIr 1 qD'Jlx)&z@jtSq).yv\~kx35]Fyj24pbԪ8Ykz[4jN驮${=z<^ VU=Bx'z5g0q FG0T4<äq;L]]݇<ɋJ5k8A:D/VI\ GOUXg_o5*p>%EJC?,D+~NfTWQ{AXeXg64rB11̴N_ԅ Z +3Ӆup|iX]4HGCPqzX(;Ob#X`[Dq42*hnmO6-n󅛑 aFJ֣5r2뇫 ,LC%sG9VcX̡9Tb1Gz1G{S ƜU-rUnppFz-?յ G^fM(]z7Epez3NusVz/F$ GZOO7UՐZN=k/jbzN' +lx#>4F^B $"&Yג[4A5? N~ti?RT:jx-9τ; *Πƥ#ڝd;Б4 },85o ,6!>ZqjL!nŨneZj*;}HkhezAbJ,T &HT",Nk,Y燉 :$nĭ Jq"*`zVְX0 ݰ*5gД /* ڳ)"oPKq+R`Le0q5DKFRjm) U*ޠ%Ǵ&DZ4,H$Zc5dmFVViiN /IJNւ`fLG|tt>3 h31\j0 ?Hшt҆M{V+zorv6y` )HZa0DŠ*%"۠ FCq T= k-oг*ZJLAs3c|.09㈑ݒrƢ#ňj'|ڨ$4]+;SFx-v0 ڙ yҖcƸ,AOg'ku8˰Jָ%qqԺT_{)6E>b5Iq` +_dmnɀ"4/eZ0h{U*zV;7r +Έ&Z݉Xe/ahFe%lH+r&lgL!LR9oa7gr a+}nb h4jy+zwU)1---%z.%Bzݐ.^f4Α0lO8YƈYƠK3 3U>"ha \1A2`tIYOju`WȈ,1iy;y9}ҫ%/.pQ>p-/!%IЫƎRKrIQʻX"KG D4IOM}j` 8kJMiӆ +>9yԩ8o7#C"! G#'"&#oJ]ɣ" k"39:4p\?YD)옖ќ08~$#vQK"c\*d67T)7Мstl:tj%WtdX2,&='̇EN1qB؎gw7ƫ_GT@E\+i +U ` pDh +D ٍ;v?ESTEkV-Į-'ӧN 7]zO{u/ثe-KҘ2h)ni2y8ItEw\4Pvd8m9G`, M;i(r3x ĕ Gdn_;Ѥa%;q5& ϰX65QXESU..U3HD2P Oە%8=fd l %[՛-v<o; e/R=l <_̤YߢW^+uMF9 -zTQ,vR +OU}츖iwOGpUhߚ$o%ˬ8ex?6|<[W< svue[T.>Qab8^ƷMq89K;5SWi YIE7ΰlq{C>B%4jik\V׹pei10毛.eIq:wkAmꗪ mR.\f[4ͨU-{S,KIqfae.Њj%K/X ߖl\lic280.>CAy[SiOe\jp}_p׷J6<RJ6; =?/oIw/} OXӷp7D:7/S_r/i,w2 _o}]fߘ{L7fkξsG't? >6[pm|i`W~}kw4)ϭ;ϩ+)yǃ3qtOe:NOUMT,:ڳ0G]¿mԇVeX&^2RMhi:2`²Rַx_g/Ik6]S۳ܲR-¾y&p>Es2;WenT@Kn½=7#s"v׳+g߷i"էlR=Ǫ+U9xyN^Uǟn;8E5sԷ.}E'ṉKpgK_gvpҔ,ɫ/LP~5;Jh;P<;|o7o'󛿲*\wD=dz]tǒs6OyW}{^.hޖE-O_G8|[:*<ч[ϼ;p7э wD'zhi b(FD-IDDE%vf}vyfssۙ9綋|;Fϼ @-XBV@: +,xàg>^ogϢx0bGh&H9"/R4 +h'K庸.1\k!tFƔ} kQ^LǸqd(M; /Ivy1u +4]t\⒁r1%E2'3(4]U?DeǙk1P<FRuqEMp380Fq5[=sKt, *mkNp(!eRd|#URtEQv%]R懻x~([lT:gTc@Zd{R9$=i%9-Ɲu(1oTT-}kC~_2eOvw* +#bհݻpE7I*\w v X=F7$k]hzpeiCk/RLz)UlXvv!_d +=/*k@n|r JTl%T~ܗ].t7u|TvEOI=a . AW_ɞ1_uP+3JBbcCRfcXU6~1B 5o߅:) q"WOv45O~Hr;7<=1H۞E?8 €$AQ>=V91wvzqj3M]ˢ%jIeB/dx}̽avͅ3.i[{b^_(﯐Z+BgyaC Hgpv\MS szuskIT@)>[缊In^WAsT"Ff}3ơWjٕ; ˙}R?5'*wdToocLGp1_x%ߌxxĿx5J=dsP<HEvy7j7Il:ͷ剤/A)(ոb +tMA PB\?Ucga * (3O=í0)Pbc J}Gj*aޗI%ϛ)smZ,PsS& ~QRթ8թu}1ęׁ6n.$q];;pRVf+WrZ`.٢,Mj!k\ ҽxIz6 t:vMݩ%[n@ {=~S$Td#T>r0z;Oh>R}Ihlxr3xE|lJ33#!]/g.ߨο-ZyrV/UCuucw~?k`50/Oy;_aj0"POlhp<-gc7U d+J4:^$­ۄnw4SL0J;`i\ lME?A9꜔toàWلwi%rKz|4{HǸ1_ZX9hyqHpJ{q2aٚeG-*|^G,sӗ,u}p&V-Սshv:J3^8&:Gc5Հ؉eݱ +VTе95"(Oa 6~VUB!oX4|Xqo;':y[1Xs@A;ǖbrpHE,) 9n£s ?ü +T`GFhA;:ثaoG HI4V0vߚdIzU6GmD P!7u IЩ3ls!f/aMZ{( Q IQ_OKs5Qe&v0KM ?+(Y6[ν?IVƃJ$lE 1#h;g=P$yBl(u27ݭʏ[gXSL#<k7Gr:Eĸpw^0Gk+1hKR,0D9pn; +)0 tB|+O#hfCy3[0ӌ`~AOZPNPb`,.B.NJ߁Ð`D/z>5\zKIL$N}-oi fAOiJL-Ob^^C0L..( ~5~RϦL‰( +o={_\kQ{xsmZ{{ŪRu.m 1[&1X|,Cen<]|R32K H2POS .ausH4̃p|H05figӤ%@{\w A.EpTXZ⊦lqbx 8<{$<0o y#-N ib쩊Nߤq_;=F8Y*ZP-Iup+z&M%U9>CWUCJ۬U?|Q|ul8F]#fCKfBxLC$h )#zRBѼQPayA7R!K'Z u'ljTEx7D%Q2` +endstream +endobj +199 0 obj +<< +/Ordering (Identity) +/Registry (Adobe) +/Supplement 0 +>> +endobj +200 0 obj +<< +/Ascent 750 +/AvgWidth 521 +/CapHeight 750 +/Descent -250 +/Flags 32 +/FontBBox [-503 -250 1240 750] +/FontFile2 198 0 R +/FontName /BCDHEE+Calibri +/FontWeight 400 +/ItalicAngle 0 +/MaxWidth 1743 +/StemV 52 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +201 0 obj +<< +/Ordering (Identity) +/Registry (Adobe) +/Supplement 0 +>> +endobj +202 0 obj +<< +/Ascent 899 +/AvgWidth 890 +/CapHeight 771 +/Descent 205 +/Flags 32 +/FontBBox [0 205 1359 771] +/FontFile2 214 0 R +/FontName /BCDIEE+Wingdings-Regular +/FontWeight 400 +/ItalicAngle 0 +/MaxWidth 1359 +/StemV 89 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +203 0 obj +<< +/A 215 0 R +/K [184 0 R 185 0 R 186 0 R] +/P 183 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +204 0 obj +<< +/A 216 0 R +/K [206 0 R] +/P 187 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +205 0 obj +<< +/A 217 0 R +/K [208 0 R] +/P 188 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +206 0 obj +<< +/K [188 0 R] +/P 204 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +207 0 obj +<< +/A 218 0 R +/K [210 0 R] +/P 189 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +208 0 obj +<< +/K [189 0 R] +/P 205 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +209 0 obj +<< +/A 219 0 R +/K [191 0 R 192 0 R] +/P 190 0 R +/Pg 15 0 R +/S /L +/Type /StructElem +>> +endobj +210 0 obj +<< +/K [190 0 R] +/P 207 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +211 0 obj +<< +/Length 2612 +/Alternate /DeviceRGB +/Filter /FlateDecode +/N 3 +>> +stream +xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ +E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h +A1vjpԁzN6p\W p G@ +K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! +ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 +FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK +.3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' +O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf +endstream +endobj +212 0 obj +<< +/BaseFont /UAQXCA+MyriadPro-Regular +/DescendantFonts [220 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 221 0 R +/Type /Font +>> +endobj +213 0 obj +<< +/Length 65922 +/BitsPerComponent 8 +/ColorSpace [/ICCBased 211 0 R] +/Filter /DCTDecode +/Height 540 +/Interpolate true +/Subtype /Image +/Type /XObject +/Width 1182 +>> +stream +JFIFHHXExifMM*i&8Photoshop 3.08BIM8BIM%ُ B~" + }!1AQa"q2#BR$3br +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz + w!1AQaq"2B #3Rbr +$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzC   C  J ?(((wHQOIM @ FI:UA=)͜h +`pP 㞴APEPE1QK7rM(en( +(H')9#</^sQEQE܌:FB%=/'>f|__J6m-QE4EUfj*#&@Q@ zZ(j#?:L)h@1@ EPEPM#&]((I%'cw#8"9sN޼;ˌc珥Y* RHB3?pQgԕ_i POayq@EQEQEQESyc%7Ўހ.QEQEQEQGJrȠ h((h4(()23EQEQEQEQEQEQEQESINS!RQN!ʌGBjz(((9ҥ(c2|oN5R>ihPH9(dC*W5)#ӑjZ()C`R`#J}QEQEQE ▊((y|UNtBc\s*4t +( +(?(h qN+[(%y1]ۜtV^k6OeC+\V3bߎG((׫s*J@0sK@Q@Q@Q@4zQ@Srǭ:(xǹQ@ )h7r)Ӟ: +( +("UC1& ʻtIӊ!dv'Zec$NGt,@#PKp52i@(T1q|j,j5̆v݀ A 0N@{W_Ρi^_BK2rb2 9N׮uB=F-'s*d.r19ǭO@Q@SA㸠9)hŒdtQEQEQEQI-TrH!jJ)34 G?MEPPJ̅[6O犔 +u&9S Sr2:@B$ ((((SBRhHψfx^Pe(QP'9uIU𦷤[۬ a 83ҿA>0ٙ|!q,dPH8qFk V,A>brc<$@? j趺+Ԟ+; +J((((()8E4ghZj* 9*ȁ<((QEDA +y97HF$r:}zb(:m>튖 +( +(- ?֤Y22;sSQEQEQEQEQE܌=i ڀ^EOVѿӂq+q8$`^2qߚ(#ENӡ1PaVPEPEPh#<~4*p BjjRQbz0~s|A TӢ*$t'0s^\xbU𾝨ZI1_$g=+_ xLDy%,#G'sF7K@ڍNpȎry#%R>QERbgͻ1O((4SA ZuQEQM=GܝA44cP +z"C=M/:3$([va_wL830 pB>=탈#qXR@ {?SEmd "9\=hj(EQE&9 ҈#20$ (ɩ* SfaeRp)u*SbbALjj((Xh&$ME5T( +; SCpzuEA2M8Z(((39:((0^IMO: +B285IosO(()8Nr1J(\5>[h[r :GZE({{s)a27q1'ӻ|o.'[$qDI dg@Fhüx] 7:j:4r0 9`9܊ŏjpY"K +r1O~uvݭ "Gfg! rrI|-|9wm).@FNrTlpqN>4PFJ;Gj(68'>v +@{R@Q@Q@惜 P(@K} !pMX((():Rъ( Q@ *֗4PEPEPEPQǻgiۜ@+9OB*)$BAFZlV +;sZQEQEQEQEQEQEQE -PP<99}jz(!x:ijM¬,I8+goo|)$v{߆%%@t#yl +M|9SFFZiTƲ`JF=Ox+ijKiA!0b2{zm b(CLMgQԇl9+ WkMJoeq`Wޝn =F1@oFw!E*}F8/cO gx'Y#beAW'>¾ zTPIKEQEyKA{R,܂ߌ g޿4-GE$sI@+o[,Ѯޣ#pHHZ|֊}OV{:n㷶(x](P@'z_:oV {4:mAh줅':ucS"]KuݤG-pex}>ʢgxݏlJ +(ݎM--QET{RܜTFXTpsF}M\n"HN)hA{sN\nQd$yx5f +( +( +(1P$B)8'(>{4=Qa+w,E.$Q"9tryodžlZ[Ti\HPiz7?K-gϞE K 0 0:>13HH<ˆe`r+:jsMY`*:nz2kK EҭeK}n4Q5ʹr˜(:i(((W#EPIZ((((\mĞԴJ1u܁@<>d( + ܶ~g=H +,V$ zRs|zI}.pr:k{AOY[셜ݘ@ܧ޹cweˍIS+z)>_ܛRWia7If<;Wג|*Eֹ?@"X*w#+((6I E .P IHЦz§ +( +Ջ.95-QEQEQEQEQE))h((((sEQEB폔@@QH8!b8{%Q@Q@'KEQER@Q@(4`wǘc^#jVLJmK=R40O >a-$I%zObqʀ?3lpx_.8ضO8 M{:䑋?$U!In0KgE~,e`#ҤΧ&2\$C#Ws@Q@&ͼx}j(((c (<ssx4))QM@&9+\fH6>_Gg殝!E,bC=M~ ' +{Nӯ|/k$f5B6A s^ai-p' 1~ԾF-merg!cq#3A橭m, X7u$JozWmMy ,NzzEݶoU7 {W~_Ay (Γ +8 HzQEQP)q?5Q@Q@z*pYdonTo#5%PEPtzQSBg(QE4OJ +KWu>zP6zv=?u=|C|,)mMΡd{Ʈ\*8Rqs+Se"1H`^ RJ`^?|I~Ԯe"mL5 +F$ <2M~{ڔwьdߨ5 4 {eNI$g =x"mv2 6ђ0}9^EN|7h< y_~.NA6n<-;8潪/-kWod$A$I$'𯍬5Nw2\iH';x'Jj*:19`N:@Q@Q@ɝV:TF 'Qo4$Oހ +( +( +(PHsN +( +cH\=Pߵ5 ǩ~l҅+Ak ]~>_ F]!ϳ! #=鳯HfWs8}<;Z_L}9-%edFFw )I Wꗅ5/|=gyyr4;d$YE40a9PM:(L⡆C*Tp(EC/ U%1@PP袊((曑((()-QEQE7 c=( +( +( +( +(ETM"U=XS 7( +( +)r0iQEQEUY&-.)3@ EP@#:Q:~=;̟/M2FAGSpF}!`rIVЂ1Ж>yk"D` +=G_oKgam8ķRc"r[tYm7(E$);Er6T$l6'q$ 灞V5Cúz%VPA*=qkxG4L @u#Ny4(wIj +\``͓1H+[{E'V^AˏSiR< k_ A^WA>Rk! +d2J;Nsץ~Q\#LխK(rsڻ@ EPRm}`5/G^qsm%1o0͜/ 85Ċ~_?~/dr.NГ&?%U|QkMNhITydd  QWowib}Ѵwpr sۚVլ$.6HϠ=8g ;XF5*R[]A + ݐzt_ٛ:pLrw\qg +8@ Ef +)|siQE1x^(4Q@((((M Tb ZqܒEۑֹ=cÆ5,n zWkQH"=zP&NieG\3mv 8AR+_JՠerRL${dfڧDX-PV2lR`H$I$]N]ɸz7n;cU.m㹊hF q\9 +Q,j<,v&{'خ<[wFvʖ<>3[X&A67Ic$c?~+yc޾H~}qO ,_Gl1 ccxguio;,qd 2QzJcwLI49i@!$A5'û)t}^]Ą[{xco  1=]]A<{P? +~3Z&bP Y?9\a=T9=+ޫ7Eѵ=CS?o7ڙPl+I\_Cqg2ĻnL x)QETjŕNJv*k;gv&(g=NY0>B*x_0z RI֖((y4CTL@Ik^~(H[681(,7"yg3_6zk[|1, Oh;vGcBj8:׼~^+״\hq_E[[lI.A`B |yu⻆hFK3rʻBV Az?ayLynU6d?Pr9zoG:ygB^cx1럧~1T4-FUP[ׅ'YH#}z0@T좚Ds\((( ;wflM޸EPEPf[ipA}jl d((˜rx@Q@Q@LRz{袚HQڀE1]w)4(((p|%vc9zi-QEQEQEQERcb?((:+FF +*@cim> >K:$p2\++ Nd{Z7'U[_6ہ"c*9>)H'E>#⮇|2ޣk771〦LUq89zqJtUKk((#&Fphԇڀ1K@ )h +( +NԴPEPEPEPEP(LRQ:q^yGR@W ?rJO{U({x;}֯Ɲv:6 8 sg]Dɡ[\[D$Kt=f:{׿O5dG n$n;HX9|K_saž;q@iZ֍pV@TnP݁_<7/5%IiQ +O-㞵xI4k}H]V'Is>26Gisx~`jent4 Hf(@Q,HSS1zg(-PEPW5-/$MQ@BҼ*x,=gԍ|jϳ<\$ .p>4w<4*͵lS$JY0PrO޼S3G~/%'jɓ~W#OԡaB,0 3 jߵl)`:!c@@;S5dR dSn(QEQEE"#3ZFt*ey'ڀ'RH`)p?-D]UV? + u?ί8x +1Ǹfc4 )fr{q=s^^{ cpH’:g+z^L1&UFpe 'q$Fc8=Eխ2Tux:9>|1ee6w0$*௨>+?ejڿ WɸdyϰΔ-QEQEQEQHoJZi`ڝEF69IE斊((o@߆}rv92'4dYnW ++?Fh~B_qۮ1__A-4'F -A9W$# :! AK Yԫ];I }sԵ;Rټ&P:`>5Czg Aos"Ċ܉Xd.:M=AY-+/N$Hֿ5=Y[ ) WW_otOHԴ;+V V*=u9ǽ}S$B= ()2AހE ޻Iݱ@QELөsK@Q@Q@Q@Q@Q@Q@Q@Q@Q@9((iր3N((+P)jN>Ʈ4QEQEQE((#4X_C߆3G3};@^ ޾uޅzdb_hjvQL^nIH@V<=.bLe27˳U=}6+yW,oA${-#rhτj4{ܛrA; z|ol + @6qj9_j +LR@Q@v @MxCFz@\(k9 +ܣp d)<_o6 l_?<}%[%zʱ|3t 'ڎ |}#־'頒gx. @WPr['sW nMZokwAD{O4F_~[hكNX r{~yLD52\R9BűR}k]3A:<1 p3*ݧ4+*YYRb:KPfw}4K1)ڻ]'ZޖQFAX |coq,Hl8NO-.TobOJ##FwFwA(UH\9Z^QzAe%A55g$ھ09c9ZUŦ}.B3MLHpцu 4; %y>K޸C׬& |HPEnN3R6qq~5-oH{V0A$NF9?Mu^H,NF3Oֆ +pkڿ,ͮ}V}.T\@4k{B=G-L  G +|F~-Zjow,ooR0H!'Ovt^q 䲢d#t%;#f>0.Iė{e 2g( 8dXR$S2F#UĽ&w5[9#(RA%*$F} }/,h@8 (nNq٣ ϥ:Jn$0on;AZbʣLvع}8Z))h(R#CU-owYRQmbv[\-Q@ '<ӫXb,eԮs?@8k[o $zlcyfvlu۴8>_p޶u~şxH1ߥnZO #V#޿!ne#ԯKV_j /+YA* 1]f;G5x/.4vFImfsA@W|8t,KP12 ~;1j) c| sր,fu 9*R)#|~v()n(S\<NL)RR@Q@ - RKFu'SƲche 7, *NrʹܓߌVIBxx)%A8A4Rro# (9%ʯ>,G^E`]>@d[.ҨrUHPNN09ͺiۛ{q +( +( +( +w#֥RREPEPEPEPQ@4pH:h9ϵ: REPEP(?QN +(EGPO6X%p *W\A$HIFF8K{Z(4Dbb{n `f' +٬hVyx`s^7^fK!y +ʪqN o 񝖡YOmǴ$TrNg*'VQR " NJ_JIO+MWq(V8sMEjK1l$9 ▊((2W?^o.Yi"wp;n$q־=k>/xsK񇄵=Ggè P_ja>}!AF8Զ?sÚd'a8ءڠ2g' $6"ݰK|q'zwROXmn W|6QGA>NVH=\A_һZ"]!R *pǯQt|cjZ^$z aɺU8`GL.#u"=ǥ~Q~Z{=r** $ƀ<3@m[TM"!POF Ϲ5-a2F: |(R8=p+~mIĄ|eI\G9P@ ol>!}ybk 07$ErIz*$r??eCdzy,#١ #.J 6Pz}~x%UV- +0pdC~T`0)W/٣/e?/3 3VA8_$w.O"3b#6G@ ?ZJ##ʡxRDtaÍ(ٵ me-K  )Ԝmlw_jf[Yգ4=F0I"oYՓCtD5N[8=3_v]A'rH)5GwKD_(܃0s~cxgv =Q"rXw!8*195%&gw]׳-0fw8 5S℞=y粎KHH"ۘ2le 9ƽ5X=#gi02Oܜ0=k⤖I.D9n|g${Pmox7Bj7q.T*@Ji/?FHÑoJ RhwX0$(#־!Qx*Nͥ"w8g+RFrr< +( +( +(-PL)NsDv2elp'ӑ޽ʾ&.5{!Fe4p{@kRج%$˓2H?zMI[].Q9=q_>oA+AUC @_] u9frщ1NKqր>1eRTdӇN9rO$GHxPxIhӽ?uܲo.͸s϶|8qkc;y&fy kΝ"|Coii]1%PJQFy+J6Ymcx;=|wQuD?KF,z/-REߖ%rn B9t'.5}ujk3#qzk®6y-Ѣ2Ssp@hҵ4xrWYS A, O|s_Y6.Hf$Q5~r TpzCM\dHdR ЁuM>m%Wl1}?.솟}k.(aگ)|Ueo\K)1@ n\( 79E#մR9!%YFP8@X1HA"?ʬw:i +,FeKD"3@=Z4} a]j-w,d@'~aMAf08Ag#|~h⎻㶾4(c`ȊpOP:dpy(z\%̬] %w/B )~wD+s =5v֙t kk\fqo&ZMKEBJ2A[ſ:ųXL}y)<``JNp[WFıF8#nps}<{!20x4OnFv瞴r +HG,r;N=E.ޟP:ɹJcڧhO? +AuixmWT\淖Pssa_KMY5ܣΙw Xu぀8{Sj8Ҵ G6̱&9` =?ּ?ktב*̩ 67 `t$:=>kb2EQ,@@ cI9}񖶞!5-:r Yx=V;iG1-ԕbIڄa\`85"d 9b2{=Mr bU@~]Q9%l?^Aϥ~Ik$gR{c5xCbq#ͦE&, ݴ 9幱 g+𗈵O63db/i&hH +re 9þ!𰍭VS߸EwWy p)V1^3m|IY)xH Ak񅿅5kW~gٕR Lca$#wUoA%s$Hn4ToV/+B(((((cU=xieX#q :}ѓIttXu!,pRp觯^FhqŠOm fNH 8Fv$Kb晰9c}2u E@;GHw,s=2T!k[iHF0H(sm%S +.Fr}YGbi4뤘!q_:dc[HU.l1^OjZб#\ʤĞ`e\X @'8!=ik/K`c1 ֥R 㞴TRJ㓊>?h~-|G-FHeղ3;@hﯵEI%̪UeaH#ڿ(O%,2j Z;,OyOZ?ދ$6µ _xEQIzFA: QjD700d#%HA g=k(-((_7A>máZ}QESH:8ddRE((A斀 +( +wϳs?:n<^\[;C"Lw*z +C;j1qGקOZ3x~2:+>kW^̈́lkn^}(ԼtxtxX bAP#_ռ\S4[p1?xg/ o v@9\B5~̚ЫIo8v fg23@UM֝@Q@ zЪN#߸'apqve2#}[]ĺF%Y+v!%tq9$S l y8|5Ճ[jLe|@9g#?V9asdgF@pBv澵{xxTC' ׹4S<ۆMYe'# i@Ϻ@<`uߋΫ\K:!>\bx~Agqq61w2k8~s+<@뜞}g?؛(Gր=Kpƨ5 0\63k8dMH5_$\]0jlݑ6I $((d:WU'~zq_`kխUV@˗`֭$$Ze;AB,Ks >&x^Y.- ~'8$r2:ϏRi,HwX+ 3W=uޜ7ާtqG( +AnK^׏MGDu"fH's)봆V9@6:—Β Fx=ayX#Y-#^@(((53ǰG#p8zUFFr`{~K6ZΌkQxA ؎ztxCǺwt+$M~h##Rr= +O[Z|km]P_\pr@Ͽz& OF 89R=h)G88գx=dF?O_ZO~U) s_c|Y i${|d>JV,H$+ xg?uZ~wјnA \_|BDml@ +b=8&-֠),y5#08g־Oށ,kHuOnXcӥ~uwWvwOgl 7ϐ2ˁxzWjx5=5[v ہk" Jk Qaj#uCĚN.Y&7b r@>#y7K$m nٷX!F@5ڗAH޻sN;֮I2-R +oMrIpsxⶇ67\QݠHIclw(ތ2dP?=34d08 +AΏ6 ƎM!،NI mi$)q*Íq߾s=hFUlnVz$a ͣvy˥>(͟V;BiY(m_|c$zz⼿I[c=15迴fծΝv1HVk1vL1m>!6zrIh4/;<,3G)"%qp0;3/=ׇo^w{؉۹ m_v>bsOByt9'bH0$G]`Q׊+1")䶉6 +]א '$tw/ēwЋ CGrvЌ]?۶r83)$7`Fy+|EF-W ssxw" +G'ndhq m_C牵 %Ɵ;]n'Av|$z;ZX*];k?⇃"&Dm%X<ぐ x4iu?MhĖcpFq@w L2@Ѷ(emǦ1+/<5}ڵwiu$g z+jb(q;c1/ cko?&. ĉ)i@Ip9Z+?O"&u0 m$W$/8@lHNϟRV>,hn>= @ՊA-Q@Q@Q@Q@Q@*$m> h)v Rw$EVb>-Qފ(t.⑮o@NӧQcҾ9je*F$- <*Jzۭ{mM {m+ dR$ciDm'o"HgFbcۭw/y ᛍVOG#dMVlU+LF9NASl{JyOU14y.|Q[/FP܍'q X58u+O4D|T|A$`I1AN(7 )搀G#5?CYx9|17[:yܖqՏ`:c&<TCo>d?RGfڥ8֐9=I +7jlid207;g,zxOuc{p_eAw:hpӢU\}zn\gE< ֥yTLj؍PT)ZUhV,J܁3Cv%'3 cA#o+kynWX##2m gPMeWwMH\OҀ?|I\ U`F& 9PTA40n>w^u#^2Yp ^Kc#yj*6K=šwp4,q#3}+j>Kux@C=+*((J1bs^K֝r-dCD̥Klqn =~k<}WA!sa px+;Wx;cH($"RM(Qp}-Px_OҾ|֨} 1+Tz9XaČHUVe @8AHO>61syf opæ} :nk>km!yb Q00A:kG>%qun7f$`Hx > -➙xKUL`89G[+v8ua ~9r8ӯ$i#3rsCgxj KY<Ȅr2P2W3X#% 旽QEQEQExMP׼s"7C!} + +;GUb%QEA{Sz4k~ +GiaA#4:k}uI0wFnF; ?[Cqt bv|d_:uy\$.vNI#8_R}]jK~綖;Zf`?v;By$5`# _h瓦5ed4H 1 ɯѫi⻁.`!PX8 Es+ͷ4xB2xz 2xM/$`o'fž*]2A&JUH%9W|uk[٧GԑF6 + 9G#f&\#GpsӚb'u ^}> G-S.ĎH}-h⿏ ZS33I3Uy8 =o麼E`7CIapy,URN$E) G^ <@מ/w3D0R8G$ Pu47~J_%r~b6OV5fO>ƿY[þ;Fv>P`s=E~Qk|?wyi%d\+qI<``gBvqk6@'0=k_N~:`;BP *p q'8-I%<ȫ8?Z-30?Zo%mu@ W'};s'YAo-::hLԯWJWtऍwd9< +-Z'I; f"̹`/#$Ҽ55}Vf9(\gf=-UZ}@!'T kn-ĖN$<0'=ը.<:7p3Hb@#$~f5)t RCeul"\+rI*;dRIᑂHՊݢ.gP<=޼8Rܢ"9I> X4e$sǽy&h-tHs]dkoSZlj4O]@ӧxc9;_Db]@Ldy$q^֗V`ү0I%XbXqhBck%ͤ":>"&,wV#{#q ->a8 kZu UUh&^V^@8'*x+c׹h9ڼ#$=#[> )#JO:j7*4s |]6u9 Tsӧ[Q|OJ KِI 9bB6z@lIn7wRdh./%,1r ON3Q@ `ǀqOӨНG4(4Q@Z%[SЎv>z ) NI5j +( +( uhݏߧN?((OjZ( +(4PI8KEAà'9${WS\ a;=kD]nt[qTӨ'=H/kImK?9Q6g5aNrg_C +5m#c@A2 WpHzxFe 999>{5vzt1J2 V9 8mRRo"!Z0 sČPڕHXpTc0pq~u_ j_M.;ue$%y븂GNr: %k@VkM|NC%Y:16Ս72;y|k2Z4:=B+2L7hYO;i3:vX`p3+pI+>h.c>\#qY =H- C;3rİ<$▊+YK$C3} gA>Lbʤ(^#D?&HBKrNӀsW[.lC^B&^quzJJ_/--'Gi$< 3 8ǽbZ][[0ym Ovo}H#| +l rs_U]chb6Eɹ(:d9 +A;آ-A<)"r˗0{OEPUA,/V(Mx-=ϵKQJ`8(ׄ-|m~;1PTik79 İym#r`2O^ +`gWM>h)#2@h' q1WRMf2H 0:c=?:lQGhdSRk.fiI6P4QtٮqX>3Gj]7NK^IQdTSst/2+5XV3z渭3Z9 XU!E~|*ng5swgb63H cgZ)c4r<+Nw`89#z>9[y8h+H`@ss@TWS'[(,. f1ϵzPE@}[,FOq4~jl,@'zzWσt [k! +Jzuyk ][K6fdmx{ŽFin/< sq ~G-(fVpҀ w{|Gwihm7l݌QG#?Z̚"hfP 8# J?&D` Y ?urrv`2NzP~řs/8սX3_}n&䃓q#93{ +֏M6+>dgA( d`ޓŨUOx#Р l KԜ?LC!SG B #Tӵ];UӧIu*sZTRq@ V 8S%$sRH=M{>*ȺSI,f3&Ѽ/ ;q]`5lL[LPn>b) [##c> Kپ,Bk\ #=Oe;hE`A~jF@%Jw39$]6z~2~Wa?x`82\٩ +ILPv+O|*skoٌNT~9VӓtNdmlE*J c$ ӧ߫[j^K{[Čd0! _lQYI3mܶB=^ +!\+IfN=Mz$#s#lnY"y1-6P䦗q>pJx 2:g^}shf9bYx;Hq^O}.ZȚ,3NS9]T7X 1T~ X@hԬE5fkHܓ*x}紱խcI#p=A`ϫ},H@#jD.pG={ؘ~exm6Z{D@!X~m;AKs浹(cڿjS '6O둉呐r +A8=k Zj>hl49 ʅv\0ng#ڀ>otu7ʍ1Tı$pA܂8{C_Y`‚ q[IZ_2鱻(?Ȼl:Kr6``)r8v4庵K#,+<6NWr@+ռol@t&yM;1Xqj?v}RGM {si,1 bR F9~Hskj~H"#H(k_kw-0IJcV?tesI@q_P3xB]M4kH2=Lf^P( : PߴOɭ-^Qmb^2#$:k v 0")=dZd{c9SW;mºBwRLƤ11hjӄ & @s_`ih7fV.ĘӂYW=9˥o)=[Jۦ:עhZ~Y x9=(RoK!"X;b1s^-Q@4,g=TQBlr) *'޼⏄l|iSE2"x Y`Q0x55R^Zjdd<@o J;{[- 0{8ϰ'޾}%mtW2b@v"݄][N~ ]Z4?Z5@zgjo<յŅًN29݀08"אַU-dhY+} K<5eL4@\sހ<\ V#" 9?V~-o&Ą A~;zk$Q{d$ m8]2H=L5 BNoX̹S90O?^h3g.4_kS"S;vpI'ך⏏U}4>2N8 ^=Z k6: rvb8'DewBҀ9oI6ski Б*.TL)#s{ .ISM,jxq +#qR[]8+P9.w#L3e=:8W^eG2p,ɒ1 A0z~L7M"C8#I2x$lg-Xpz⾭€?z'h_A0$AR#V8:c?~FW;x[^CEad W> KoאȠmv RA$tȧWi72 x/N^!?m6^E}If::+߃{[r ~+QX"ьysӽtVmާceq:F7=ԵB°.粨YzXxe)*?goƷ\(^Ffݖ(f$cקxexBT8F{֡=ytD* 䟽FzfQo 󃎵l|7 J-Ű0$c z>-q}z}#fzà rąUXЌ0h{MͰ}CsVp u?Pr݋ 2u=#Nբ,r#|.j[k6ʲ,\3$>e)l{~z2X؎tt$OLt5GYv +CUPqzTF0o`Bnչ٦g! X 32rpq +͵u4q5I ,intw2' #*Z\KGッz^]LƅuH|<#@xWXӼ?nɛ(.ۇ%N:g#h/Y,aA.HfuK)@?h#[kĻuUvp9pJ ;dyk;=B35:(Yx 㸯uK\^[cb! O@={w_Z]f[hKiQb@/U݂#}?ThWImlQ;++)\dAȯufGƟ:6NlojЃ%Q(? xO\!<JӼ!Z\騱`pkRw5|BBE-]b0I^Ĝg氬u]6{YmTsE}O ,eI&D"`v}Ht^Y[>U6Sr8 0լnHlLZh`1ր'9LREPEPEPI-TjYRQ@((S$-&(4QE!`W|Hݕ.Xd6sۚ*ִm d8מ8/&I/-q6nl8I_Ͼ{Z{wQeDse_Ţium B@c!x!` ~'x+L) ΋;(G|)\8'(_#KxH)K|tWWϟ>HD1=9Ҿ(( +Rgsc`pGՒU^8ԕ$ҾP_+'c<`2)=^X__|d{wdbr|a~ };V!ٻ(a왮Lg2O1'zOtޙx`Ae8$;WUWmѦVޠcvq_VVkeΓF%FGVZ(ta^Z&FOH +}.ƿfe\; Q+.#\q^SfaZZl-A;7c~Zho{*bزǀq]ݯdL49Cot/e섂s` ;cnzx57zFdFXЫn>Spx8'[FȶpDS(q9I־++Y>&aM8B$z:ū[Ɛ[)}=xQĢjmHd= c49bN H9原>m{gWrǁ +=n}9Eх,\gV l€>A~a!w8q w^gx֑ः+#QPk>;|,!yI2ڧՆW\@Y01b(gLе _]=Tx؅.]7meꮠq^+ytIw-` 6όH$s_bdG[^D[@p[?1P2szdmnoxT𶿦i\1USs򜃀s׎wV|5SD{dYIۊ7Oƍ#1/_7J7JC< 韭|3Ry$ObO|d +TT*'i7G" gi;Adc=s@(<GsSW净2|Hir&*K4O#Ś"pX#p_CMRkW|e8.N18vT "`{ޥR7.QEF̱w ($JG2^i>!GXB4Ggu +G#=0|%*^4^Ǖ5!*r#&㩓W%:|$A1ʣ98ďL~_|scm"LxRp0P =h@01KEQEWWÝVž7ubT?RdSϓ׭}M3(:LP.\Ms\2p8Jo5S-WòAg35Ŀ&p@2 LtX40InҒrTzc=1ZƱ T``P I} +Lap3QHrKEE*ʄ+@>o;mZ'\G#㝸\2 |k>9Vmq +XWY40i؟'xUKwh.%S<(Q?Ś 1hT(NϽfx:m2+ۄԔqʺ;O]C!,n`U֓[& +0gӞh1⑜ zmﭚ!,nۀ8'bUXەPH,p`|eA#5w2E,Ӝw[cጴd,c F0;+VƷ#B`?}p{qz7 5|6-ЙN ;d1=^4}Jdk$  9=Z*ė xkJk*$t8UF 6ʃNkߏ_i %*]v0e8Ilrq7'Hʘn*,ONM{? _o4O<,#~0I w$:,!^@H'~ vO0g#L$'Ac!Z((1P1Mu!*~jz(|KkΉuMoDkʻw/p{ד]˾NK3|ܓ }WE|ӂqw-Ÿ]XÞ~s~:m.܂ z(5-i>-h9Haߵp֓`}ų? Jv3q_:jNmPW,ힸyG?mۡ\Z;W'?2t +אq}N*{^n.%}P B}+}wXEZ^=Ždssr++>yV|Yd'C=h^ٮ`˸aUw0A*3+O|Q MjK_BVTw +3;sw=1_,II:3\ QY4CncRXB2@$λCtJ lrzGQ5uv2448H%xnN^,9WgfKOր?b,xV-{LKa2$/#*lkRU@z >_x5ZH 6dt% ?n/BK!f'RIdހ9Gp#nmբ_( >GCӯz][O-ؤm<:d`ֻvotkCreHBm0$ d2x,Yyֲ7uhԖR =E{~q}#7e ++ɒOzj:4>Msk, 4\8$s`oJ*jXȂ0ݰA>qyeVpcPh1Yjjvw~B76 +Irc4P$3<k [MՐͥ]u D<*H+VI+YЮ0zC[kVO-YلvIu3 WV_-SBЀ<`qZ??͓yݻ$ۉր>Ѣ??Kp+AF⧌#:ע |g,V><$l@E1J:qO(((Q@Q@FI9$ӆJuQEQERGY*A uhsd2#vuq_:wa$k+)wI FAһx_VNm*@OK[}QD[E;wLӌW^|3M-2ܑťXF=?f7vw@E}}~ZKxuS&f"DYI,${}TaHJ(Nsk$qVyw/m4tV h I*:7;1O AG +xD4% +?QxRZn{, +In sOL`P_xj-kڏo iyVy['Nkٓᗈ>oZ.!x&,I=A > +hP@N9{oR$xv dc/٣>/Oڙ +G8:kʈG&Oێw@_ k^ lMեݰKf0#Nx~VƤc9sݽkY#͋o̸Gӭ|ooFPVWxvr~b9=3۵~YEk0ٰl,Rwdo +̖t1\RA9WfZi6~⹴UQ8 |1F<`/ſe|KKdg,P@8i$g<4CJڤ Dk/-rpW}R5Ե}.-y2ch۵s'zׄ [F!fF$!bT0 '?ZKl#y7&쌩 0}A#_מ[Mknb%KqUO֦[,Ե('{8 D#I_TQڤ^I!!$ҐALJ85 -TtLK"9Wt#_qG|V!_i3/EiqcWvY +2cIQ@2XC 7ln'=:q~7_n4aL:}ko]7xjދ}X +x#$)U8-獅XBQ?J洝CZ`!ӵ+VXGJB6  9#2j]FCe铴rZ2[2(v`YpH#+/ VYad!cTyG99=SOOBa-&h'rbp +7E|]Μd*ŗw#Muiqm}1Ym1*K`2989&}Qx潼|"2䒹$EMjoISLdJxφ<6ho0·H$`H5:E !RH#q + gz Ob3| tҀ9wqe[}bXʁ3I0ry5'-̗+IYӠ8IzֆMOZ.nw e7lc{H-|XٙF1BUYݎA`d׿gKb➡ +|vF%?ᗁl)=K*bc'83c'&@sK@VbR +`sAT +ZI3Ƥ'QE|,']˰gҤؐ83>w?wq WRA~W_x~óX&H.%Xuep'k z_s'|+qm[BoTgb>ChG$G$a܍Gsy/ :f28@1אi:J {ps7 d֞kst_{ Y##iUS@hnՀ *96q}a1_,6ޫ`+Ҩ(((bҥPLÌIz2dFGl`-X(4=;p8IHĞ+@G3Ϯkn!X?Nk᷎4u%#w+@_j ΥxM{wFcB6q w/ĺ4M>[0 +qT<R+G@lAolB0FA#M{WI~g(NJdg%8 j^%"f +,}ps0=(w.v7Yv$cbk"l7n"@&P#=3_X@?\or@ S>f?Uf7MN{{F9F +kP+3$߳?geaw0P,[q]} _Xa" $ED-rsס@6tR{8cP۾TU>5@D"9( OsR@}qN +AKEQEQEQEQEhNhŬwp ӏJآ>SoKu,UX[t^fs}Lx>3|Ir#k{-If1%U#>ԋ qڀ?o?g?vײE6 H25 |^>xwPx [by~TrGEW_iwTgI˓O8 Cm~xZܤ_o9 +2@ +[;{@VjCY! O7*9FS |'^-!}ɭ, +>2OZҚFF4E~ξ*ݕaaf Ch~vVzgY&9ʄ=(n+<}jHԴ&xm@zZg׆t&L"\/$z}+> Zȧu p8<?οM^^{WEaRr0G\TQ`#jERV@RFz=kn_ aP{YʂI|qkIYCRSmizSy IQ0qdzP~/%I/.[,)$А1| lVZl 3y?1fw$4bʠ8M牡C+A0jz(_K e|"DvAS$w_:%Ä;.mVAPy~W7/ Ŗb!Kp˸`a8JZfVcj-?oG#xId,!$`ybJ@L;nFm ׌s:.v..6\V1FU G *XX΁hCqxþ PIU(ќ $A'F##~M|Eu?"uh +p[i#88~y/l 'ZEPE4 sN((*'RFJ REQEQE)9lS"$nn<[Yn|I.a3!#iq vk@[eg(1kN.Jcq6H' +vemḺ'hd`qL + n--KEG" F+ 4 i`RXRu(djILWCEyoxk +/!&:22ɯ ovͺn/!WϓCd+EqE1F离jܾƁQPmAH u:7^R)!եE )# ;=+ $gE>>z')OZ .I"}ɵqpN2 WƪTPT,1's:`zU(矈#fbo'*#.ʖ%=+>"| +~Kqፚ\H`8O  d䌜WDѫ'Ҁ?'4úLJXFZA)n<\.oOpZYAʐC+0}{_bhXbx*kY)=K.QrHpG~yu?jR-#/$ u9f<#޾VVRҿ"n5 n}&K)&_;*b(H%X9#M}S[ }6yk6ku7v!nG$ +B(=;SԒd9q0;Z郟 K{ + +( +*<1`Au%F \dԕ} a q܎(9Q6]@.Sn=F;f) HtvG O\u5Q +%QEI'uQERv +Gt 3K bC0:u QEQE3rۑO>(* 끚}RcZ((((ߟ%&hmP:uQER +Z(QM$fE01+O((-W?xkAmmu>(euNr+>?g -(ш0v;ko$? +j[1,YUX,ArPI!681/7gu?B66C2e!H\a+s`V*5P'hJrO?p^f'&V+c/[<?PQ@ ֖(1AZcng<ө01: +9(ih(((Tn@3dvHP֝@ +*V`q9OʮPEPEPEPE0 1ot((()~l}Qm̦o۴z*#E" i +ʬrӭ}qOkׄZ!%8p) `s_S+ּ9;}"G0pc=SɓX%3rO^_ +]GtF]IⴿxՉT7 }G ὇L( +(t*%',lTPwy!֧{E1HaGq)A.)h +( +(=N(n )Mt*YqǮy6DU@@nPE4FE: +NPEPEPMfUn;S(((ʬ[xQ@ H1(7{ԜRQX_ +ǭKUQ), 4 Cn`dtC!\5Ԁ> +) 35n$ 1@QEQETLXchN KGz*R #FjQEQEQEQEQQHʍ 63ǥ*7uQEQEQE(h`zv84((cr\p=j(AKEQE1e PP#J) gҖ7I9TS6\GZbB>֩c@s:3zP֝EQEQER`g4QEw(((((cI,2WR-Rb(()8KEQEGoEb +t=jJ9(]o'1m!3wb~ZI$m#639ZT2 JW dRK@TRhQҀ%8]0,{ԠP?_ 6[%ԅF׈g_6m\jU鲎p0s%< T=r~Ipo_Ɓ6ﵸǀڶw\$Ld޾WĽoZ4cV`qWĶZ)?K:#pMg\6ShU*9g# xSY;6/D܀?:h+89S-Q@Sn@O\S-VI$@(kc@((((M3[׽Xx2&%&Pl']C$gF>(QޟM'ҙY3^KEPEPEPEPGz)~b}@(9QEQERv(((e!ۿ?1֦Q,3uoAd }̚vC@#oljj(((S8Z*4  sRPEPEPEPEP4P袀 +( +( +( +( +)" +k0PXT3ES%s~t33H#5vqN( +BW-%(B|~AX[jzj$qހ)iN(o6㚒))h2dOZA@ EPEPEPH9- tQq'8@QP,XM@Q@Q@Q@Q@|Sh%&08#ud2;{D[S' n jݼwQyR 95n@Q@Tnr@ u(Ρ6lS>ʽk珋 -~%wqq"3G16$ppy9F~=єC OzPWf֌~'Oh.g(QJ3ֽ_|&raIx 8`sQojy$t̥ 2 8 5.{moM!9Jf:eމoBZpĞA\c־ܯbd2E aA95υ|U-mM9kYc \a)#=@R@ EPE5s: +:QE!RQ@Q@Q@ ,Ks +w II-7ZsN%|g9*(**@Q@9x*>4)tQ@Q@Q@S0 E4t4((h'#: +(RGz(y%#\'-Q@Q@Q@Sr@((n;S>{ZFed>7|:ЦiPTg֝EQEQEQE(()4)PE'zZ((P((i!FIށJS1GPEc +C959ba gOEP {PP{ӨqIERdNJL@)8QҀE1Y]C!OB:~b@9(((-QEQEQERQ@-P~lNsN:EAr1߯n+iZ`k.1ݴ)!d@ u|PjT{D{crprW'=̾X#oZY!'ܪ l~TC8W'OJ +^B  ׌xAk;pd-3@V T18Ƿz^=[Ś7ak̯6:NI Z(((((<(( +(((gsIS4(9!xǧj9;ۀ{{ +@Q@Q@Q@3sd$N_vGSn FX)8ܳ.Xmqh 4Q@Q@ 斘8$Ϛ}Q@T70YAqt1#@ +E:()ahҡ'G Vv>`9jj((tVĭ0; §(()2$`)ȁ G' ((AK@Q@Qh(#Ө(\} X (((WkT"NIU(XYulg iOZ}QEQEQEN q )P@ +SqQą}ri>TRIQRPEQH}QEE4C(QEQE*$L*23}Q@ 'RR@T3JO7n1S4uPEPTv ++* +(#(d|Av=]N*J2 AuNkvTh\_t6>mjAeq =bTą$0s_ce?=ؙ.& *8qwm=q=͛4#pu%@g?)9ž էSNb,vgnFӀrFsO}}fO7j=nnnr+ F56Q`r{~fUR2;-6=1_T~Η;tӂGlggހ>(#Z(@I1@ EPdgm](斀 +( +)~PEPM #Ҡi,;xac>4QES\)ފaU$1U&ISӿ#UQEQEQE 7[K , i ǯ^9QEQEQQI?֤(&y #?^3@EQEQMmz(WvbEQEQE! Z)#Z(((((iQv%QE?ȧQ@ )jF2#\czsSP(^(h((((-sEQEQQ!cˎN=ǭKEPG93v%N(4(((9ȷk`g@SS)h +( +CqKEFex(܀rM +t:WqO(d3ޟPp#x85.hh("b )S +O> +x4dg#o֧%aE>P9SXv?OX%PFpI 1PEPEP{Ө2M.X{+Rx@8#<8'z|uH`O[;N$$0'qkk/ʖ^oc,0Nz@BKWQ_JŒzc?]_BXFXr3W':7Ĭ"x9_ qhT7kU8ZmM:-ZDU{WG_&4nfp?ތ +9q@ M{zSr8!ԁJ:R@Q@ y)Q@Q@Q@Q@Q@4 өh64(((uQHs +ZFWe$th +( +)`: +( +( +(#7zTQEQEQEQEQERpE-F)Q@')cO?΀ P3Z$afJT@? +Zit[/#Ig[ZZ(hKE!O'IL*fEPEPI du-QE8 RE1QK$Ӈ<Z("݂{`Te =I@Q@Q@`jJWt5p?Gm+8^Szg2<1ڧ*T N5bQK@Q@Q@ +*q'֤.q3>((((*'`G:NP(4UAO + ɑG瓟ҤbAP;w8FbH['Ҁ's:OU.m-8Ig5gT +8 0Ak?_u_z$9\.6gy<Nk>[KXmGq6HR'VH/!$',9#GĞmVD DFgߒqTn: h?ѵyg2x u+|# +el _ĺgror, S #$@`եY[h܁`$d:ހ>~Sx~2h0yCsv(CV5ll:zY}Fk,s8`Ȝ~4f%^?_zl)"Ō 袪8o1Tr9$( +( +( +(2R3Ԗ97l9pqKI.~ +FCKak8RrCOOś{[hao"GRFldK=O:󙣖AfG 1 kce;hs$)pͿf@!NA ׼CamtԞ[b""^@c׹vmY\;ylF ܎O}o4wć(nn )c+, ~4roݰaד~xºlEu^B|Ajm|O1k}7Pm5c*- ԕe$)|aɨE[o8h.A,w{WLPI 4~dG U '89ڀ>ˢsk܋Xm@*0diǯ]U,&+(6= HҀ=>!x7Pe bդ P= ϷZ-"[[80$\E`A2d3 3ӿ qZ~bE_JQCOle<+teYI@EP9EQEQEQL$> +( +( +( +( +(8돥IE 0O>((((((((;qH:` +( +( +( +( +( +) uQEQEQESNHuQEQEQEQE((Q@5N{F݌_zpzZ*6p3HIE5N( +((h *rzqM9PEPG9(((((Aȥ((s:9=)QU\LIpbC'斀 +( +A3KM.{P(Z(˹JL* n5$󜓟Ҭ2zPZhqG͞1PH)rq€$R#V6[jmk"FdVB;?ݢ>fo̗s[Yf, ;@>+Ƶ_>}7Ể@˼. s~0FG?eg[2ǵ1vyƙ jW-bK˸ @5ӁW_ >+^|[p’?||N59K*n9` qБzgF-Wެɥ I,J'qIֽĿ{e;Kr[\ gh8< 3^mCDn"Lʒ;*pH /)KH?,c$8yַO{CIE7pB vӽf"TX$-$pq(:'CU|CcšEs\[X88;n}V09`2vgxfD&,^F*ʠ1n$ X\\I +( +*6#Ҥ((((((@Q@DCR?ҁRJ?֝EQ(99ǭII)h(((((o:)P)߭:)rI)3@((Ia֝LU*0IosORp--SW(nsS2:R-P((*%6vH%~Ƞ h((b*ڣvEQEQEQM EPEPEPEPEPEPEPEPEP^\a~1sREQEts@QB죭K@Q@Q@Q@ݱ}qJ84*=?I@Q@Q@ KETL4}5=BKVp>P03NVp2žn3遁Wh($zu%-QE?&:wzPEPEZZ( +((4QEQH3ސhQEQEQEQIb((S袀 +( +( +( +( +( +*!"L] ?K@Q@R`@ PG֟ES mlp@/ր$iQEWG13׏ZE\/&N&,QEQEQEp3J989QEQE%-PފniQE(j*u]Sl <8X +(()2@Q@SH4( u(hbKg5QEQE ~R09(hPҸ@NOSS\ls%̎ Mh+}pq)'U9?BhJXAzU=Q`fEQE.H!J(c${B >ju&08((F8* "IJ3rpG4bYʜO@ EPIKEThAJRPEPPJr򩨠i>?ʟEQEQEQE3 h( +(QEQEQE +(=8lqޝQ!ރ<J((eiS27l>{(QEQEQEQEQE +E0(Xu#֟UF]vg5fGZE;J2:@ʘg'=!`K@;ۅ-{ԴQ@Q@Q@4}jY(`Պ((((i F84PEPEPEPEPEP((((((((((#mSgԕRKTQ+3nڀ,1K1Wn@' g}Q@Q@Q@ 斁@zREQE7M1"=J(((9:(((F9袀 +( +(+(Qݾӏ((#Q@Q@((((ŸESOJugђ`OiQEQEy;S-b(((cڝ@Q@Q@G4QEQEQEQEQEQES@EQEQEQEQEQEQ@ QsZ}"QҖ +( +( +(? +endstream +endobj +214 0 obj +<< +/Length 6918 +/Filter /FlateDecode +/Length1 14180 +>> +stream +x; tǵ3V⿍`1X6 N+imm,i!G i܆~6 I!Ik8iB{i{ھ4ѓ6Ρӗ3+`rrN^w;3wB2kzu\G`ZO@ +~.&cyDO=P̭i Yvdփ6` /? h-_ 2)/#ĽW=gwـ4E$_ w~DykR@>*"tUfH Gfڐ ~HC`)̧oGߎf^k˟=oջV Ǐ7Mڟ>UtOo:fR|@+M q&1c93E[7P)ڥZr5l^P_W Q|YҊ%6qW/).*,͙f,faw 񊁸¾qc5%R" uƉMK0] ӕ9*!vw |>I +ovc +!z2rzK0x=t w:[qȚ\7;:8_)y=[:;ljG{8ϫ(nq屃9=P{]}q^'{V7;nPROlO`$<ئd)z1|,QD[ڗ:k#~ ZgE"ƶ>*%N`1 (Xcq-f;^urhs8n-KW+@cb'6MgrreӁ̬T@NQ6T GM"q#'}8Wh̳ǠQ70J a.ϱc"p[G$}R." qǫ˗OovwC9bTz`QTn+p!7t{eǑYL2טI,;@0nHSk㢏PwaPji#Ǘq jD]]J^յQovgY kb<ɚ<̚MȚ YkְfkZXca5(g$ԇ>Au7<#}5O <ΚXk:X5Y5k̬X\.h PAԳP@&P5ջ y|qmUa/ +0KN%VѺzZb-X9lk5jZ&+g(wsݽqwevz8}uq}=uK+~&1?wgId'3wSdV'Z¢ dF8%x ,@sN>cggav*DܞcV}kOp @}QNh Vrk)GPs&YPTud +nd*TɭmS>ùʿm>?Ln z_& 5@a>FЧ݁ +BnwhZLiit w;͝kf +w| sut̝D?%!-+ē\b?C/'v 8gR!e ck@s@Us8w71Y?PpQ.HH]zag7)A`o۱ I(pZ:)_L7GZ>K + +<{эfZni>0:AOc.GA;q ow>{ | +f3.o^~'/<ݼO?lh:lz536ǩ,,҄aƒ7kP16 U $4\ǨՎAyʌ. )-wPup0MH~/,*>ߦ}qU z^n'7} x %Uu.ȘBo$-Ӵڴƴt~t&X3rs4j>`~On-D_`EE8pYYkgEQ0i/ wFTFh1 G~#Bp@]c[jg9's&ڷ]Wېk-hj/+ΑZ6Ϝ1O _ =4Yiy%6{[ƷjKߗ[|\*nr .eiaE3g.)_fiBbYedaunN\q޻p[qtdsjj%gܼbe08IG[\qK]m1EP+⦆BPTHGM+*싅fټ_.ss3*1&Njuʦ,yY掬VoXUP?4o4 <֛*ҹ[gǪnN87'U~U 23-ed,%z?ذNVmGУkq+Jvvً ֘'eλ6 %^}z.G;/Xغ|Rۚ}=%]٣%K%tM' U;'[@I+nq 9SM<n K+.h\'ւ`),(.* }1`51E TuЇiz.,tDصܰ˄9 cwx¢k9^x >Wpn UnC[T\;V`zUC_ ZEWgL}M,~{O⫦?#$E,h[n|єWXd֥ "pgv>ѕ~ +9/g]% bɛ,!i%67 +q M4f>9>≩:t;tyo[;߹y/qSL`[s͐yLur=3g#KJ\VUCLfH]Y&ה'QөB$jsmBn-W0o41g<vrbV[>Q?(|?_7r|:Ki=2~[AM:!Rp(:lA hH%N7? 18[,}kogZSX Y>K4Z_a*uCuGM:lJ1t؂a7u؊* 8=/M -,~QQ8YN̔›WZJ2A)KU%3}kk-GS`DlWIE ֈ~q2䋄mrXޚ>YܩPYEVWtnM U@R+$zeH#ZZju5bVzV:!BPՔ!%(1+~*Qɣq#I U_j<A)=`L!FQUmH +*7@NQZBJ6dCQ(ThH(+,GDuPTLKH=#@Rq` J ʄWBYñpD0Ue2SҤOz,ÂA#:UKP &;DjDs%C@$$ϰ "yEa# s)fݐFtG8Fdp.h*~5z'J%nuT%襶}D=%H)(J^B<ّJ㏂GOt6Kj, +'(̤~yw$8'*Й G U"[&s7LdϰK +FIeJ HCwY[3~0xC <bMC:(j/ )@<CŢTD; bP)QzX= R jMQ ݖ%SN +VɜaI "j!c79Ȫ L?Q?+1V܈LeݫY:d"]{$M#1&k $y"B/G!dͰT;fIfaHVrDS<"MQ`Cdžh>8vABIj`<KZka#ƚںZ-`l6A1r@҆AI}U쀬"|aGt DIc!EZΑ1]1hQP}HvR+;G ޝI*h(' +%(5bl# Rb7rY/Ř*i'Ԭ%a'ʯx ai„`%ف3Dp*$ZbPD/)I #2QIī?[N38*#R:6JvS#'$ߠ_'^LTF iG$8>Qec::1BL&RHE + Q/@D^xk~ +p  ( upENW[ |QhC Ɔ´'C+x{s;0[=H#tRj + L{L"«S2U.}ETZԦc#uT,N!JQz 8s)]*T"0F9jyD|0ht̋tUO$"&{D`l<p1-:_[2)N$+Č!F-C?!U3|O?)ܒP&!JeՂL鋺((`2 \Y ְ%Da]$O:lTJ zUuIbG4I jZ:իY^=D#3X{F= ?ہJskXAjq@t{Zq22 kb[S ,F,-*$^.Pu!ސӡ($v$|ojҟ% o4#0钖`KtM*Lt2J5*Ԣɸ֝aM!MKuedr,NQgKNëk"uV#7e9Ajǐֈs\XwiL縤GW?ye͎xbvUuI)c Bro]/y[wֽ4SiK=ND +1F,ۥg=,(5#ܔ_?MYKVd6;>chq.ͅu &0DF:Qgŝ+$V-N&C)Cv %[Rs~CVDnZ5n~j~v9K}VR!:›-e5oĚgj#Nvw9~A_ N5E?Aݒv\_#_htDnNRj-|u}ד,Le~oHջsN^)P +ᾟ&$iJ?~NBb2yE$ $.ڒtT"㋭'|d`BGoКK;;KO+UITԄS%`5+l$qLmy=YþG*x@՟LI;@FL 5fՖD& 1"SC'.]Qy9VoX'5NUzePmgXӠ'mc}-nDkם(5jmENIԟSma{w0+$zxgYI/ٜJWA?8æ0. ?@= +endstream +endobj +215 0 obj +<< +/ListNumbering /Square +/O /List +>> +endobj +216 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +217 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +218 0 obj +<< +/ListNumbering /LowerAlpha +/O /List +>> +endobj +219 0 obj +<< +/ListNumbering /LowerAlpha +/O /List +>> +endobj +220 0 obj +<< +/BaseFont /UAQXCA+MyriadPro-Regular +/CIDSystemInfo 222 0 R +/DW 1000 +/FontDescriptor 223 0 R +/Subtype /CIDFontType0 +/Type /Font +/W [425 [658] +] +>> +endobj +221 0 obj +<< +/Length 231 +/Filter /FlateDecode +>> +stream +H\j0 ~ +Cq21aXpl%3,QC~:?[Ҽ4'8-B'Uy.v4QieJ86UU?E/;^+;dOnvc)Au {ftݧ ̿kܗalp8Ec BUVHAߨ߆]]OWNPvf> +endobj +223 0 obj +<< +/Ascent 952 +/CIDSet 224 0 R +/CapHeight 674 +/Descent -250 +/Flags 4 +/FontBBox [-157 -250 1126 952] +/FontFamily (Myriad Pro) +/FontFile3 225 0 R +/FontName /UAQXCA+MyriadPro-Regular +/FontStretch /Normal +/FontWeight 400 +/ItalicAngle 0 +/StemV 88 +/Type /FontDescriptor +/XHeight 484 +>> +endobj +224 0 obj +<< +/Length 15 +/Filter /FlateDecode +>> +stream +Hj` 8v +endstream +endobj +225 0 obj +<< +/Length 520 +/Filter /FlateDecode +/Subtype /CIDFontType0C +>> +stream +H|OhAgjv5bA]R{1?J5`,j,Ke۝k0MRW#DA APE Bj($"^>}= 2 ⹋ţgibǕFs`]Ye a,oz+Ôfp%a-y~ A |ߡPԭyf/yGSD^{Q%Yr;; d +endstream +endobj +226 0 obj +<< +/Length 597 +/ID [<20356CAF1EA8E546BE7E22ACA2CA4797> ] +/Info 8 0 R +/Root 1 0 R +/Type /XRef +/Size 227 +/Index [0 226] +/W [1 3 0] +/Filter /FlateDecode +>> +stream +x ]hu9f;i624Z 1@g۳gE7V,NCK9= GKqnƙ=c/_ uG}}ګZt:S+5 +mоKe=g=g=w:tD?|M_kvCjwгQ|MizSN?B_2/~?U\t ~}8aw~çdwu F5QgNk8i78Ym^fo'9Ήω #SĦ??[Ɖ=;mYb{fB̽Z&v3Z$va%vmV~&voT~"lP/o_޾^zktQDo}E(RZ 2m!M$Ud2I_)kj[e$%GnT'ڡ.r]#]iЙ +endstream +endobj +startxref +360498 +%%EOF diff --git "a/semestr-2/topo/FraMalCz\304\231\305\233\304\2071.pdf" "b/semestr-2/topo/FraMalCz\304\231\305\233\304\2071.pdf" new file mode 100644 index 0000000..1be118c Binary files /dev/null and "b/semestr-2/topo/FraMalCz\304\231\305\233\304\2071.pdf" differ diff --git "a/semestr-2/topo/FraMalCz\304\231\305\233\304\2072.pdf" "b/semestr-2/topo/FraMalCz\304\231\305\233\304\2072.pdf" new file mode 100644 index 0000000..4b52abf Binary files /dev/null and "b/semestr-2/topo/FraMalCz\304\231\305\233\304\2072.pdf" differ diff --git a/semestr-2/topo/Topologia2_Franciszek_Malinka.pdf b/semestr-2/topo/Topologia2_Franciszek_Malinka.pdf new file mode 100644 index 0000000..299d001 Binary files /dev/null and b/semestr-2/topo/Topologia2_Franciszek_Malinka.pdf differ diff --git a/semestr-2/topo/zad1a.jpg b/semestr-2/topo/zad1a.jpg new file mode 100644 index 0000000..062fa49 Binary files /dev/null and b/semestr-2/topo/zad1a.jpg differ diff --git a/semestr-2/topo/zad1aa.jpg b/semestr-2/topo/zad1aa.jpg new file mode 100644 index 0000000..7a56efb Binary files /dev/null and b/semestr-2/topo/zad1aa.jpg differ diff --git a/semestr-2/topo/zad1b.jpg b/semestr-2/topo/zad1b.jpg new file mode 100644 index 0000000..6cc23fa Binary files /dev/null and b/semestr-2/topo/zad1b.jpg differ diff --git a/semestr-2/topo/zad1c.jpg b/semestr-2/topo/zad1c.jpg new file mode 100644 index 0000000..62722b9 Binary files /dev/null and b/semestr-2/topo/zad1c.jpg differ diff --git a/semestr-2/topo/zad2a.jpg b/semestr-2/topo/zad2a.jpg new file mode 100644 index 0000000..d3c8cd4 Binary files /dev/null and b/semestr-2/topo/zad2a.jpg differ diff --git a/semestr-2/topo/zad2bc.jpg b/semestr-2/topo/zad2bc.jpg new file mode 100644 index 0000000..1feefd1 Binary files /dev/null and b/semestr-2/topo/zad2bc.jpg differ diff --git a/semestr-2/topo/zad2da.jpg b/semestr-2/topo/zad2da.jpg new file mode 100644 index 0000000..fad050d Binary files /dev/null and b/semestr-2/topo/zad2da.jpg differ diff --git a/semestr-2/topo/zad2db.jpg b/semestr-2/topo/zad2db.jpg new file mode 100644 index 0000000..ca8122c Binary files /dev/null and b/semestr-2/topo/zad2db.jpg differ diff --git a/semestr-2/topo/zad2dc.jpg b/semestr-2/topo/zad2dc.jpg new file mode 100644 index 0000000..bd8ee14 Binary files /dev/null and b/semestr-2/topo/zad2dc.jpg differ diff --git a/semestr-2/topo/zad2dd.jpg b/semestr-2/topo/zad2dd.jpg new file mode 100644 index 0000000..709e10c Binary files /dev/null and b/semestr-2/topo/zad2dd.jpg differ -- cgit v1.2.3