From 9b938f8c98d38ce21591a8110f7ac76a1ea38de1 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Thu, 24 May 2018 20:50:26 -0700 Subject: [PATCH 01/19] added a readme file --- Student/rdrovdahl/README.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Student/rdrovdahl/README.rst diff --git a/Student/rdrovdahl/README.rst b/Student/rdrovdahl/README.rst new file mode 100644 index 0000000..30e55a6 --- /dev/null +++ b/Student/rdrovdahl/README.rst @@ -0,0 +1 @@ +Python code for UWPCE-PythonCert class, written by Ryan Drovdahl From e250b9412bae76de7ccca3e76b7085bad7c71880 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Thu, 24 May 2018 20:54:32 -0700 Subject: [PATCH 02/19] Added lesson01 directory --- Student/rdrovdahl/lesson01/README.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Student/rdrovdahl/lesson01/README.rst diff --git a/Student/rdrovdahl/lesson01/README.rst b/Student/rdrovdahl/lesson01/README.rst new file mode 100644 index 0000000..30e55a6 --- /dev/null +++ b/Student/rdrovdahl/lesson01/README.rst @@ -0,0 +1 @@ +Python code for UWPCE-PythonCert class, written by Ryan Drovdahl From c90c1bdbf35e5f6f09d8f2d0faa46ca92d18fbdf Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Thu, 24 May 2018 20:58:28 -0700 Subject: [PATCH 03/19] added lesson01 assignments to repo --- Student/rdrovdahl/lesson01/featuresdf.csv | 101 ++++++++++++++++++ .../rdrovdahl/lesson01/generator_solution.py | 55 ++++++++++ Student/rdrovdahl/lesson01/iterator.py | 67 ++++++++++++ Student/rdrovdahl/lesson01/test_generator.py | 60 +++++++++++ Student/rdrovdahl/lesson01/top5.py | 20 ++++ 5 files changed, 303 insertions(+) create mode 100644 Student/rdrovdahl/lesson01/featuresdf.csv create mode 100644 Student/rdrovdahl/lesson01/generator_solution.py create mode 100644 Student/rdrovdahl/lesson01/iterator.py create mode 100644 Student/rdrovdahl/lesson01/test_generator.py create mode 100644 Student/rdrovdahl/lesson01/top5.py diff --git a/Student/rdrovdahl/lesson01/featuresdf.csv b/Student/rdrovdahl/lesson01/featuresdf.csv new file mode 100644 index 0000000..ece51ea --- /dev/null +++ b/Student/rdrovdahl/lesson01/featuresdf.csv @@ -0,0 +1,101 @@ +id,name,artists,danceability,energy,key,loudness,mode,speechiness,acousticness,instrumentalness,liveness,valence,tempo,duration_ms,time_signature +7qiZfU4dY1lWllzX7mPBI,Shape of You,Ed Sheeran,0.825,0.652,1.0,-3.183,0.0,0.0802,0.581,0.0,0.0931,0.931,95.977,233713.0,4.0 +5CtI0qwDJkDQGwXD1H1cL,Despacito - Remix,Luis Fonsi,0.694,0.815,2.0,-4.328,1.0,0.12,0.229,0.0,0.0924,0.813,88.931,228827.0,4.0 +4aWmUDTfIPGksMNLV2rQP,Despacito (Featuring Daddy Yankee),Luis Fonsi,0.66,0.786,2.0,-4.757,1.0,0.17,0.209,0.0,0.112,0.846,177.833,228200.0,4.0 +6RUKPb4LETWmmr3iAEQkt,Something Just Like This,The Chainsmokers,0.617,0.635,11.0,-6.769,0.0,0.0317,0.0498,1.44e-05,0.164,0.446,103.019,247160.0,4.0 +3DXncPQOG4VBw3QHh3S81,I'm the One,DJ Khaled,0.609,0.668,7.0,-4.284,1.0,0.0367,0.0552,0.0,0.167,0.811,80.924,288600.0,4.0 +7KXjTSCq5nL1LoYtL7XAw,HUMBLE.,Kendrick Lamar,0.904,0.611,1.0,-6.842,0.0,0.0888,0.000259,2.03e-05,0.0976,0.4,150.02,177000.0,4.0 +3eR23VReFzcdmS7TYCrhC,It Ain't Me (with Selena Gomez),Kygo,0.64,0.533,0.0,-6.596,1.0,0.0706,0.119,0.0,0.0864,0.515,99.968,220781.0,4.0 +3B54sVLJ402zGa6Xm4YGN,Unforgettable,French Montana,0.726,0.769,6.0,-5.043,1.0,0.123,0.0293,0.0101,0.104,0.733,97.985,233902.0,4.0 +0KKkJNfGyhkQ5aFogxQAP,That's What I Like,Bruno Mars,0.853,0.56,1.0,-4.961,1.0,0.0406,0.013,0.0,0.0944,0.86,134.066,206693.0,4.0 +3NdDpSvN911VPGivFlV5d,"I Don’t Wanna Live Forever (Fifty Shades Darker) - From ""Fifty Shades Darker (Original Motion Picture Soundtrack)""",ZAYN,0.735,0.451,0.0,-8.374,1.0,0.0585,0.0631,1.3e-05,0.325,0.0862,117.973,245200.0,4.0 +7GX5flRQZVHRAGd6B4TmD,XO TOUR Llif3,Lil Uzi Vert,0.732,0.75,11.0,-6.366,0.0,0.231,0.00264,0.0,0.109,0.401,155.096,182707.0,4.0 +72jbDTw1piOOj770jWNea,Paris,The Chainsmokers,0.653,0.658,2.0,-6.428,1.0,0.0304,0.0215,1.66e-06,0.0939,0.219,99.99,221507.0,4.0 +0dA2Mk56wEzDgegdC6R17,Stay (with Alessia Cara),Zedd,0.679,0.634,5.0,-5.024,0.0,0.0654,0.232,0.0,0.115,0.498,102.013,210091.0,4.0 +4iLqG9SeJSnt0cSPICSjx,Attention,Charlie Puth,0.774,0.626,3.0,-4.432,0.0,0.0432,0.0969,3.12e-05,0.0848,0.777,100.041,211475.0,4.0 +0VgkVdmE4gld66l8iyGjg,Mask Off,Future,0.833,0.434,2.0,-8.795,1.0,0.431,0.0102,0.0219,0.165,0.281,150.062,204600.0,4.0 +3a1lNhkSLSkpJE4MSHpDu,Congratulations,Post Malone,0.627,0.812,6.0,-4.215,1.0,0.0358,0.198,0.0,0.212,0.504,123.071,220293.0,4.0 +6kex4EBAj0WHXDKZMEJaa,Swalla (feat. Nicki Minaj & Ty Dolla $ign),Jason Derulo,0.696,0.817,1.0,-3.862,1.0,0.109,0.075,0.0,0.187,0.782,98.064,216409.0,4.0 +6PCUP3dWmTjcTtXY02oFd,Castle on the Hill,Ed Sheeran,0.461,0.834,2.0,-4.868,1.0,0.0989,0.0232,1.14e-05,0.14,0.471,135.007,261154.0,4.0 +5knuzwU65gJK7IF5yJsua,Rockabye (feat. Sean Paul & Anne-Marie),Clean Bandit,0.72,0.763,9.0,-4.068,0.0,0.0523,0.406,0.0,0.18,0.742,101.965,251088.0,4.0 +0CcQNd8CINkwQfe1RDtGV,Believer,Imagine Dragons,0.779,0.787,10.0,-4.305,0.0,0.108,0.0524,0.0,0.14,0.708,124.982,204347.0,4.0 +2rb5MvYT7ZIxbKW5hfcHx,Mi Gente,J Balvin,0.543,0.677,11.0,-4.915,0.0,0.0993,0.0148,6.21e-06,0.13,0.294,103.809,189440.0,4.0 +0tKcYR2II1VCQWT79i5Nr,Thunder,Imagine Dragons,0.6,0.81,0.0,-4.749,1.0,0.0479,0.00683,0.21,0.155,0.298,167.88,187147.0,4.0 +5uCax9HTNlzGybIStD3vD,Say You Won't Let Go,James Arthur,0.358,0.557,10.0,-7.398,1.0,0.059,0.695,0.0,0.0902,0.494,85.043,211467.0,4.0 +79cuOz3SPQTuFrp8WgftA,There's Nothing Holdin' Me Back,Shawn Mendes,0.857,0.8,2.0,-4.035,1.0,0.0583,0.381,0.0,0.0913,0.966,121.996,199440.0,4.0 +6De0lHrwBfPfrhorm9q1X,Me Rehúso,Danny Ocean,0.744,0.804,1.0,-6.327,1.0,0.0677,0.0231,0.0,0.0494,0.426,104.823,205715.0,4.0 +6D0b04NJIKfEMg040WioJ,Issues,Julia Michaels,0.706,0.427,8.0,-6.864,1.0,0.0879,0.413,0.0,0.0609,0.42,113.804,176320.0,4.0 +0afhq8XCExXpqazXczTSv,Galway Girl,Ed Sheeran,0.624,0.876,9.0,-3.374,1.0,0.1,0.0735,0.0,0.327,0.781,99.943,170827.0,4.0 +3ebXMykcMXOcLeJ9xZ17X,Scared to Be Lonely,Martin Garrix,0.584,0.54,1.0,-7.786,0.0,0.0576,0.0895,0.0,0.261,0.195,137.972,220883.0,4.0 +7BKLCZ1jbUBVqRi2FVlTV,Closer,The Chainsmokers,0.748,0.524,8.0,-5.599,1.0,0.0338,0.414,0.0,0.111,0.661,95.01,244960.0,4.0 +1x5sYLZiu9r5E43kMlt9f,Symphony (feat. Zara Larsson),Clean Bandit,0.707,0.629,0.0,-4.581,0.0,0.0563,0.259,1.6e-05,0.138,0.457,122.863,212459.0,4.0 +5GXAXm5YOmYT0kL5jHvYB,I Feel It Coming,The Weeknd,0.768,0.813,0.0,-5.94,0.0,0.128,0.427,0.0,0.102,0.579,92.994,269187.0,4.0 +5aAx2yezTd8zXrkmtKl66,Starboy,The Weeknd,0.681,0.594,7.0,-7.028,1.0,0.282,0.165,3.49e-06,0.134,0.535,186.054,230453.0,4.0 +1OAh8uOEOvTDqkKFsKksC,Wild Thoughts,DJ Khaled,0.671,0.672,0.0,-3.094,0.0,0.0688,0.0329,0.0,0.118,0.632,97.98,204173.0,4.0 +7tr2za8SQg2CI8EDgrdtN,Slide,Calvin Harris,0.736,0.795,1.0,-3.299,0.0,0.0545,0.498,1.21e-06,0.254,0.511,104.066,230813.0,4.0 +2ekn2ttSfGqwhhate0LSR,New Rules,Dua Lipa,0.771,0.696,9.0,-6.258,0.0,0.0755,0.00256,9.71e-06,0.179,0.656,116.054,208827.0,4.0 +5tz69p7tJuGPeMGwNTxYu,1-800-273-8255,Logic,0.629,0.572,5.0,-7.733,0.0,0.0387,0.57,0.0,0.192,0.386,100.015,250173.0,4.0 +7hDc8b7IXETo14hHIHdnh,Passionfruit,Drake,0.809,0.463,11.0,-11.377,1.0,0.0396,0.256,0.085,0.109,0.364,111.98,298941.0,4.0 +7wGoVu4Dady5GV0Sv4UIs,rockstar,Post Malone,0.577,0.522,5.0,-6.594,0.0,0.0984,0.13,9.03e-05,0.142,0.119,159.772,218320.0,4.0 +6EpRaXYhGOB3fj4V2uDkM,Strip That Down,Liam Payne,0.869,0.485,6.0,-5.595,1.0,0.0545,0.246,0.0,0.0765,0.527,106.028,204502.0,4.0 +3A7qX2QjDlPnazUsRk5y0,2U (feat. Justin Bieber),David Guetta,0.548,0.65,8.0,-5.827,0.0,0.0591,0.219,0.0,0.225,0.557,144.937,194897.0,4.0 +0tgVpDi06FyKpA1z0VMD4,Perfect,Ed Sheeran,0.599,0.448,8.0,-6.312,1.0,0.0232,0.163,0.0,0.106,0.168,95.05,263400.0,3.0 +78rIJddV4X0HkNAInEcYd,Call On Me - Ryan Riback Extended Remix,Starley,0.676,0.843,0.0,-4.068,1.0,0.0367,0.0623,0.000752,0.181,0.718,105.003,222041.0,4.0 +5bcTCxgc7xVfSaMV3RuVk,Feels,Calvin Harris,0.893,0.745,11.0,-3.105,0.0,0.0571,0.0642,0.0,0.0943,0.872,101.018,223413.0,4.0 +0NiXXAI876aGImAd6rTj8,Mama,Jonas Blue,0.746,0.793,11.0,-4.209,0.0,0.0412,0.11,0.0,0.0528,0.557,104.027,181615.0,4.0 +0qYTZCo5Bwh1nsUFGZP3z,Felices los 4,Maluma,0.755,0.789,5.0,-4.502,1.0,0.146,0.231,0.0,0.351,0.737,93.973,229849.0,4.0 +2EEeOnHehOozLq4aS0n6S,iSpy (feat. Lil Yachty),KYLE,0.746,0.653,7.0,-6.745,1.0,0.289,0.378,0.0,0.229,0.672,75.016,253107.0,4.0 +152lZdxL1OR0ZMW6KquMi,Location,Khalid,0.736,0.449,1.0,-11.462,0.0,0.425,0.33,0.000162,0.0898,0.326,80.126,219080.0,4.0 +6mICuAdrwEjh6Y6lroV2K,Chantaje,Shakira,0.852,0.773,8.0,-2.921,0.0,0.0776,0.187,3.05e-05,0.159,0.907,102.034,195840.0,4.0 +4Km5HrUvYTaSUfiSGPJeQ,Bad and Boujee (feat. Lil Uzi Vert),Migos,0.927,0.665,11.0,-5.313,1.0,0.244,0.061,0.0,0.123,0.175,127.076,343150.0,4.0 +0ofbQMrRDsUaVKq2mGLEA,Havana,Camila Cabello,0.768,0.517,7.0,-4.323,0.0,0.0312,0.186,3.8e-05,0.104,0.418,104.992,216897.0,4.0 +6HUnnBwYZqcED1eQztxMB,Solo Dance,Martin Jensen,0.744,0.836,6.0,-2.396,0.0,0.0507,0.0435,0.0,0.194,0.36,114.965,174933.0,4.0 +343YBumqHu19cGoGARUTs,Fake Love,Drake,0.927,0.488,9.0,-9.433,0.0,0.42,0.108,0.0,0.196,0.605,133.987,210937.0,4.0 +4pdPtRcBmOSQDlJ3Fk945,Let Me Love You,DJ Snake,0.476,0.718,8.0,-5.309,1.0,0.0576,0.0784,1.02e-05,0.122,0.142,199.864,205947.0,4.0 +3PEgB3fkiojxms35ntsTg,More Than You Know,Axwell /\ Ingrosso,0.644,0.743,5.0,-5.002,0.0,0.0355,0.034,0.0,0.257,0.544,123.074,203000.0,4.0 +1xznGGDReH1oQq0xzbwXa,One Dance,Drake,0.791,0.619,1.0,-5.886,1.0,0.0532,0.00784,0.00423,0.351,0.371,103.989,173987.0,4.0 +7nKBxz47S9SD79N086fuh,SUBEME LA RADIO,Enrique Iglesias,0.684,0.823,9.0,-3.297,0.0,0.0773,0.0744,0.0,0.111,0.647,91.048,208163.0,4.0 +1NDxZ7cFAo481dtYWdrUn,Pretty Girl - Cheat Codes X CADE Remix,Maggie Lindemann,0.703,0.868,7.0,-4.661,0.0,0.0291,0.15,0.132,0.104,0.733,121.03,193613.0,4.0 +3m660poUr1chesgkkjQM7,Sorry Not Sorry,Demi Lovato,0.704,0.633,11.0,-6.923,0.0,0.241,0.0214,0.0,0.29,0.863,144.021,203760.0,4.0 +3kxfsdsCpFgN412fpnW85,Redbone,Childish Gambino,0.743,0.359,1.0,-10.401,1.0,0.0794,0.199,0.00611,0.137,0.587,160.083,326933.0,4.0 +6b8Be6ljOzmkOmFslEb23,24K Magic,Bruno Mars,0.818,0.803,1.0,-4.282,1.0,0.0797,0.034,0.0,0.153,0.632,106.97,225983.0,4.0 +6HZILIRieu8S0iqY8kIKh,DNA.,Kendrick Lamar,0.637,0.514,1.0,-6.763,1.0,0.365,0.0047,0.0,0.094,0.402,139.931,185947.0,4.0 +3umS4y3uQDkqekNjVpiRU,El Amante,Nicky Jam,0.683,0.691,8.0,-5.535,1.0,0.0432,0.243,0.0,0.14,0.732,179.91,219507.0,4.0 +00lNx0OcTJrS3MKHcB80H,You Don't Know Me - Radio Edit,Jax Jones,0.876,0.669,11.0,-6.054,0.0,0.138,0.163,0.0,0.185,0.682,124.007,213947.0,4.0 +6520aj0B4FSKGVuKNsOCO,Chained To The Rhythm,Katy Perry,0.448,0.801,0.0,-5.363,1.0,0.165,0.0733,0.0,0.146,0.462,189.798,237734.0,4.0 +1louJpMmzEicAn7lzDalP,No Promises (feat. Demi Lovato),Cheat Codes,0.741,0.667,10.0,-5.445,1.0,0.134,0.0575,0.0,0.106,0.595,112.956,223504.0,4.0 +2QbFClFyhMMtiurUjuQlA,Don't Wanna Know (feat. Kendrick Lamar),Maroon 5,0.775,0.617,7.0,-6.166,1.0,0.0701,0.341,0.0,0.0985,0.485,100.048,214265.0,4.0 +5hYTyyh2odQKphUbMqc5g,"How Far I'll Go - From ""Moana""",Alessia Cara,0.314,0.555,9.0,-9.601,1.0,0.37,0.157,0.000108,0.067,0.159,179.666,175517.0,4.0 +38yBBH2jacvDxrznF7h08,Slow Hands,Niall Horan,0.734,0.418,0.0,-6.678,1.0,0.0425,0.0129,0.0,0.0579,0.868,85.909,188174.0,4.0 +2cnKEkpVUSV4wnjQiTWfH,Escápate Conmigo,Wisin,0.747,0.864,8.0,-3.181,0.0,0.0599,0.0245,4.46e-05,0.0853,0.754,92.028,232787.0,4.0 +0SGkqnVQo9KPytSri1H6c,Bounce Back,Big Sean,0.77,0.567,2.0,-5.698,1.0,0.175,0.105,0.0,0.125,0.26,81.477,222360.0,4.0 +5Ohxk2dO5COHF1krpoPig,Sign of the Times,Harry Styles,0.516,0.595,5.0,-4.63,1.0,0.0313,0.0275,0.0,0.109,0.222,119.972,340707.0,4.0 +6gBFPUFcJLzWGx4lenP6h,goosebumps,Travis Scott,0.841,0.728,7.0,-3.37,1.0,0.0484,0.0847,0.0,0.149,0.43,130.049,243837.0,4.0 +5Z3GHaZ6ec9bsiI5Benrb,Young Dumb & Broke,Khalid,0.798,0.539,1.0,-6.351,1.0,0.0421,0.199,1.66e-05,0.165,0.394,136.949,202547.0,4.0 +6jA8HL9i4QGzsj6fjoxp8,There for You,Martin Garrix,0.611,0.644,6.0,-7.607,0.0,0.0553,0.124,0.0,0.124,0.13,105.969,221904.0,4.0 +21TdkDRXuAB3k90ujRU1e,Cold (feat. Future),Maroon 5,0.697,0.716,9.0,-6.288,0.0,0.113,0.118,0.0,0.0424,0.506,99.905,234308.0,4.0 +7vGuf3Y35N4wmASOKLUVV,Silence,Marshmello,0.52,0.761,4.0,-3.093,1.0,0.0853,0.256,4.96e-06,0.17,0.286,141.971,180823.0,4.0 +1mXVgsBdtIVeCLJnSnmtd,Too Good At Goodbyes,Sam Smith,0.698,0.375,5.0,-8.279,1.0,0.0491,0.652,0.0,0.173,0.534,91.92,201000.0,4.0 +3EmmCZoqpWOTY1g2GBwJo,Just Hold On,Steve Aoki,0.647,0.932,11.0,-3.515,1.0,0.0824,0.00383,1.5e-06,0.0574,0.374,114.991,198774.0,4.0 +6uFsE1JgZ20EXyU0JQZbU,Look What You Made Me Do,Taylor Swift,0.773,0.68,9.0,-6.378,0.0,0.141,0.213,1.57e-05,0.122,0.497,128.062,211859.0,4.0 +0CokSRCu5hZgPxcZBaEzV,Glorious (feat. Skylar Grey),Macklemore,0.731,0.794,0.0,-5.126,0.0,0.0522,0.0323,2.59e-05,0.112,0.356,139.994,220454.0,4.0 +6875MeXyCW0wLyT72Eetm,Starving,Hailee Steinfeld,0.721,0.626,4.0,-4.2,1.0,0.123,0.402,0.0,0.102,0.558,99.914,181933.0,4.0 +3AEZUABDXNtecAOSC1qTf,Reggaetón Lento (Bailemos),CNCO,0.761,0.838,4.0,-3.073,0.0,0.0502,0.4,0.0,0.176,0.71,93.974,222560.0,4.0 +3E2Zh20GDCR9B1EYjfXWy,Weak,AJR,0.673,0.637,5.0,-4.518,1.0,0.0429,0.137,0.0,0.184,0.678,123.98,201160.0,4.0 +4pLwZjInHj3SimIyN9SnO,Side To Side,Ariana Grande,0.648,0.738,6.0,-5.883,0.0,0.247,0.0408,0.0,0.292,0.603,159.145,226160.0,4.0 +3QwBODjSEzelZyVjxPOHd,Otra Vez (feat. J Balvin),Zion & Lennox,0.832,0.772,10.0,-5.429,1.0,0.1,0.0559,0.000486,0.44,0.704,96.016,209453.0,4.0 +1wjzFQodRWrPcQ0AnYnvQ,I Like Me Better,Lauv,0.752,0.505,9.0,-7.621,1.0,0.253,0.535,2.55e-06,0.104,0.419,91.97,197437.0,4.0 +04DwTuZ2VBdJCCC5TROn7,In the Name of Love,Martin Garrix,0.49,0.485,4.0,-6.237,0.0,0.0406,0.0592,0.0,0.337,0.196,133.889,195840.0,4.0 +6DNtNfH8hXkqOX1sjqmI7,Cold Water (feat. Justin Bieber & MØ),Major Lazer,0.608,0.798,6.0,-5.092,0.0,0.0432,0.0736,0.0,0.156,0.501,92.943,185352.0,4.0 +1UZOjK1BwmwWU14Erba9C,Malibu,Miley Cyrus,0.573,0.781,8.0,-6.406,1.0,0.0555,0.0767,2.64e-05,0.0813,0.343,139.934,231907.0,4.0 +4b4KcovePX8Ke2cLIQTLM,All Night,The Vamps,0.544,0.809,8.0,-5.098,1.0,0.0363,0.0038,0.0,0.323,0.448,145.017,197640.0,4.0 +1a5Yu5L18qNxVhXx38njO,Hear Me Now,Alok,0.789,0.442,11.0,-7.844,1.0,0.0421,0.586,0.00366,0.0927,0.45,121.971,192846.0,4.0 +4c2W3VKsOFoIg2SFaO6DY,Your Song,Rita Ora,0.855,0.624,1.0,-4.093,1.0,0.0488,0.158,0.0,0.0513,0.962,117.959,180757.0,4.0 +22eADXu8DfOAUEDw4vU8q,Ahora Dice,Chris Jeday,0.708,0.693,6.0,-5.516,1.0,0.138,0.246,0.0,0.129,0.427,143.965,271080.0,4.0 +7nZmah2llfvLDiUjm0kiy,Friends (with BloodPop®),Justin Bieber,0.744,0.739,8.0,-5.35,1.0,0.0387,0.00459,0.0,0.306,0.649,104.99,189467.0,4.0 +2fQrGHiQOvpL9UgPvtYy6,Bank Account,21 Savage,0.884,0.346,8.0,-8.228,0.0,0.351,0.0151,7.04e-06,0.0871,0.376,75.016,220307.0,4.0 +1PSBzsahR2AKwLJgx8ehB,Bad Things (with Camila Cabello),Machine Gun Kelly,0.675,0.69,2.0,-4.761,1.0,0.132,0.21,0.0,0.287,0.272,137.817,239293.0,4.0 +0QsvXIfqM0zZoerQfsI9l,Don't Let Me Down,The Chainsmokers,0.542,0.859,11.0,-5.651,1.0,0.197,0.16,0.00466,0.137,0.403,159.797,208053.0,4.0 +7mldq42yDuxiUNn08nvzH,Body Like A Back Road,Sam Hunt,0.731,0.469,5.0,-7.226,1.0,0.0326,0.463,1.04e-06,0.103,0.631,98.963,165387.0,4.0 +7i2DJ88J7jQ8K7zqFX2fW,Now Or Never,Halsey,0.658,0.588,6.0,-4.902,0.0,0.0367,0.105,1.28e-06,0.125,0.434,110.075,214802.0,4.0 +1j4kHkkpqZRBwE0A4CN4Y,Dusk Till Dawn - Radio Edit,ZAYN,0.258,0.437,11.0,-6.593,0.0,0.039,0.101,1.27e-06,0.106,0.0967,180.043,239000.0,4.0 diff --git a/Student/rdrovdahl/lesson01/generator_solution.py b/Student/rdrovdahl/lesson01/generator_solution.py new file mode 100644 index 0000000..21b3eec --- /dev/null +++ b/Student/rdrovdahl/lesson01/generator_solution.py @@ -0,0 +1,55 @@ +#! /usr/local/bin/python3 + + +''' +A few simple generators +''' + + +def intsum(): + 'generator to keep adding the next integer' + i = 0 + current_value = 0 + while True: + yield current_value + i += 1 + current_value += i + + +def intsum2(): + 'generator to keep adding the next integer' + i = 0 + current_value = 0 + while True: + yield current_value + i += 1 + current_value += i + + +def doubler(): + 'generator to keep doubling the value' + current_value = 1 + while True: + yield current_value + current_value *= 2 + + +def fib(): + 'finonacci series generator' + a = 1 + b = 1 + while True: + yield a + a, b = b, a + b + + +def prime(): + 'generate all prime numbers between 2-100' + while True: + for i in range(2, 101): + prime = True + for x in range(2, i): + if i % x == 0: + prime = False + if prime is True: + yield i diff --git a/Student/rdrovdahl/lesson01/iterator.py b/Student/rdrovdahl/lesson01/iterator.py new file mode 100644 index 0000000..bbf712b --- /dev/null +++ b/Student/rdrovdahl/lesson01/iterator.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +""" +Simple iterator examples +""" + + +class IterateMe_1: + """ + About as simple an iterator as you can get: + + returns the sequence of numbers from zero to 4 + ( like range(4) ) + """ + + def __init__(self, stop=5): + self.current = -1 + self.stop = stop + + def __iter__(self): + return self + + def __next__(self): + self.current += 1 + if self.current < self.stop: + return self.current + else: + raise StopIteration + + +class InterateMe_2: + ''' + Adjusting iterator to behave more like the range() function by adding + start, stop, and step arguments + ''' + + def __init__(self, start, stop, step=1): + self.current = start - step + self.start = start + self.stop = stop + self.step = step + + def __iter__(self): + return self + + def __next__(self): + self.current += self.step + if self.current < self.stop: + return self.current + else: + raise StopIteration + + +if __name__ == "__main__": + + print("Testing the iterator") + for i in IterateMe_1(): + print(i) + + print('Testing interator#2') + it = InterateMe_2(2, 20, 2) + for i in it: + if i > 10: + break + print(i) + for i in it: + print(i) diff --git a/Student/rdrovdahl/lesson01/test_generator.py b/Student/rdrovdahl/lesson01/test_generator.py new file mode 100644 index 0000000..28f731d --- /dev/null +++ b/Student/rdrovdahl/lesson01/test_generator.py @@ -0,0 +1,60 @@ +""" +test_generator.py + +tests the solution to the generator lab + +can be run with py.test or nosetests +""" + +import generator_solution as gen + + +def test_intsum(): + + g = gen.intsum() + + assert next(g) == 0 + assert next(g) == 1 + assert next(g) == 3 + assert next(g) == 6 + assert next(g) == 10 + assert next(g) == 15 + + +def test_intsum2(): + + g = gen.intsum2() + + assert next(g) == 0 + assert next(g) == 1 + assert next(g) == 3 + assert next(g) == 6 + assert next(g) == 10 + assert next(g) == 15 + + +def test_doubler(): + + g = gen.doubler() + + assert next(g) == 1 + assert next(g) == 2 + assert next(g) == 4 + assert next(g) == 8 + assert next(g) == 16 + assert next(g) == 32 + + for i in range(10): + j = next(g) + assert j == 2**15 + + +def test_fib(): + g = gen.fib() + assert [next(g) for i in range(9)] == [1, 1, 2, 3, 5, 8, 13, 21, 34] + + +def test_prime(): + g = gen.prime() + for val in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]: + assert next(g) == val diff --git a/Student/rdrovdahl/lesson01/top5.py b/Student/rdrovdahl/lesson01/top5.py new file mode 100644 index 0000000..8217448 --- /dev/null +++ b/Student/rdrovdahl/lesson01/top5.py @@ -0,0 +1,20 @@ +#! /usr/local/bin/python3 + + +''' +use pandas to scrub top 100 csv file and find songs with with danceability +scores over 0.8 and loundess scores under -5.0 +''' + +import pandas as pd + +music = pd.read_csv("featuresdf.csv") + +l1 = [(b,a,c,d) for a,b,c,d in zip(music.name, music.artists, music.danceability, music.loudness) if c > 0.8 and d < -5.0] +l2 = sorted(l1, key=lambda danceability: danceability[2], reverse=True) + +print('\n\nTop 5 - Quiet Dance Songs\n Sorted by Danceability:') + +for c, line in enumerate(l2, 1): + if c <= 5: + print(c, line[0] + ' --> ' + line[1]) From eef5e2cefdfcc2ba4b94fc64bbd83bbed14fdc90 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Mon, 28 May 2018 13:40:02 -0700 Subject: [PATCH 04/19] adding assignment #2 files to repo --- .../lesson02/favorite_tracks_generator.py | 34 ++++++ Student/rdrovdahl/lesson02/featuresdf.csv | 101 ++++++++++++++++++ .../lesson02/high_engergy_tracks_closure.py | 22 ++++ 3 files changed, 157 insertions(+) create mode 100644 Student/rdrovdahl/lesson02/favorite_tracks_generator.py create mode 100644 Student/rdrovdahl/lesson02/featuresdf.csv create mode 100644 Student/rdrovdahl/lesson02/high_engergy_tracks_closure.py diff --git a/Student/rdrovdahl/lesson02/favorite_tracks_generator.py b/Student/rdrovdahl/lesson02/favorite_tracks_generator.py new file mode 100644 index 0000000..604bce5 --- /dev/null +++ b/Student/rdrovdahl/lesson02/favorite_tracks_generator.py @@ -0,0 +1,34 @@ +#! /usr/local/bin/python3 + + +''' +Write a generator to find and print all of your favorite tracks from the data +set. +''' + +import pandas as pd + +music = pd.read_csv("featuresdf.csv") + + +def fav_finder(artist): + 'generator to iterate over data set and return tracks from artist' + i = 0 + max = (len(music)-1) + while True: + if music.loc[i].artists == artist: + yield music.loc[i].artists, music.loc[i]['name'] + if i < max: + i += 1 + else: + break + + +fav = fav_finder('Imagine Dragons') + +while True: + try: + x = next(fav) + print(x[0], ' -- ', x[1]) + except StopIteration: + break diff --git a/Student/rdrovdahl/lesson02/featuresdf.csv b/Student/rdrovdahl/lesson02/featuresdf.csv new file mode 100644 index 0000000..ece51ea --- /dev/null +++ b/Student/rdrovdahl/lesson02/featuresdf.csv @@ -0,0 +1,101 @@ +id,name,artists,danceability,energy,key,loudness,mode,speechiness,acousticness,instrumentalness,liveness,valence,tempo,duration_ms,time_signature +7qiZfU4dY1lWllzX7mPBI,Shape of You,Ed Sheeran,0.825,0.652,1.0,-3.183,0.0,0.0802,0.581,0.0,0.0931,0.931,95.977,233713.0,4.0 +5CtI0qwDJkDQGwXD1H1cL,Despacito - Remix,Luis Fonsi,0.694,0.815,2.0,-4.328,1.0,0.12,0.229,0.0,0.0924,0.813,88.931,228827.0,4.0 +4aWmUDTfIPGksMNLV2rQP,Despacito (Featuring Daddy Yankee),Luis Fonsi,0.66,0.786,2.0,-4.757,1.0,0.17,0.209,0.0,0.112,0.846,177.833,228200.0,4.0 +6RUKPb4LETWmmr3iAEQkt,Something Just Like This,The Chainsmokers,0.617,0.635,11.0,-6.769,0.0,0.0317,0.0498,1.44e-05,0.164,0.446,103.019,247160.0,4.0 +3DXncPQOG4VBw3QHh3S81,I'm the One,DJ Khaled,0.609,0.668,7.0,-4.284,1.0,0.0367,0.0552,0.0,0.167,0.811,80.924,288600.0,4.0 +7KXjTSCq5nL1LoYtL7XAw,HUMBLE.,Kendrick Lamar,0.904,0.611,1.0,-6.842,0.0,0.0888,0.000259,2.03e-05,0.0976,0.4,150.02,177000.0,4.0 +3eR23VReFzcdmS7TYCrhC,It Ain't Me (with Selena Gomez),Kygo,0.64,0.533,0.0,-6.596,1.0,0.0706,0.119,0.0,0.0864,0.515,99.968,220781.0,4.0 +3B54sVLJ402zGa6Xm4YGN,Unforgettable,French Montana,0.726,0.769,6.0,-5.043,1.0,0.123,0.0293,0.0101,0.104,0.733,97.985,233902.0,4.0 +0KKkJNfGyhkQ5aFogxQAP,That's What I Like,Bruno Mars,0.853,0.56,1.0,-4.961,1.0,0.0406,0.013,0.0,0.0944,0.86,134.066,206693.0,4.0 +3NdDpSvN911VPGivFlV5d,"I Don’t Wanna Live Forever (Fifty Shades Darker) - From ""Fifty Shades Darker (Original Motion Picture Soundtrack)""",ZAYN,0.735,0.451,0.0,-8.374,1.0,0.0585,0.0631,1.3e-05,0.325,0.0862,117.973,245200.0,4.0 +7GX5flRQZVHRAGd6B4TmD,XO TOUR Llif3,Lil Uzi Vert,0.732,0.75,11.0,-6.366,0.0,0.231,0.00264,0.0,0.109,0.401,155.096,182707.0,4.0 +72jbDTw1piOOj770jWNea,Paris,The Chainsmokers,0.653,0.658,2.0,-6.428,1.0,0.0304,0.0215,1.66e-06,0.0939,0.219,99.99,221507.0,4.0 +0dA2Mk56wEzDgegdC6R17,Stay (with Alessia Cara),Zedd,0.679,0.634,5.0,-5.024,0.0,0.0654,0.232,0.0,0.115,0.498,102.013,210091.0,4.0 +4iLqG9SeJSnt0cSPICSjx,Attention,Charlie Puth,0.774,0.626,3.0,-4.432,0.0,0.0432,0.0969,3.12e-05,0.0848,0.777,100.041,211475.0,4.0 +0VgkVdmE4gld66l8iyGjg,Mask Off,Future,0.833,0.434,2.0,-8.795,1.0,0.431,0.0102,0.0219,0.165,0.281,150.062,204600.0,4.0 +3a1lNhkSLSkpJE4MSHpDu,Congratulations,Post Malone,0.627,0.812,6.0,-4.215,1.0,0.0358,0.198,0.0,0.212,0.504,123.071,220293.0,4.0 +6kex4EBAj0WHXDKZMEJaa,Swalla (feat. Nicki Minaj & Ty Dolla $ign),Jason Derulo,0.696,0.817,1.0,-3.862,1.0,0.109,0.075,0.0,0.187,0.782,98.064,216409.0,4.0 +6PCUP3dWmTjcTtXY02oFd,Castle on the Hill,Ed Sheeran,0.461,0.834,2.0,-4.868,1.0,0.0989,0.0232,1.14e-05,0.14,0.471,135.007,261154.0,4.0 +5knuzwU65gJK7IF5yJsua,Rockabye (feat. Sean Paul & Anne-Marie),Clean Bandit,0.72,0.763,9.0,-4.068,0.0,0.0523,0.406,0.0,0.18,0.742,101.965,251088.0,4.0 +0CcQNd8CINkwQfe1RDtGV,Believer,Imagine Dragons,0.779,0.787,10.0,-4.305,0.0,0.108,0.0524,0.0,0.14,0.708,124.982,204347.0,4.0 +2rb5MvYT7ZIxbKW5hfcHx,Mi Gente,J Balvin,0.543,0.677,11.0,-4.915,0.0,0.0993,0.0148,6.21e-06,0.13,0.294,103.809,189440.0,4.0 +0tKcYR2II1VCQWT79i5Nr,Thunder,Imagine Dragons,0.6,0.81,0.0,-4.749,1.0,0.0479,0.00683,0.21,0.155,0.298,167.88,187147.0,4.0 +5uCax9HTNlzGybIStD3vD,Say You Won't Let Go,James Arthur,0.358,0.557,10.0,-7.398,1.0,0.059,0.695,0.0,0.0902,0.494,85.043,211467.0,4.0 +79cuOz3SPQTuFrp8WgftA,There's Nothing Holdin' Me Back,Shawn Mendes,0.857,0.8,2.0,-4.035,1.0,0.0583,0.381,0.0,0.0913,0.966,121.996,199440.0,4.0 +6De0lHrwBfPfrhorm9q1X,Me Rehúso,Danny Ocean,0.744,0.804,1.0,-6.327,1.0,0.0677,0.0231,0.0,0.0494,0.426,104.823,205715.0,4.0 +6D0b04NJIKfEMg040WioJ,Issues,Julia Michaels,0.706,0.427,8.0,-6.864,1.0,0.0879,0.413,0.0,0.0609,0.42,113.804,176320.0,4.0 +0afhq8XCExXpqazXczTSv,Galway Girl,Ed Sheeran,0.624,0.876,9.0,-3.374,1.0,0.1,0.0735,0.0,0.327,0.781,99.943,170827.0,4.0 +3ebXMykcMXOcLeJ9xZ17X,Scared to Be Lonely,Martin Garrix,0.584,0.54,1.0,-7.786,0.0,0.0576,0.0895,0.0,0.261,0.195,137.972,220883.0,4.0 +7BKLCZ1jbUBVqRi2FVlTV,Closer,The Chainsmokers,0.748,0.524,8.0,-5.599,1.0,0.0338,0.414,0.0,0.111,0.661,95.01,244960.0,4.0 +1x5sYLZiu9r5E43kMlt9f,Symphony (feat. Zara Larsson),Clean Bandit,0.707,0.629,0.0,-4.581,0.0,0.0563,0.259,1.6e-05,0.138,0.457,122.863,212459.0,4.0 +5GXAXm5YOmYT0kL5jHvYB,I Feel It Coming,The Weeknd,0.768,0.813,0.0,-5.94,0.0,0.128,0.427,0.0,0.102,0.579,92.994,269187.0,4.0 +5aAx2yezTd8zXrkmtKl66,Starboy,The Weeknd,0.681,0.594,7.0,-7.028,1.0,0.282,0.165,3.49e-06,0.134,0.535,186.054,230453.0,4.0 +1OAh8uOEOvTDqkKFsKksC,Wild Thoughts,DJ Khaled,0.671,0.672,0.0,-3.094,0.0,0.0688,0.0329,0.0,0.118,0.632,97.98,204173.0,4.0 +7tr2za8SQg2CI8EDgrdtN,Slide,Calvin Harris,0.736,0.795,1.0,-3.299,0.0,0.0545,0.498,1.21e-06,0.254,0.511,104.066,230813.0,4.0 +2ekn2ttSfGqwhhate0LSR,New Rules,Dua Lipa,0.771,0.696,9.0,-6.258,0.0,0.0755,0.00256,9.71e-06,0.179,0.656,116.054,208827.0,4.0 +5tz69p7tJuGPeMGwNTxYu,1-800-273-8255,Logic,0.629,0.572,5.0,-7.733,0.0,0.0387,0.57,0.0,0.192,0.386,100.015,250173.0,4.0 +7hDc8b7IXETo14hHIHdnh,Passionfruit,Drake,0.809,0.463,11.0,-11.377,1.0,0.0396,0.256,0.085,0.109,0.364,111.98,298941.0,4.0 +7wGoVu4Dady5GV0Sv4UIs,rockstar,Post Malone,0.577,0.522,5.0,-6.594,0.0,0.0984,0.13,9.03e-05,0.142,0.119,159.772,218320.0,4.0 +6EpRaXYhGOB3fj4V2uDkM,Strip That Down,Liam Payne,0.869,0.485,6.0,-5.595,1.0,0.0545,0.246,0.0,0.0765,0.527,106.028,204502.0,4.0 +3A7qX2QjDlPnazUsRk5y0,2U (feat. Justin Bieber),David Guetta,0.548,0.65,8.0,-5.827,0.0,0.0591,0.219,0.0,0.225,0.557,144.937,194897.0,4.0 +0tgVpDi06FyKpA1z0VMD4,Perfect,Ed Sheeran,0.599,0.448,8.0,-6.312,1.0,0.0232,0.163,0.0,0.106,0.168,95.05,263400.0,3.0 +78rIJddV4X0HkNAInEcYd,Call On Me - Ryan Riback Extended Remix,Starley,0.676,0.843,0.0,-4.068,1.0,0.0367,0.0623,0.000752,0.181,0.718,105.003,222041.0,4.0 +5bcTCxgc7xVfSaMV3RuVk,Feels,Calvin Harris,0.893,0.745,11.0,-3.105,0.0,0.0571,0.0642,0.0,0.0943,0.872,101.018,223413.0,4.0 +0NiXXAI876aGImAd6rTj8,Mama,Jonas Blue,0.746,0.793,11.0,-4.209,0.0,0.0412,0.11,0.0,0.0528,0.557,104.027,181615.0,4.0 +0qYTZCo5Bwh1nsUFGZP3z,Felices los 4,Maluma,0.755,0.789,5.0,-4.502,1.0,0.146,0.231,0.0,0.351,0.737,93.973,229849.0,4.0 +2EEeOnHehOozLq4aS0n6S,iSpy (feat. Lil Yachty),KYLE,0.746,0.653,7.0,-6.745,1.0,0.289,0.378,0.0,0.229,0.672,75.016,253107.0,4.0 +152lZdxL1OR0ZMW6KquMi,Location,Khalid,0.736,0.449,1.0,-11.462,0.0,0.425,0.33,0.000162,0.0898,0.326,80.126,219080.0,4.0 +6mICuAdrwEjh6Y6lroV2K,Chantaje,Shakira,0.852,0.773,8.0,-2.921,0.0,0.0776,0.187,3.05e-05,0.159,0.907,102.034,195840.0,4.0 +4Km5HrUvYTaSUfiSGPJeQ,Bad and Boujee (feat. Lil Uzi Vert),Migos,0.927,0.665,11.0,-5.313,1.0,0.244,0.061,0.0,0.123,0.175,127.076,343150.0,4.0 +0ofbQMrRDsUaVKq2mGLEA,Havana,Camila Cabello,0.768,0.517,7.0,-4.323,0.0,0.0312,0.186,3.8e-05,0.104,0.418,104.992,216897.0,4.0 +6HUnnBwYZqcED1eQztxMB,Solo Dance,Martin Jensen,0.744,0.836,6.0,-2.396,0.0,0.0507,0.0435,0.0,0.194,0.36,114.965,174933.0,4.0 +343YBumqHu19cGoGARUTs,Fake Love,Drake,0.927,0.488,9.0,-9.433,0.0,0.42,0.108,0.0,0.196,0.605,133.987,210937.0,4.0 +4pdPtRcBmOSQDlJ3Fk945,Let Me Love You,DJ Snake,0.476,0.718,8.0,-5.309,1.0,0.0576,0.0784,1.02e-05,0.122,0.142,199.864,205947.0,4.0 +3PEgB3fkiojxms35ntsTg,More Than You Know,Axwell /\ Ingrosso,0.644,0.743,5.0,-5.002,0.0,0.0355,0.034,0.0,0.257,0.544,123.074,203000.0,4.0 +1xznGGDReH1oQq0xzbwXa,One Dance,Drake,0.791,0.619,1.0,-5.886,1.0,0.0532,0.00784,0.00423,0.351,0.371,103.989,173987.0,4.0 +7nKBxz47S9SD79N086fuh,SUBEME LA RADIO,Enrique Iglesias,0.684,0.823,9.0,-3.297,0.0,0.0773,0.0744,0.0,0.111,0.647,91.048,208163.0,4.0 +1NDxZ7cFAo481dtYWdrUn,Pretty Girl - Cheat Codes X CADE Remix,Maggie Lindemann,0.703,0.868,7.0,-4.661,0.0,0.0291,0.15,0.132,0.104,0.733,121.03,193613.0,4.0 +3m660poUr1chesgkkjQM7,Sorry Not Sorry,Demi Lovato,0.704,0.633,11.0,-6.923,0.0,0.241,0.0214,0.0,0.29,0.863,144.021,203760.0,4.0 +3kxfsdsCpFgN412fpnW85,Redbone,Childish Gambino,0.743,0.359,1.0,-10.401,1.0,0.0794,0.199,0.00611,0.137,0.587,160.083,326933.0,4.0 +6b8Be6ljOzmkOmFslEb23,24K Magic,Bruno Mars,0.818,0.803,1.0,-4.282,1.0,0.0797,0.034,0.0,0.153,0.632,106.97,225983.0,4.0 +6HZILIRieu8S0iqY8kIKh,DNA.,Kendrick Lamar,0.637,0.514,1.0,-6.763,1.0,0.365,0.0047,0.0,0.094,0.402,139.931,185947.0,4.0 +3umS4y3uQDkqekNjVpiRU,El Amante,Nicky Jam,0.683,0.691,8.0,-5.535,1.0,0.0432,0.243,0.0,0.14,0.732,179.91,219507.0,4.0 +00lNx0OcTJrS3MKHcB80H,You Don't Know Me - Radio Edit,Jax Jones,0.876,0.669,11.0,-6.054,0.0,0.138,0.163,0.0,0.185,0.682,124.007,213947.0,4.0 +6520aj0B4FSKGVuKNsOCO,Chained To The Rhythm,Katy Perry,0.448,0.801,0.0,-5.363,1.0,0.165,0.0733,0.0,0.146,0.462,189.798,237734.0,4.0 +1louJpMmzEicAn7lzDalP,No Promises (feat. Demi Lovato),Cheat Codes,0.741,0.667,10.0,-5.445,1.0,0.134,0.0575,0.0,0.106,0.595,112.956,223504.0,4.0 +2QbFClFyhMMtiurUjuQlA,Don't Wanna Know (feat. Kendrick Lamar),Maroon 5,0.775,0.617,7.0,-6.166,1.0,0.0701,0.341,0.0,0.0985,0.485,100.048,214265.0,4.0 +5hYTyyh2odQKphUbMqc5g,"How Far I'll Go - From ""Moana""",Alessia Cara,0.314,0.555,9.0,-9.601,1.0,0.37,0.157,0.000108,0.067,0.159,179.666,175517.0,4.0 +38yBBH2jacvDxrznF7h08,Slow Hands,Niall Horan,0.734,0.418,0.0,-6.678,1.0,0.0425,0.0129,0.0,0.0579,0.868,85.909,188174.0,4.0 +2cnKEkpVUSV4wnjQiTWfH,Escápate Conmigo,Wisin,0.747,0.864,8.0,-3.181,0.0,0.0599,0.0245,4.46e-05,0.0853,0.754,92.028,232787.0,4.0 +0SGkqnVQo9KPytSri1H6c,Bounce Back,Big Sean,0.77,0.567,2.0,-5.698,1.0,0.175,0.105,0.0,0.125,0.26,81.477,222360.0,4.0 +5Ohxk2dO5COHF1krpoPig,Sign of the Times,Harry Styles,0.516,0.595,5.0,-4.63,1.0,0.0313,0.0275,0.0,0.109,0.222,119.972,340707.0,4.0 +6gBFPUFcJLzWGx4lenP6h,goosebumps,Travis Scott,0.841,0.728,7.0,-3.37,1.0,0.0484,0.0847,0.0,0.149,0.43,130.049,243837.0,4.0 +5Z3GHaZ6ec9bsiI5Benrb,Young Dumb & Broke,Khalid,0.798,0.539,1.0,-6.351,1.0,0.0421,0.199,1.66e-05,0.165,0.394,136.949,202547.0,4.0 +6jA8HL9i4QGzsj6fjoxp8,There for You,Martin Garrix,0.611,0.644,6.0,-7.607,0.0,0.0553,0.124,0.0,0.124,0.13,105.969,221904.0,4.0 +21TdkDRXuAB3k90ujRU1e,Cold (feat. Future),Maroon 5,0.697,0.716,9.0,-6.288,0.0,0.113,0.118,0.0,0.0424,0.506,99.905,234308.0,4.0 +7vGuf3Y35N4wmASOKLUVV,Silence,Marshmello,0.52,0.761,4.0,-3.093,1.0,0.0853,0.256,4.96e-06,0.17,0.286,141.971,180823.0,4.0 +1mXVgsBdtIVeCLJnSnmtd,Too Good At Goodbyes,Sam Smith,0.698,0.375,5.0,-8.279,1.0,0.0491,0.652,0.0,0.173,0.534,91.92,201000.0,4.0 +3EmmCZoqpWOTY1g2GBwJo,Just Hold On,Steve Aoki,0.647,0.932,11.0,-3.515,1.0,0.0824,0.00383,1.5e-06,0.0574,0.374,114.991,198774.0,4.0 +6uFsE1JgZ20EXyU0JQZbU,Look What You Made Me Do,Taylor Swift,0.773,0.68,9.0,-6.378,0.0,0.141,0.213,1.57e-05,0.122,0.497,128.062,211859.0,4.0 +0CokSRCu5hZgPxcZBaEzV,Glorious (feat. Skylar Grey),Macklemore,0.731,0.794,0.0,-5.126,0.0,0.0522,0.0323,2.59e-05,0.112,0.356,139.994,220454.0,4.0 +6875MeXyCW0wLyT72Eetm,Starving,Hailee Steinfeld,0.721,0.626,4.0,-4.2,1.0,0.123,0.402,0.0,0.102,0.558,99.914,181933.0,4.0 +3AEZUABDXNtecAOSC1qTf,Reggaetón Lento (Bailemos),CNCO,0.761,0.838,4.0,-3.073,0.0,0.0502,0.4,0.0,0.176,0.71,93.974,222560.0,4.0 +3E2Zh20GDCR9B1EYjfXWy,Weak,AJR,0.673,0.637,5.0,-4.518,1.0,0.0429,0.137,0.0,0.184,0.678,123.98,201160.0,4.0 +4pLwZjInHj3SimIyN9SnO,Side To Side,Ariana Grande,0.648,0.738,6.0,-5.883,0.0,0.247,0.0408,0.0,0.292,0.603,159.145,226160.0,4.0 +3QwBODjSEzelZyVjxPOHd,Otra Vez (feat. J Balvin),Zion & Lennox,0.832,0.772,10.0,-5.429,1.0,0.1,0.0559,0.000486,0.44,0.704,96.016,209453.0,4.0 +1wjzFQodRWrPcQ0AnYnvQ,I Like Me Better,Lauv,0.752,0.505,9.0,-7.621,1.0,0.253,0.535,2.55e-06,0.104,0.419,91.97,197437.0,4.0 +04DwTuZ2VBdJCCC5TROn7,In the Name of Love,Martin Garrix,0.49,0.485,4.0,-6.237,0.0,0.0406,0.0592,0.0,0.337,0.196,133.889,195840.0,4.0 +6DNtNfH8hXkqOX1sjqmI7,Cold Water (feat. Justin Bieber & MØ),Major Lazer,0.608,0.798,6.0,-5.092,0.0,0.0432,0.0736,0.0,0.156,0.501,92.943,185352.0,4.0 +1UZOjK1BwmwWU14Erba9C,Malibu,Miley Cyrus,0.573,0.781,8.0,-6.406,1.0,0.0555,0.0767,2.64e-05,0.0813,0.343,139.934,231907.0,4.0 +4b4KcovePX8Ke2cLIQTLM,All Night,The Vamps,0.544,0.809,8.0,-5.098,1.0,0.0363,0.0038,0.0,0.323,0.448,145.017,197640.0,4.0 +1a5Yu5L18qNxVhXx38njO,Hear Me Now,Alok,0.789,0.442,11.0,-7.844,1.0,0.0421,0.586,0.00366,0.0927,0.45,121.971,192846.0,4.0 +4c2W3VKsOFoIg2SFaO6DY,Your Song,Rita Ora,0.855,0.624,1.0,-4.093,1.0,0.0488,0.158,0.0,0.0513,0.962,117.959,180757.0,4.0 +22eADXu8DfOAUEDw4vU8q,Ahora Dice,Chris Jeday,0.708,0.693,6.0,-5.516,1.0,0.138,0.246,0.0,0.129,0.427,143.965,271080.0,4.0 +7nZmah2llfvLDiUjm0kiy,Friends (with BloodPop®),Justin Bieber,0.744,0.739,8.0,-5.35,1.0,0.0387,0.00459,0.0,0.306,0.649,104.99,189467.0,4.0 +2fQrGHiQOvpL9UgPvtYy6,Bank Account,21 Savage,0.884,0.346,8.0,-8.228,0.0,0.351,0.0151,7.04e-06,0.0871,0.376,75.016,220307.0,4.0 +1PSBzsahR2AKwLJgx8ehB,Bad Things (with Camila Cabello),Machine Gun Kelly,0.675,0.69,2.0,-4.761,1.0,0.132,0.21,0.0,0.287,0.272,137.817,239293.0,4.0 +0QsvXIfqM0zZoerQfsI9l,Don't Let Me Down,The Chainsmokers,0.542,0.859,11.0,-5.651,1.0,0.197,0.16,0.00466,0.137,0.403,159.797,208053.0,4.0 +7mldq42yDuxiUNn08nvzH,Body Like A Back Road,Sam Hunt,0.731,0.469,5.0,-7.226,1.0,0.0326,0.463,1.04e-06,0.103,0.631,98.963,165387.0,4.0 +7i2DJ88J7jQ8K7zqFX2fW,Now Or Never,Halsey,0.658,0.588,6.0,-4.902,0.0,0.0367,0.105,1.28e-06,0.125,0.434,110.075,214802.0,4.0 +1j4kHkkpqZRBwE0A4CN4Y,Dusk Till Dawn - Radio Edit,ZAYN,0.258,0.437,11.0,-6.593,0.0,0.039,0.101,1.27e-06,0.106,0.0967,180.043,239000.0,4.0 diff --git a/Student/rdrovdahl/lesson02/high_engergy_tracks_closure.py b/Student/rdrovdahl/lesson02/high_engergy_tracks_closure.py new file mode 100644 index 0000000..c844b01 --- /dev/null +++ b/Student/rdrovdahl/lesson02/high_engergy_tracks_closure.py @@ -0,0 +1,22 @@ +#! /usr/local/bin/python3 + + +''' +Write a closure to find and print all 'high energy' tracks from the data +set. +''' + +import pandas as pd + + +def music_filter(): + music = pd.read_csv("featuresdf.csv") + + def high_energy(val): + nonlocal music + return music[music.energy > val][['artists', 'name', 'energy']] + return high_energy + + +energy_filter = music_filter() +print(energy_filter(0.8)) From 992bb0c309d13abaf329fc2430e4cf566a220f37 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Tue, 29 May 2018 11:07:15 -0700 Subject: [PATCH 05/19] adding Jupyter notes from class lecture on lesson02 --- Student/rdrovdahl/lesson02/Jupyter_lesson02.zip | Bin 0 -> 3316 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Student/rdrovdahl/lesson02/Jupyter_lesson02.zip diff --git a/Student/rdrovdahl/lesson02/Jupyter_lesson02.zip b/Student/rdrovdahl/lesson02/Jupyter_lesson02.zip new file mode 100644 index 0000000000000000000000000000000000000000..f3d214698457b351f0c15996b7c23c1d586a80d2 GIT binary patch literal 3316 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 Date: Sun, 3 Jun 2018 23:32:49 -0700 Subject: [PATCH 06/19] added lesson 3 context manager assignment for the locke exercise --- Student/rdrovdahl/lesson03/locke.py | 242 ++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 Student/rdrovdahl/lesson03/locke.py diff --git a/Student/rdrovdahl/lesson03/locke.py b/Student/rdrovdahl/lesson03/locke.py new file mode 100644 index 0000000..69ef76f --- /dev/null +++ b/Student/rdrovdahl/lesson03/locke.py @@ -0,0 +1,242 @@ +#! /usr/local/bin/python3 + + +''' +Write a context manager for a simulated ballard locke program +There are 2 lockes - one small which holds up to 5 boats and one large which +holds up to 10 boats. + +When a locke is entered, you need to: + Stop the pumps + Open the doors + Close the doors + Restart the pumps + Transfer boats + etc... + +During initialization the context manger class accepts the locke’s capacity in +number of boats. If the locke's capacity is exceeded, raise a suitable error. + +For this simulation, we will only need to print the system controls commands. +''' + +from time import sleep, time +import datetime +system_status = True +start_time = 0 + + +class locke_enter(): + def __init__(self, boats, size, handle_error=True): + global start_time + self.boats = boats + self.handle_error = handle_error + self.size = size + self.max = 0 + if self.size == 'small': + self.max = 5 + if self.size == 'large': + self.max = 10 + start_time = time() + + def __enter__(self): + print('\n' + ('_' * 80 + '\n') * 2) + self.now = datetime.datetime.now() + self.time = str(self.now.strftime("%H") + ':' + self.now.strftime("%M") + ':' + self.now.strftime("%S")) + print(f'{self.boats} boats would like to traverse the {self.size} locke at {self.time}') + if self.boats > self.max: + raise Exception(f'Too many boats for {self.size} locke') + self.doors_open() + return self + + def __exit__(self, type, value, traceback): + global system_status + if traceback: + print('\n\n ___SYSTEM FAILURE___') + print(' type: {}'.format(type)) + print(' value: {}'.format(value)) + print(' traceback: {}'.format(traceback)) + print('\n shutting down the system...') + system_status = False + print(f' {self.boats} boats have been stranded!\n') + return self.handle_error + + def doors_open(self): + print('opening the doors...', end='', flush=True) + sleep(2) + print('doors open') + sleep(1) + + def doors_close(self): + print('closing the doors...', end='', flush=True) + sleep(2) + print('doors closed') + sleep(1) + + def boats_enter(self): + print('boats entering the locke...') + sleep(2) + for _ in range(1, self.boats + 1): + print(f' boat {_} has entered the locke') + sleep(2) + print('all boats are in the locke') + sleep(1) + + +class locke_pump(): + def __init__(self, boats, handle_error=True): + self.boats = boats + self.handle_error = handle_error + + def __enter__(self): + self.start = time() + return self + + def __exit__(self, type, value, traceback): + global system_status + if traceback: + print('\n\n ___SYSTEM FAILURE___') + print(' type: {}'.format(type)) + print(' value: {}'.format(value)) + print(' traceback: {}'.format(traceback)) + print('\n shutting down the system...') + system_status = False + print(f' {self.boats} boats have been stranded!\n') + return self.handle_error + else: + self.pump_stop() + + def pump_start(self): + print('starting pumps...', end='', flush=True) + sleep(2) + print('pumps started') + sleep(1) + + def pump_stop(self): + print('stopping the pumps...', end='', flush=True) + sleep(2) + print('pumps stopped') + sleep(1) + + +class locke_exit(): + global start_time + + def __init__(self, boats, handle_error=True): + self.boats = boats + self.handle_error = handle_error + + def __enter__(self): + self.start = time() + self.doors_open() + return self + + def __exit__(self, type, value, traceback): + global system_status + if traceback: + print('\n\n ___SYSTEM FAILURE___') + print(' type: {}'.format(type)) + print(' value: {}'.format(value)) + print(' traceback: {}'.format(traceback)) + print('\n shutting down the system...') + system_status = False + print(f' {self.boats} boats have been stranded!\n') + return self.handle_error + else: + self.doors_close() + self.now = datetime.datetime.now() + self.time = str(self.now.strftime("%H") + ':' + self.now.strftime("%M") + ':' + self.now.strftime("%S")) + self.end = time() + total_time = self.end - start_time + print(f'{self.boats} boats have finished traversing the locke at {self.time}') + print(f'Total traversal time: {total_time:.2f} seconds') + + def doors_open(self): + print('opening the doors...', end='', flush=True) + sleep(2) + print('doors open') + sleep(1) + + def doors_close(self): + print('closing the doors...', end='', flush=True) + sleep(2) + print('doors closed') + sleep(1) + + def boats_exit(self): + print('boats exiting the locke...') + sleep(2) + for _ in range(1, self.boats + 1): + print(f' boat {_} has exited the locke') + sleep(2) + print('all boats have exited the locke') + sleep(2) + + +def through_the_locke(boats, size='small', handle_error=True): + # size can be 'small' for up to 5 boats or 'large' for up to 10 boats + global system_status + if system_status is True: + try: + with locke_enter(boats, size, handle_error) as x: + x.boats_enter() + except Exception as e: + print(e) + return + if system_status is True: + with locke_pump(boats, handle_error) as x: + x.pump_start() + if system_status is True: + with locke_exit(boats, handle_error) as x: + x.boats_exit() + if system_status is not True: + print('**** locke is offline for repairs ****') + + +def through_the_locke_with_error(boats, size='small', handle_error=True): + # this function simulates a RuntimeError during the pumping procedure + # the error should be handled in the context manager class and global + # system_status variable will be changed to shut down the system + global system_status + if system_status is True: + try: + with locke_enter(boats, size, handle_error) as x: + x.boats_enter() + except Exception as e: + print(e) + return + if system_status is True: + with locke_pump(boats, handle_error) as y: + y.pump_start() + raise RuntimeError('major pump malfunction detected') + if system_status is True: + with locke_exit(boats, handle_error, 'small') as z: + z.boats_exit() + if system_status is not True: + print('**** locke is offline for repairs ****') + + +def main(): + # run through a series of locke traversals + + # this call will send 4 boats through the small locke + through_the_locke(4, 'small') + + # this call will try to send 8 boats through the small locke but fail + # because the small locke only takes up to 5 boats + through_the_locke(8, 'small') + + # this call will try to send 12 boats through the large locke but fail + # because the large locke only takes up to 10 boats + through_the_locke(12, 'large') + + # this call will send 8 boats through the large locke + through_the_locke(8, 'large') + + # this call shows how error handling works when an error is raised within + # the context + through_the_locke_with_error(3, 'small') + + +if __name__ == "__main__": + main() From 5ccb4529ee85ef8e5f4686a0b64fecdf42682524 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Thu, 7 Jun 2018 17:48:54 -0700 Subject: [PATCH 07/19] added recursion script for factorial --- Student/rdrovdahl/lesson03/recursion.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Student/rdrovdahl/lesson03/recursion.py diff --git a/Student/rdrovdahl/lesson03/recursion.py b/Student/rdrovdahl/lesson03/recursion.py new file mode 100644 index 0000000..83ddc62 --- /dev/null +++ b/Student/rdrovdahl/lesson03/recursion.py @@ -0,0 +1,15 @@ +#! /usr/local/bin/python3 + + +'Write a recursive solution for the factorial function.' + + +def factorial(num): + if num == 1: + return 1 + else: + f = num * factorial(num-1) + return f + +x = factorial(10) +print(x) From e4872651abc791ae427ffc23877404e8a5c2bf9b Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Sun, 10 Jun 2018 13:45:54 -0700 Subject: [PATCH 08/19] added lesson04 content, labs, and assignment --- .../rdrovdahl/lesson04/MangledSingleton.py | 45 +++ Student/rdrovdahl/lesson04/cool_meta.py | 30 ++ Student/rdrovdahl/lesson04/get_set_attr.py | 55 ++++ .../json_save/.cache/v/cache/lastfailed | 12 + .../rdrovdahl/lesson04/json_save/README.txt | 4 + .../json_save/examples/example_dec.py | 66 +++++ .../json_save/examples/example_meta.py | 63 +++++ .../lesson04/json_save/json_save/__init__.py | 8 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 295 bytes .../__pycache__/json_save_dec.cpython-36.pyc | Bin 0 -> 3677 bytes .../__pycache__/json_save_meta.cpython-36.pyc | Bin 0 -> 5635 bytes .../__pycache__/saveables.cpython-36.pyc | Bin 0 -> 5622 bytes .../json_save/json_save/json_save_dec.py | 146 ++++++++++ .../json_save/json_save/json_save_meta.py | 211 +++++++++++++++ .../lesson04/json_save/json_save/saveables.py | 218 +++++++++++++++ .../json_save/json_save/test/__init__.py | 0 .../test/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 200 bytes .../test_json_save_dec.cpython-36-PYTEST.pyc | Bin 0 -> 12302 bytes .../test_savables.cpython-36-PYTEST.pyc | Bin 0 -> 5094 bytes .../json_save/json_save/test/temp.json | 21 ++ .../json_save/test/test_json_save_dec.py | 256 ++++++++++++++++++ .../json_save/test/test_json_save_meta.py | 235 ++++++++++++++++ .../json_save/json_save/test/test_savables.py | 87 ++++++ Student/rdrovdahl/lesson04/json_save/setup.py | 36 +++ .../mailroom/.cache/v/cache/lastfailed | 1 + .../__pycache__/mailroom_OO.cpython-36.pyc | Bin 0 -> 10332 bytes .../test_mailroom_OO.cpython-36-PYTEST.pyc | Bin 0 -> 4724 bytes .../json_save/.cache/v/cache/lastfailed | 12 + .../lesson04/mailroom/json_save/README.txt | 4 + .../json_save/examples/example_dec.py | 67 +++++ .../json_save/examples/example_meta.py | 63 +++++ .../mailroom/json_save/json_save/__init__.py | 8 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 216 bytes .../__pycache__/json_save_dec.cpython-36.pyc | Bin 0 -> 3598 bytes .../__pycache__/json_save_meta.cpython-36.pyc | Bin 0 -> 5556 bytes .../__pycache__/saveables.cpython-36.pyc | Bin 0 -> 5543 bytes .../json_save/json_save/json_save_dec.py | 146 ++++++++++ .../json_save/json_save/json_save_meta.py | 211 +++++++++++++++ .../mailroom/json_save/json_save/saveables.py | 218 +++++++++++++++ .../json_save/json_save/test/__init__.py | 0 .../test/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 209 bytes .../test_json_save_dec.cpython-36-PYTEST.pyc | Bin 0 -> 12311 bytes .../test_savables.cpython-36-PYTEST.pyc | Bin 0 -> 5094 bytes .../json_save/json_save/test/temp.json | 21 ++ .../json_save/test/test_json_save_dec.py | 256 ++++++++++++++++++ .../json_save/test/test_json_save_meta.py | 235 ++++++++++++++++ .../json_save/json_save/test/test_savables.py | 87 ++++++ .../lesson04/mailroom/json_save/setup.py | 36 +++ .../rdrovdahl/lesson04/mailroom/mail_db.json | 11 + .../rdrovdahl/lesson04/mailroom/mail_db2.json | 11 + .../lesson04/mailroom/mailroom_META.py | 78 ++++++ Student/rdrovdahl/lesson04/mangler.py | 48 ++++ Student/rdrovdahl/lesson04/mangler_dec.py | 70 +++++ Student/rdrovdahl/lesson04/singleton.py | 24 ++ 54 files changed, 3100 insertions(+) create mode 100644 Student/rdrovdahl/lesson04/MangledSingleton.py create mode 100644 Student/rdrovdahl/lesson04/cool_meta.py create mode 100644 Student/rdrovdahl/lesson04/get_set_attr.py create mode 100644 Student/rdrovdahl/lesson04/json_save/.cache/v/cache/lastfailed create mode 100644 Student/rdrovdahl/lesson04/json_save/README.txt create mode 100755 Student/rdrovdahl/lesson04/json_save/examples/example_dec.py create mode 100755 Student/rdrovdahl/lesson04/json_save/examples/example_meta.py create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/__init__.py create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/__init__.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/json_save_dec.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/json_save_meta.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/saveables.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/json_save_dec.py create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/json_save_meta.py create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/saveables.py create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/test/__init__.py create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/test/__pycache__/__init__.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/test/__pycache__/test_json_save_dec.cpython-36-PYTEST.pyc create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/test/__pycache__/test_savables.cpython-36-PYTEST.pyc create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/test/temp.json create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/test/test_json_save_dec.py create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/test/test_json_save_meta.py create mode 100644 Student/rdrovdahl/lesson04/json_save/json_save/test/test_savables.py create mode 100755 Student/rdrovdahl/lesson04/json_save/setup.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/.cache/v/cache/lastfailed create mode 100644 Student/rdrovdahl/lesson04/mailroom/__pycache__/mailroom_OO.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/mailroom/__pycache__/test_mailroom_OO.cpython-36-PYTEST.pyc create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/.cache/v/cache/lastfailed create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/README.txt create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/examples/example_dec.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/examples/example_meta.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/__init__.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/__pycache__/__init__.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/__pycache__/json_save_dec.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/__pycache__/json_save_meta.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/__pycache__/saveables.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/json_save_dec.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/json_save_meta.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/saveables.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__init__.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__pycache__/__init__.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__pycache__/test_json_save_dec.cpython-36-PYTEST.pyc create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__pycache__/test_savables.cpython-36-PYTEST.pyc create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/temp.json create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/test_json_save_dec.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/test_json_save_meta.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/test_savables.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/json_save/setup.py create mode 100644 Student/rdrovdahl/lesson04/mailroom/mail_db.json create mode 100644 Student/rdrovdahl/lesson04/mailroom/mail_db2.json create mode 100644 Student/rdrovdahl/lesson04/mailroom/mailroom_META.py create mode 100644 Student/rdrovdahl/lesson04/mangler.py create mode 100644 Student/rdrovdahl/lesson04/mangler_dec.py create mode 100644 Student/rdrovdahl/lesson04/singleton.py diff --git a/Student/rdrovdahl/lesson04/MangledSingleton.py b/Student/rdrovdahl/lesson04/MangledSingleton.py new file mode 100644 index 0000000..51d749e --- /dev/null +++ b/Student/rdrovdahl/lesson04/MangledSingleton.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 + +''' +create a new metaclass that combines the Singleton and Mangler classes + +“The singleton pattern is a software design pattern that restricts the +instantiation of a class to one object.” + +''' + + +class MangledSinglton(type): + instance = None + + # this is the code that creates custom attributes for the new class + def __new__(cls, clsname, bases, _dict): + uppercase_attr = {} + for name, val in _dict.items(): + if not name.startswith('__'): + uppercase_attr[name.upper()] = val + uppercase_attr[name.upper()*2] = val + uppercase_attr[name.lower()] = val + uppercase_attr[name.lower()*2] = val + else: + uppercase_attr[name] = val + return super().__new__(cls, clsname, bases, uppercase_attr) + + # this is the Singleton code which restricts the instantiation of a class + # to one object + def __call__(cls, *args, **kwargs): + if cls.instance is None: + cls.instance = super().__call__(*args, **kwargs) + return cls.instance + + + + +class MyClass(metaclass=MangledSinglton): + x = 1 + +o1 = MyClass() +o2 = MyClass() +print(o1.X) +assert id(o1) == id(o2) +print(bool(id(o1) == id(o2))) diff --git a/Student/rdrovdahl/lesson04/cool_meta.py b/Student/rdrovdahl/lesson04/cool_meta.py new file mode 100644 index 0000000..ef3e821 --- /dev/null +++ b/Student/rdrovdahl/lesson04/cool_meta.py @@ -0,0 +1,30 @@ +""" +Complete do-nothing metaclass example + +It serves to show when each special method of the metaclass is called. + +""" + + +class CoolMeta(type): + def __new__(meta, name, bases, dct): + print('Creating class in CoolMeta.__new__', name) + return super().__new__(meta, name, bases, dct) + + def __init__(cls, name, bases, dct): + print('Initializing class in CoolMeta.__init__', name) + super().__init__(name, bases, dct) + + def __call__(cls, *args, **kw): + print('calling CoolMeta to instantiate ', cls) + return type.__call__(cls, *args, **kw) + + +class CoolClass(metaclass=CoolMeta): + def __init__(self): + print('And now my CoolClass object exists') + + +print('everything loaded, instantiate a CoolClass instance now') + +foo = CoolClass() diff --git a/Student/rdrovdahl/lesson04/get_set_attr.py b/Student/rdrovdahl/lesson04/get_set_attr.py new file mode 100644 index 0000000..d0d8ab2 --- /dev/null +++ b/Student/rdrovdahl/lesson04/get_set_attr.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 + +""" +Manipulating attributes + +Example code for manipulating attributes +""" + + +# A simple class for a person +class Person: + def __init__(self, first_name="", last_name="", phone=""): + self.first_name = first_name + self.last_name = last_name + self.phone = phone + + def __str__(self): + msg = ["Person:"] + for name, val in vars(self).items(): + msg.append("{}: {}".format(name, val)) + return "\n".join(msg) + + +def update_person(person): + while True: + att = input("What would you like to update for:\n" + "{}\n" + '(type "quit" to quit) >> '.format(person) + ) + if att.strip().lower() == "quit": + break + if not hasattr(person, att): + ans = input("This person does not have that attribute.\n" + "Would you like to add it? Y,[N] >> ") + if not ans.lower().startswith('y'): + continue + else: + ans = input("What would you like to set it to? >> ") + setattr(person, att, ans) + # new code to allow deleting of attributes + elif hasattr(person, att): + ans = input('This attribute already exists. \n' + 'Would you like to delete it? Y, [N] >>') + if not ans.lower().startswith('y'): + continue + else: + delattr(person, att) + + +if __name__ == "__main__": + # a little test code: + + # create a couple people: + p1 = Person("Fred", "Jones", "206-555-1234") + update_person(p1) diff --git a/Student/rdrovdahl/lesson04/json_save/.cache/v/cache/lastfailed b/Student/rdrovdahl/lesson04/json_save/.cache/v/cache/lastfailed new file mode 100644 index 0000000..051b538 --- /dev/null +++ b/Student/rdrovdahl/lesson04/json_save/.cache/v/cache/lastfailed @@ -0,0 +1,12 @@ +{ + "json_save/test/test_savables.py::test_bad_dicts[val4]": true, + "json_save/test/test_savables.py::test_basics": true, + "json_save/test/test_savables.py::test_basics[Tuple-val5]": true, + "json_save/test/test_savables.py::test_containers[Dict-val0]": true, + "json_save/test/test_savables.py::test_dicts[Dict-val0]": true, + "json_save/test/test_savables.py::test_dicts[Dict-val1]": true, + "json_save/test/test_savables.py::test_dicts[Dict-val2]": true, + "json_save/test/test_savables.py::test_dicts[Dict-val3]": true, + "json_save/test/test_savables.py::test_dicts[val10]": true, + "json_save/test/test_savables.py::test_dicts[val7]": true +} \ No newline at end of file diff --git a/Student/rdrovdahl/lesson04/json_save/README.txt b/Student/rdrovdahl/lesson04/json_save/README.txt new file mode 100644 index 0000000..a80b252 --- /dev/null +++ b/Student/rdrovdahl/lesson04/json_save/README.txt @@ -0,0 +1,4 @@ +This is a simple meta-class based system for saving objects in the JSON format. + +It can make any arbitrary class savable and re-loadable from JSON. + diff --git a/Student/rdrovdahl/lesson04/json_save/examples/example_dec.py b/Student/rdrovdahl/lesson04/json_save/examples/example_dec.py new file mode 100755 index 0000000..263b6c7 --- /dev/null +++ b/Student/rdrovdahl/lesson04/json_save/examples/example_dec.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +""" +Examples of using json_save +""" + +import json_save.json_save_dec as js + + +# Examples using the decorator + +@js.json_save +class MyClass: + + x = js.Int() + y = js.Float() + lst = js.List() + + def __init__(self, x, lst): + self.x = x + self.lst = lst + + +@js.json_save +class OtherSaveable: + + foo = js.String() + bar = js.Int() + + def __init__(self, foo, bar): + self.foo = foo + self.bar = bar + + +# create one: +print("about to create a instance") +mc = MyClass(5, [3, 5, 7, 9]) + +print(mc) + +jc = mc.to_json_compat() + +# re-create it from the dict: +mc2 = MyClass.from_json_dict(jc) + +print(mc2 == "fred") + +assert mc2 == mc + +print(mc.to_json()) + +# now try it nested... +mc_nest = MyClass(34, [OtherSaveable("this", 2), + OtherSaveable("that", 64), + ]) + +mc_nest_comp = mc_nest.to_json_compat() +print(mc_nest_comp) + +# can we re-create it? +mc_nest2 = MyClass.from_json_dict(mc_nest_comp) + +print(mc_nest) +print(mc_nest2) + +assert mc_nest == mc_nest2 diff --git a/Student/rdrovdahl/lesson04/json_save/examples/example_meta.py b/Student/rdrovdahl/lesson04/json_save/examples/example_meta.py new file mode 100755 index 0000000..13719ab --- /dev/null +++ b/Student/rdrovdahl/lesson04/json_save/examples/example_meta.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python + +""" +Examples of using json_save +""" + +import json_save.json_save_meta as js + +# Metaclass examples + +class MyClass(js.JsonSaveable): + + x = js.Int() + y = js.Float() + lst = js.List() + + def __init__(self, x, lst): + self.x = x + self.lst = lst + + +class OtherSaveable(js.JsonSaveable): + + foo = js.String() + bar = js.Int() + + def __init__(self, foo, bar): + self.foo = foo + self.bar = bar + +# create one: +print("about to create a instance") +mc = MyClass(5, [3, 5, 7, 9]) + +print(mc) + +jc = mc.to_json_compat() + +# re-create it from the dict: +mc2 = MyClass.from_json_dict(jc) + +print(mc2 == "fred") + +assert mc2 == mc + +print(mc.to_json()) + +# now try it nested... +mc_nest = MyClass(34, [OtherSaveable("this", 2), + OtherSaveable("that", 64), + ]) + +mc_nest_comp = mc_nest.to_json_compat() +print(mc_nest_comp) + +# can we re-create it? +mc_nest2 = MyClass.from_json_dict(mc_nest_comp) + +print(mc_nest) +print(mc_nest2) + +assert mc_nest == mc_nest2 + diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/__init__.py b/Student/rdrovdahl/lesson04/json_save/json_save/__init__.py new file mode 100644 index 0000000..db59bd9 --- /dev/null +++ b/Student/rdrovdahl/lesson04/json_save/json_save/__init__.py @@ -0,0 +1,8 @@ +""" +json_save package + +Pulling in names from the other packages. +""" + +__version__ = "0.4.0" + diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/__init__.cpython-36.pyc b/Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14b2d0cc47a659f32478b3840edd378e109e020f GIT binary patch literal 295 zcmYk1&q~8U5XLvDMTzzu_S!?UY3#v+6ny~+1TO&@mh3cH-Ry?lO`v@R&pw1F-zQh! z!c$kl(t-K$!TkH?cCkplKHjSrLdbW>Q$#^MgmgCnf>cCARV3n)EN6#p^6HER$48_+ zuitosNm2|-N!?JXspcIzy0fOEzC~&R?0=(6lfyhqH)-~?jHgQgVQPTs8el~0WLOKI z#LmLeKm7FU*@XhL!kSU=RRk8Q2(RrS&9_tzvTJBM>(hmZ)KO0l% hg6V9-PTtQHfYj0hr2T%ny6=n_6mI9g@5ccb@ewg&Ss(xa literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/json_save_dec.cpython-36.pyc b/Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/json_save_dec.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebd80d0f3226c91e49f9f34cac5b0a53c41ffea2 GIT binary patch literal 3677 zcmZu!&u`nv73PqXM9Gr;quy+i1_j%0v#ZpO({#Hi3~#Y+ngHDmoB(#4LP$YSno&%d z66KkZV;M3EtaB<*pyw977U;jkYfm}%*3*9P(UNR$WN`O+{Pa?WOL(YkR_xzAUBwfg{VZ^3G|OWFV_}msLg9 zku zs4y9fQZ-ORt7I6PFb<{aW;(W+uD!>(oV}LF{g<&ld@s;KLprG;Hmf5ZSmyaL);@6um zC-yKKK7RaYbGO@7se-wc+}gKe2^_9WOO?TmAAPlw}aa-s$)VnVA;79bU<6-cgp>p~afd{a@ICm%aETANq@CHm5?vbbOOThHXISzcs zx<@s=BOLmp-an!DmBaM%&f08zse17^wV@(ICw3AJ6mBhnP;A5Qq3Rx)FzJPHnub}A zaU(v0gfM5)8Czv|nOLi032r?*XnC6Mq?b_S&E47Hr&?zk-{?kpDFY3(CIc`cMX^es z%2A|_qv(gI8~W~)>cWL}0?`yTp+7>;+(Ja{3Z6N=$v#s^?%X}yKwb1*Cijm(ZtvW; z-qf9XQ@`)SV%{B$yMTa?Z-L$SZvkQPw8I zH@wFc%kv(4FAkn=V?r`aEM{P(VFu`cn34~9!~x8VH4d|JD*0na;Zl=Oomw5^Zi!8R z{TbwnlWH&_(YR7FoG;3&v`Ts9@>m77RTw?5;AkwZDrh}o#bBVPAH?#aq%5Zo_l*cT`W>OLd@u)Why(3*L&TL9ZX zFIk_Uo|gJ02AO=A#~=gp0^|eoUa^#5`3&QQf!UuKGlunm)g&aAlM>L-Y9mx93e=b* zU3@3w!zN@t!q<#D%oXrx22lZiVn3xl=SZ6jM_tltlS%j<1pL;+~E?yZY8!M*P(Bz4KP(U0Eq`1BZ!DPrqUpzm77 zmgGBirTaI?6FnZGj2^f<^Z`e5Y%MRoGeh*rA~4P6g}C(f{)@fB^4p_W$Ahpp`f@KD zs%_GDHUg5pBvnzG99^CDRwKx;QCY?|E9^!A@apgPJ;Du4q7^r2{4k6|0~ZN%v!Dq) zKEl;$vpVAhQ5NBmyeozHV*0f+Cqs%oUw*zF9$>wqRme648B@^1%(Q!LLrM?I#c&FX zbeFs&$Agj4H5feisXp_|Zf~T2jNY4K4Q7$+8+O1 zcE;8@s_JzMWG}?G!n&+kk>Fe8oqjeIegA3(g6zYyP6jjDCqSo z|3o1B7xI&D(X!=!fWGREV{2HkW|vUbZ3AV)Hc>9y6_l$}hq!X~4alQhSborkH{BOMguz0WFCC>v&A}HqS7#(K(XQ207vrtl*=e{_WCkr90J>67Sg`F z*23Fdqt;%=yn{o)t~UmTgR!x+$INA!)>`gU`jl4>P;!*b{gYUmg`V?TVrJv>V0IOf z|7CjB*nR#y+TZ=-)7{@bf4Z+Jq!uoL@)4#9$6fZwdGos8W(u?`mzhn=XJ^r_(%mBR z>$!KNCLfIS)w%Uv6JbIWln4c-K$PJwY6$pcvEtReGT!{>>PHwe=NowsN|u;!_fVO_ zBiwP$1$z(F`UTfq4)5++!l?D)E^_Bd*c%VK9QKNQXA$vZ-9a`OW60M)dS))3dl|CH z0#GTP|NGf4DO;0MgQ$Lvm)@k}A$PRPeKtxvm}R|%Bc-f#kpuDIzo4s7S~(Cag8Sw- zhr?Sajg}^*S!k<=L{Q(ep7s04;*sFMLvpJ;Yq8IC&mz9hvk%%rtIc@=bj=2rDNA9- zg$-ujF4OEt`SV_@q95R3xd&gS2_?RP{t5M!(kzxH_vr=qRN^e)rq8L)dG=S#DNIpn zil(c7g?7u`(;>Z^l$yw_izvoxSMa~bVVZP!&vtXpu?X31%n3GgIbULR7AY?iyI?#y xG-g?GT-xf&!5Ak_Q-hsBCdaAz4IynPe)?`8>Tci%ji6Cq3s!5Z!B2yw?*L4azd-;1 literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/json_save_meta.cpython-36.pyc b/Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/json_save_meta.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a93ea5aaf3d1072aafccc82a05e722fa1c94e8f GIT binary patch literal 5635 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 literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/saveables.cpython-36.pyc b/Student/rdrovdahl/lesson04/json_save/json_save/__pycache__/saveables.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cce8384ae27525035f6fae7f84a8861ec94a04b GIT binary patch literal 5622 zcmdT|&2t+`6`xOOq}Yz*WD7RzLKCtSuEcgWEL&8{m9p~%3&Fcp4%tPu>@c2gTargJ zN>3|}R1$}E4jf?56d#A>w*LghiQ>$0t`rBZ969lO-O@-_HeXaOj6CgmGd+8ZM*-UV~H6%aX#o)rwW&-$}Aa74CbfD!jX` zTou7&rlPW|WGg)={CmA_B4T=Za=5tI!kJ$|BP>|YYB=0(xZG)YEvw;+3fc3qb!<1P zxQ1Qzb)a>s$|_zPT&go1H=SUbm zt#oc7uyUkWBn3+|rN?H|vDeGNzQAe<7vsx1R;Qc)JlObYj=47^m)S!eHIt2lmXcYf zHg-R_dgbl!uYJ&0%`Clo^~&0I9E(H%I>9$~RSzpsGp{8ghfY`C*&x+IGStk~#BTX| zw_hx&EYzLM8s8vuIcTiv;42e|*H89&u8sd(Dj8=fET!1K%sOL3&lsaLw92$=cC~hs zyHmUWq?fCCtM6;;Ml4Ikn#$Jjk98syH>YpiYqoNRzoVuA7BF;+17E-zPf&~iAZHP} zh$NXJqp?`E<*5lS2B8IrMGdAf%X|x>u~coaGHWUGc(qmpVVFi85r#!Q3_BU`C3L+I zh7WpCGJaAGL!QOBUFBjw>LsdJ+`fA^+}*x^d;7-S+q=a=uCVGDQQOS8T%;u}om`i8 zA6lFa7Z911)2+buZ2X*sS`4W?C?>XW=I7ANha`6qBc3Gk8+@Wc+@3N@uEX5e*MvM` z2bLvL$)P7j!jE>}-ywqdVuZNiI`!hME;>&Qepx z#MJhBS#RT^4(Gu4?3Y%I9D9(=E4Bxo6H#h3BhrIlRO^BxRG)QvvEj~_SM$zGYe{Ro z_EarhJlUeB49z@z!Y|nrTnZ>F(nq(!Kj$@WrAizKX*33>lVCKCSkh7o9LQVy`@kwy zC9I&ebPVh|BL|38(r0;BM2EmvPod$@QrvFB2`;3)&K?H7a2YY!f(c^`0P-Bq&Oqb) zw5@12DJNE$9%}3>#Mw8nm@$dLu=`*z1VgBsWLMa0E7X+FoI0+5r?Leh*?_o9I0O3c2)6QiirVWhuMuQ1Fh!w^Q1C3QdBX z)C8|t$l998yh<{n1R;_#>N8r!<#GtaOgeQS?I`?dtZ6o|>K48pQ<7zMm_7sDoK~$F zpgK6M6XI8bE}@ao&>CHj_VpNId62=jaORiM%x((@bLawTlrJXX<`p1a)oKlzFOIY} z^(@f;8_u+3%35yHvVVx?z#7?)t`DtS*3aJ^IsKKP-L{5K+dc;JHhlX*-LsT)SeMsr zWcIdYp3}3R;n_zxKg2yE_#I$YK|Lc+*YxmGio4*KtEcylr-vAM$;wU7)l5bMiU@~gq;%Xing5)!tIc1AhV6X}7WuUV{ z_$*EEne4p5b9UZmC)E^jBbttqh(L$lLOsTHd5|Y>;d~U1J+sz~je?rhOEISl^&@J3wm(3(0r8Om0nY`9&8M+IWY%6R($M&c8c*NhTD)k;!RnV>ttH<`xJ9OnARGs@n@AuXp z5f7i*sWo8Lm@6tf_lo5(giS&e zDxophoxvq->JygIUmVPiMLS!XP4=(BTNEhzBLHQ%RP;bPjtCmzZrgPjXcimoi&2=ugod>mzd5(-qXMg4x1^h^|)TJUS= zz8aV)vUwvQMf5C7bTw6}a3SmHYPg53yy54h^L%JgBz%E0{|*|^o^#F)oWQPt09Wh< zoB_$slD&*O&N$=-XKz8%rx7BtLP?0fgg{ONr_dkNj-8S7s0j%q4;T3uF5-d;9eG7L zphFkXyZwtpxDqJSS65;b_%!;Aaym^=K(gHL=&bO0}e{1rvUss06#wl+#8Ha z0xRiqoGa*0W+n$9@J#lLDgkA}lay)L@TEyp(szS9^6O~viNNhuKeA2eSw+{qW7#fYKo21N1*Q}EAS)GKMw2MZY rQLFssQ3RXj%gS}ydGiZsJR3CH{Mz!F<%|CX{h=$w literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/json_save_dec.py b/Student/rdrovdahl/lesson04/json_save/json_save/json_save_dec.py new file mode 100644 index 0000000..5af4de9 --- /dev/null +++ b/Student/rdrovdahl/lesson04/json_save/json_save/json_save_dec.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python + +""" +json_save implemented as a decorator +""" + +import json +from pathlib import Path + +from .json_save_meta import * + + +# assorted methods that will need to be added to the decorated class: +def _to_json_compat(self): + """ + converts this object to a json-compatible dict. + + returns the dict + """ + # add and __obj_type attribute, so it can be reconstructed + dic = {"__obj_type": self.__class__.__qualname__} + for attr, typ in self._attrs_to_save.items(): + dic[attr] = typ.to_json_compat(getattr(self, attr)) + return dic + + +def __eq__(self, other): + """ + default equality method that checks if all of the saved attributes + are equal + """ + for attr in self._attrs_to_save: + try: + if getattr(self, attr) != getattr(other, attr): + return False + except AttributeError: + return False + return True + +@classmethod +def _from_json_dict(cls, dic): + """ + creates an instance of this class populated by the contents of + the json compatible dict + + the object is created with __new__ before setting the attributes + + NOTE: __init__ is not called. + There should not be any extra initialization required in __init__ + """ + # create a new object + obj = cls.__new__(cls) + for attr, typ in cls._attrs_to_save.items(): + setattr(obj, attr, typ.to_python(dic[attr])) + return obj + + +def __new__(cls, *args, **kwargs): + """ + This adds instance attributes to assure they are all there, even if + they are not set in the subclasses __init__ + + it's in __new__ so that it will get called before the decorated class' + __init__ -- the __init__ will override anything here. + """ + # create the instance by calling the base class __new__ + obj = cls.__base__.__new__(cls) + # using super() did not work here -- why?? + # set the instance attributes to defaults + for attr, typ in cls._attrs_to_save.items(): + setattr(obj, attr, typ.default) + return obj + + +def _to_json(self, fp=None, indent=4): + """ + Converts the object to JSON + + :param fp=None: an open file_like object to write the json to. + If it is None, then a string with the JSON + will be returned as a string + + :param indent=4: The indentation level desired in the JSON + """ + if fp is None: + return json.dumps(self.to_json_compat(), indent=indent) + else: + json.dump(self.to_json_compat(), fp, indent=indent) + + +# now the actual decorator +def json_save(cls): + """ + json_save decorator + + makes decorated classes Saveable to json + """ + # make sure this is decorating a class object + if type(cls) is not type: + raise TypeError("json_save can only be used on classes") + + # find the saveable attributes + # these will the attributes that get saved and reconstructed from json. + # each class object gets its own dict + attr_dict = vars(cls) + cls._attrs_to_save = {} + for key, attr in attr_dict.items(): + if isinstance(attr, Saveable): + cls._attrs_to_save[key] = attr + if not cls._attrs_to_save: + raise TypeError(f"{cls.__name__} class has no saveable attributes.\n" + " Note that Savable attributes must be instances") + # register this class so we can re-construct instances. + Saveable.ALL_SAVEABLES[cls.__qualname__] = cls + + # add the methods: + cls.__new__ = __new__ + cls.to_json_compat = _to_json_compat + cls.__eq__ = __eq__ + cls.from_json_dict = _from_json_dict + cls.to_json = _to_json + + return cls + + +# utilities for loading arbitrary objects from json +def from_json_dict(j_dict): + """ + factory function that creates an arbitrary JsonSaveable + object from a json-compatible dict. + """ + # determine the class it is. + obj_type = j_dict["__obj_type"] + obj = Saveable.ALL_SAVEABLES[obj_type].from_json_dict(j_dict) + return obj + + +def from_json(_json): + """ + Factory function that re-creates a JsonSaveable object + from a json string or file + """ + if isinstance(_json, (str, Path)): + return from_json_dict(json.loads(_json)) + else: # assume a file-like object + return from_json_dict(json.load(_json)) diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/json_save_meta.py b/Student/rdrovdahl/lesson04/json_save/json_save/json_save_meta.py new file mode 100644 index 0000000..5b8dfa8 --- /dev/null +++ b/Student/rdrovdahl/lesson04/json_save/json_save/json_save_meta.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python3 + +""" +json_save + +metaclass based system for saving objects in a JSON format + +This could be useful, but it's kept simple to show the use of metaclasses + +The idea is that you subclass from JsonSavable, and then you get an object +that be saved and reloaded to/from JSON +""" + +import json + +# import * is a bad idea in general, but helpful for a modules that's part +# of a package, where you control the names. +from .saveables import * + + +class MetaJsonSaveable(type): + """ + The metaclass for creating JsonSavable classes + + Deriving from type makes it a metaclass. + + Note: the __init__ gets run at compile time, not run time. + (module import time) + """ + def __init__(cls, name, bases, attr_dict): + # it gets the class object as the first param. + # and then the same parameters as the type() factory function + + # you want to call the regular type initilizer: + super().__init__(name, bases, attr_dict) + + # here's where we work with the class attributes: + # these will the attributes that get saved and reconstructed from json. + # each class object gets its own dict + cls._attrs_to_save = {} + for key, attr in attr_dict.items(): + if isinstance(attr, Saveable): + cls._attrs_to_save[key] = attr + # special case JsonSaveable -- no attrs to save yet + if cls.__name__ != "JsonSaveable" and (not cls._attrs_to_save): + raise TypeError(f"{cls.__name__} class has no saveable attributes.\n" + " Note that Savable attributes must be instances") + + # register this class so we can re-construct instances. + Saveable.ALL_SAVEABLES[attr_dict["__qualname__"]] = cls + + +class JsonSaveable(metaclass=MetaJsonSaveable): + """ + mixin for JsonSavable objects + """ + def __new__(cls, *args, **kwargs): + """ + This adds instance attributes to assure they are all there, even if + they are not set in the subclasses __init__ + """ + # create the instance + obj = super().__new__(cls) + # set the instance attributes to defaults + for attr, typ in cls._attrs_to_save.items(): + setattr(obj, attr, typ.default) + return obj + + def __eq__(self, other): + """ + default equality method that checks if all of the saved attributes + are equal + """ + for attr in self._attrs_to_save: + try: + if getattr(self, attr) != getattr(other, attr): + return False + except AttributeError: + return False + return True + + def to_json_compat(self): + """ + converts this object to a json-compatible dict. + + returns the dict + """ + # add and __obj_type attribute, so it can be reconstructed + dic = {"__obj_type": self.__class__.__qualname__} + for attr, typ in self._attrs_to_save.items(): + dic[attr] = typ.to_json_compat(getattr(self, attr)) + return dic + + @classmethod + def from_json_dict(cls, dic): + """ + creates an instance of this class populated by the contents of + the json compatible dict + + the object is created with __new__ before setting the attributes + + NOTE: __init__ is not called. + There should not be any extra initialization required in __init__ + """ + # create a new object + obj = cls.__new__(cls) + for attr, typ in cls._attrs_to_save.items(): + setattr(obj, attr, typ.to_python(dic[attr])) + # make sure it gets initialized + # obj.__init__() + return obj + + def to_json(self, fp=None, indent=4): + """ + Converts the object to JSON + + :param fp=None: an open file_like object to write the json to. + If it is None, then a string with the JSON + will be returned as a string + + :param indent=4: The indentation level desired in the JSON + """ + if fp is None: + return json.dumps(self.to_json_compat(), indent=indent) + else: + json.dump(self.to_json_compat(), fp, indent=indent) + + def __str__(self): + msg = ["{} object, with attributes:".format(self.__class__.__qualname__)] + for attr in self._attrs_to_save.keys(): + msg.append("{}: {}".format(attr, getattr(self, attr))) + return "\n".join(msg) + + +def from_json_dict(j_dict): + """ + factory function that creates an arbitrary JsonSavable + object from a json-compatible dict. + """ + # determine the class it is. + obj_type = j_dict["__obj_type"] + obj = Saveable.ALL_SAVEABLES[obj_type].from_json_dict(j_dict) + return obj + + +def from_json(_json): + """ + factory function that re-creates a JsonSavable object + from a json string or file + """ + if isinstance(_json, str): + return from_json_dict(json.loads(_json)) + else: # assume a file-like object + return from_json_dict(json.load(_json)) + + +if __name__ == "__main__": + + # Example of using it. + class MyClass(JsonSaveable): + + x = Int() + y = Float() + l = List() + + def __init__(self, x, lst): + self.x = x + self.lst = lst + + + class OtherSaveable(JsonSavable): + + foo = String() + bar = Int() + + def __init__(self, foo, bar): + self.foo = foo + self.bar = bar + + # create one: + print("about to create a instance") + mc = MyClass(5, [3, 5, 7, 9]) + + print(mc) + + jc = mc.to_json_compat() + + # re-create it from the dict: + mc2 = MyClass.from_json_dict(jc) + + print(mc2 == "fred") + + assert mc2 == mc + + print(mc.to_json()) + + # now try it nested... + mc_nest = MyClass(34, [OtherSaveable("this", 2), + OtherSaveable("that", 64), + ]) + + mc_nest_comp = mc_nest.to_json_compat() + print(mc_nest_comp) + + # can we re-create it? + mc_nest2 = MyClass.from_json_dict(mc_nest_comp) + + print(mc_nest) + print(mc_nest2) + + assert mc_nest == mc_nest2 diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/saveables.py b/Student/rdrovdahl/lesson04/json_save/json_save/saveables.py new file mode 100644 index 0000000..16ac75f --- /dev/null +++ b/Student/rdrovdahl/lesson04/json_save/json_save/saveables.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python + +""" +The Saveable objects used by both the metaclass and decorator approach. +""" +import ast + +# import json + +__all__ = ['Bool', + 'Dict', + 'Float', + 'Int', + 'List', + 'Saveable', + 'String', + 'Tuple', + ] + + +class Saveable(): + """ + Base class for all saveable types + """ + default = None + ALL_SAVEABLES = {} + + @staticmethod + def to_json_compat(val): + """ + returns a json-compatible version of val + + should be overridden in saveable types that are not json compatible. + """ + return val + + @staticmethod + def to_python(val): + """ + convert from a json compatible version to the python version + + Must be overridden if not a one-to-one match + + This is where validation could be added as well. + """ + return val + + +class String(Saveable): + """ + A Saveable string + + Strings are the same in JSON as Python, so nothing to do here + """ + default = "" + + +class Bool(Saveable): + """ + A Saveable boolean + + Booleans are pretty much the same in JSON as Python, so nothing to do here + """ + default = False + + +class Int(Saveable): + + """ + A Saveable integer + + Integers are a little different in JSON than Python. Strictly speaking + JSON only has "numbers", which can be integer or float, so a little to + do here to make sure we get an int in Python. + """ + + default = 0 + + @staticmethod + def to_python(val): + """ + Convert a number to a python integer + """ + return int(val) + + +class Float(Saveable): + """ + A Saveable floating point number + + floats are a little different in JSON than Python. Strictly speaking + JSON only has "numbers", which can be integer or float, so a little to + do here to make sure we get a float in Python. + """ + + default = 0.0 + + @staticmethod + def to_python(val): + """ + Convert a number to a python float + """ + return float(val) + +# Container types: these need to hold Saveable objects. + + +class Tuple(Saveable): + """ + This assumes that whatever is in the tuple is Saveable or a "usual" + type: numbers, strings. + """ + default = () + + @staticmethod + def to_python(val): + """ + Convert a list to a tuple -- json only has one array type, + which matches to a list. + """ + # simply uses the List to_python method -- that part is the same. + return tuple(List.to_python(val)) + + +class List(Saveable): + """ + This assumes that whatever is in the list is Saveable or a "usual" + type: numbers, strings. + """ + default = [] + + @staticmethod + def to_json_compat(val): + lst = [] + for item in val: + try: + lst.append(item.to_json_compat()) + except AttributeError: + lst.append(item) + return lst + + @staticmethod + def to_python(val): + """ + Convert an array to a list. + + Complicated because list may contain non-json-compatible objects + """ + # try to reconstitute using the obj method + new_list = [] + for item in val: + try: + obj_type = item["__obj_type"] + obj = Saveable.ALL_SAVEABLES[obj_type].from_json_dict(item) + new_list.append(obj) + except (TypeError, KeyError): + new_list.append(item) + return new_list + + +class Dict(Saveable): + """ + This assumes that whatever in the dict is Saveable as well. + + This supports non-string keys, but all keys must be the same type. + """ + default = {} + + @staticmethod + def to_json_compat(val): + d = {} + # first key, arbitrarily + key_type = type(next(iter(val.keys()))) + if key_type is not str: + # need to add key_type to json + d['__key_not_string'] = True + key_not_string = True + else: + key_not_string = False + for key, item in val.items(): + kis = type(key) is str + if ((kis and key_not_string) or (not (kis or key_not_string))): + raise TypeError("dict keys must be all strings or no strings") + if key_type is not str: + # convert key to string + s_key = repr(key) + # make sure it can be reconstituted + if ast.literal_eval(s_key) != key: + raise ValueError(f"json save cannot save dicts with key:{key}") + else: + s_key = key + try: + d[s_key] = item.to_json_compat() + except AttributeError: + d[s_key] = item + return d + + @staticmethod + def to_python(val): + """ + Convert a json object to a dict + + Complicated because object may contain non-json-compatible objects + """ + + # try to reconstitute using the obj method + new_dict = {} + key_not_string = val.pop('__key_not_string', False) + for key, item in val.items(): + if key_not_string: + key = ast.literal_eval(key) + try: + obj_type = item["__obj_type"] + obj = Saveable.ALL_SAVEABLES[obj_type].from_json_dict(item) + new_dict[key] = obj + except (KeyError, TypeError): + new_dict[key] = item + return new_dict diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/test/__init__.py b/Student/rdrovdahl/lesson04/json_save/json_save/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/test/__pycache__/__init__.cpython-36.pyc b/Student/rdrovdahl/lesson04/json_save/json_save/test/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e82937ac00abc96ee952cf89a365d34dfc216e4d GIT binary patch literal 200 zcmXr!<>lJh(H+GA1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnuTuTc;?$yI{i2kj z{IZn9j2!*+%#xz~{1W}(03!oK3*CUql8pR3BO?P{$K>SHoYbPklGGIa;F8jm)VvZT zZ8@pM#rb&#Ci+=GD!w?eEES1Wl3HA%A0MBYmst`YuUAlci^C>2KczG$)ehvGVjyM! E0Qc}XTL1t6 literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/test/__pycache__/test_json_save_dec.cpython-36-PYTEST.pyc b/Student/rdrovdahl/lesson04/json_save/json_save/test/__pycache__/test_json_save_dec.cpython-36-PYTEST.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52aa1d9081cc6475697777c0c1c4dda3d96be234 GIT binary patch literal 12302 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 literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson04/json_save/json_save/test/__pycache__/test_savables.cpython-36-PYTEST.pyc b/Student/rdrovdahl/lesson04/json_save/json_save/test/__pycache__/test_savables.cpython-36-PYTEST.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38929e577ad0661cb4311c98379030d78fb699bd GIT binary patch literal 5094 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 python ones: +# Type, default, example +basics = [(String, "This is a string"), + (Int, 23), + (Float, 3.1458), + (Bool, True), + (Bool, False), + (List, [2, 3, 4]), + (Tuple, (1, 2, 3.4, "this")), + (List, [[1, 2, 3], [4, 5, 6]]), + (List, [{"3": 34}, {"4": 5}]), # list with dicts in it. + (Dict, {"this": {"3": 34}, "that": {"4": 5}}) # dict with dicts + ] + + +@pytest.mark.parametrize(('Type', 'val'), basics) +def test_basics(Type, val): + js = json.dumps(Type.to_json_compat(val)) + val2 = Type.to_python(json.loads(js)) + assert val == val2 + assert type(val) == type(val2) + + +nested = [(List, [(1, 2), (3, 4), (5, 6)]), # tuple in list + (Tuple, ((1, 2), (3, 4), (5, 6))), # tuple in tuple + ] + + +# This maybe should be fixed in the future?? +@pytest.mark.xfail(reason="nested not-standard types not supported") +@pytest.mark.parametrize(('Type', 'val'), nested) +def test_nested(Type, val): + print("original value:", val) + js = json.dumps(Type.to_json_compat(val)) + print("js is:", js) + val2 = Type.to_python(json.loads(js)) + print("new value is:", val2) + assert val == val2 + assert type(val) == type(val2) + + + + +dicts = [{"this": 14, "that": 1.23}, + {34: 15, 23: 5}, + {3.4: "float_key", 1.2: "float_key"}, + {(1, 2, 3): "tuple_key"}, + {(3, 4, 5): "tuple_int", ("this", "that"): "tuple_str"}, + {4: "int_key", 1.23: "float_key", (1, 2, 3): "tuple_key"}, + ] + + +@pytest.mark.parametrize('val', dicts) +def test_dicts(val): + js = json.dumps(Dict.to_json_compat(val)) + val2 = Dict.to_python(json.loads(js)) + assert val == val2 + assert type(val) == type(val2) + # check that the types of the keys is the same + for k1, k2 in zip(val.keys(), val2.keys()): + assert type(k1) is type(k2) + + +# These are dicts that can't be saved +# -- mixing string and non-string keys +bad_dicts = [{"this": "string_key", 4: "int_key"}, + {3: "int_key", "this": "string_key"}, + {None: "none_key", "this": "string_key"}, + {"this": "string_key", None: "none_key"}, + ] + + +@pytest.mark.parametrize("val", bad_dicts) +def test_bad_dicts(val): + with pytest.raises(TypeError): + Dict.to_json_compat(val) diff --git a/Student/rdrovdahl/lesson04/json_save/setup.py b/Student/rdrovdahl/lesson04/json_save/setup.py new file mode 100755 index 0000000..d85dd95 --- /dev/null +++ b/Student/rdrovdahl/lesson04/json_save/setup.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +""" +This is about as simple a setup.py as you can have + +But its enough to support the json_save package + +""" + +import os + +from setuptools import setup, find_packages + + +def get_version(): + """ + Reads the version string from the package __init__ and returns it + """ + with open(os.path.join("json_save", "__init__.py")) as init_file: + for line in init_file: + parts = line.strip().partition("=") + if parts[0].strip() == "__version__": + return parts[2].strip().strip("'").strip('"') + return None + + +setup( + name='json_save', + version=get_version(), + author='Chris Barker', + author_email='PythonCHB@gmail.com', + packages=find_packages(), + # license='LICENSE.txt', + description='Metaclass based system for saving object to JSON', + long_description=open('README.txt').read(), +) diff --git a/Student/rdrovdahl/lesson04/mailroom/.cache/v/cache/lastfailed b/Student/rdrovdahl/lesson04/mailroom/.cache/v/cache/lastfailed new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/Student/rdrovdahl/lesson04/mailroom/.cache/v/cache/lastfailed @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Student/rdrovdahl/lesson04/mailroom/__pycache__/mailroom_OO.cpython-36.pyc b/Student/rdrovdahl/lesson04/mailroom/__pycache__/mailroom_OO.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35d69dc3dd72469b93a3cbccaa846ffbc8777c3b GIT binary patch literal 10332 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 literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/__pycache__/saveables.cpython-36.pyc b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/__pycache__/saveables.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85007aeb50e8919050cd5b60dad45252a3ad287e GIT binary patch literal 5543 zcmdT|&2t+`6`xOOq}Yz*WD7QAp)pwsv$0tUY7Z$_%88S}Lhw>$S9TH04&&*zC3!TX z^t9qgC2?5gz=b_id>r7m{{%;hGsn479Jq4i#P4-WBUxGJgUW?*rqgex)!pyC-~07@ z^S$Ne`p%e)L#Ghlya>VOzv1XT4l-cGzc!nQAhH5gnnT zIEnI{MJZ=o#F>m#CRx<&$}EbTTlIfIWoxhS?qpd~cz0W|D*XFN7OBF0KUIbIpp~m4 zn66Y*_LXd<$Ay2;>n0+mA5SkAogLiyyJ&<3>sbwl+YOgH4Xg=B+Gc*%5mjCH3+bc{A%JuqLdFA+p7}NLedg z*a)l~DHch=(oE^O*=+8ua+F~p8s#tLuHr0(YKk4ntTVC9-0n-us7zz2+gDB4X=1OLp?=cK z)uNe>v^gS{rD9WMoA{4)A{94hzdC5Pa)y7WO#$PDynC8}7y{op~kfBWIR+jkz^+b@=Kg%Ii zU>+-{M}h0v_;Z$OF{JV$5bxm5ub^3sA?^ayo+P#!e4?Frdqx4dj!R=-6Qck-EK4kq zLr;S4kM=*W{a&1Gsz5YKF{ zxAk4T)bSVip8d*-5wHizqGE?2CK07ZGh!(SMzt=2TJ>3{7aOvBbv5t5vX->Ro9Alj z;>`}dWoQ=NC;XEBKz?v#Mfw;v_~)X=tyGC)A&tf$VG@kS5ldQ1fwXw*=m@?_Rq0mn zP&#q!79#+}D(SPlE20zlS1+O6pQU)*1PIpCUgr=KuironwqU{-6M*d|t26NK5uF1X zCgs8^(^E~bLa^yXCqP&aP&*auSbz+PCiTV)&P?b^g7z71B2(_-&I!;8ls&dJX}_me zAkyBQ@KeOhUTL|AnFyZlvm8tWi*>)48FW;BK#S3;mOogAU5Pl&WP2Oc^TAFrdwx`t z3$+#%bb`QhJSRr4yj=8laK9`h==2)=TWd8J-P#irr`?QfYs_H)qF?<#!Nb6cfIE+m zW9Y4~m%_;ROSeB4Bic6QP$0zDPo9I3L+oLSk&E{U|E~olnjUQOGF1Bevel zaoVlxi72tUIe}J=sMiNdZld>$QwY+#qzoN(%2IaQq2Qf_Z>O~P%ryy;NE5tfBb%Eh zRVvAd5`;*~sLyB@H_9mtGwIZUw4?B+xn|kGhFkc0PDz&4Vfq~J=Co_g0M)@oox#2q z?~*qXnp%6;qjNomSYBkX9o+d1H1o&8@q%~ZY1A7gL*^BDx~kP0G+*A++SK!o{@?se zTc)gKm$v;wG{@G+esXJQ-L-!4-pJ{%4ehoyblUb9p0|PRM|ICq&PiR~vXP40mU&O_ zeuj4+;rV|(O58+Yipu|ny-sVX?K1bLMn)($XC zo4*KtEc(U~zIH?-NX2PLxRP(t&|o@i;i9+b8*<5KxO2)Dt-$yuuvg)oHS*8O)IZac zH+aFx`~0MuB5p*>Q4$g8&|9j<=$98Ec?b71!H1Ic47Gki@X>Dvzji@IQkBU&IdOrBN#Qa={|=#r2qiXFVB@w+ zaY=t8AXs@PHMzy@AwFwt&(4@Q+?MSe7N z^TT1K`^nHK{Hmr{Ap?BiSKd3tQhu-h4KO!DJwNr2C zjjH|Cq2InR1_KPM+r$>zV2dTh&)+8T_%{rLK1NRX7_U(S)fc4hN;uTR8kG9Da4;aBnaw39O{cNv@#3 zahV)|oM*CMR0${(o~2B~hObPT@;YpAUw#!WJ`uRxtSi5bzNCX&Zc?{lT;CF$I5l;eS?}=^{h`bV$8qd&cBSts(IR#Gu|Y}u7NkFZhSqw zNzC>qT2%8Us&#ydcx&T=sqsnM0^dFmRAFc|reTsYCtb5j%4c;FYSJ#6ZB8w%An8^F k+vdy4EjoE~GJ$8KMglr#e-&@#+G-7dS61Ixy|jA$zrFVjZU6uP literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/json_save_dec.py b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/json_save_dec.py new file mode 100644 index 0000000..5af4de9 --- /dev/null +++ b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/json_save_dec.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python + +""" +json_save implemented as a decorator +""" + +import json +from pathlib import Path + +from .json_save_meta import * + + +# assorted methods that will need to be added to the decorated class: +def _to_json_compat(self): + """ + converts this object to a json-compatible dict. + + returns the dict + """ + # add and __obj_type attribute, so it can be reconstructed + dic = {"__obj_type": self.__class__.__qualname__} + for attr, typ in self._attrs_to_save.items(): + dic[attr] = typ.to_json_compat(getattr(self, attr)) + return dic + + +def __eq__(self, other): + """ + default equality method that checks if all of the saved attributes + are equal + """ + for attr in self._attrs_to_save: + try: + if getattr(self, attr) != getattr(other, attr): + return False + except AttributeError: + return False + return True + +@classmethod +def _from_json_dict(cls, dic): + """ + creates an instance of this class populated by the contents of + the json compatible dict + + the object is created with __new__ before setting the attributes + + NOTE: __init__ is not called. + There should not be any extra initialization required in __init__ + """ + # create a new object + obj = cls.__new__(cls) + for attr, typ in cls._attrs_to_save.items(): + setattr(obj, attr, typ.to_python(dic[attr])) + return obj + + +def __new__(cls, *args, **kwargs): + """ + This adds instance attributes to assure they are all there, even if + they are not set in the subclasses __init__ + + it's in __new__ so that it will get called before the decorated class' + __init__ -- the __init__ will override anything here. + """ + # create the instance by calling the base class __new__ + obj = cls.__base__.__new__(cls) + # using super() did not work here -- why?? + # set the instance attributes to defaults + for attr, typ in cls._attrs_to_save.items(): + setattr(obj, attr, typ.default) + return obj + + +def _to_json(self, fp=None, indent=4): + """ + Converts the object to JSON + + :param fp=None: an open file_like object to write the json to. + If it is None, then a string with the JSON + will be returned as a string + + :param indent=4: The indentation level desired in the JSON + """ + if fp is None: + return json.dumps(self.to_json_compat(), indent=indent) + else: + json.dump(self.to_json_compat(), fp, indent=indent) + + +# now the actual decorator +def json_save(cls): + """ + json_save decorator + + makes decorated classes Saveable to json + """ + # make sure this is decorating a class object + if type(cls) is not type: + raise TypeError("json_save can only be used on classes") + + # find the saveable attributes + # these will the attributes that get saved and reconstructed from json. + # each class object gets its own dict + attr_dict = vars(cls) + cls._attrs_to_save = {} + for key, attr in attr_dict.items(): + if isinstance(attr, Saveable): + cls._attrs_to_save[key] = attr + if not cls._attrs_to_save: + raise TypeError(f"{cls.__name__} class has no saveable attributes.\n" + " Note that Savable attributes must be instances") + # register this class so we can re-construct instances. + Saveable.ALL_SAVEABLES[cls.__qualname__] = cls + + # add the methods: + cls.__new__ = __new__ + cls.to_json_compat = _to_json_compat + cls.__eq__ = __eq__ + cls.from_json_dict = _from_json_dict + cls.to_json = _to_json + + return cls + + +# utilities for loading arbitrary objects from json +def from_json_dict(j_dict): + """ + factory function that creates an arbitrary JsonSaveable + object from a json-compatible dict. + """ + # determine the class it is. + obj_type = j_dict["__obj_type"] + obj = Saveable.ALL_SAVEABLES[obj_type].from_json_dict(j_dict) + return obj + + +def from_json(_json): + """ + Factory function that re-creates a JsonSaveable object + from a json string or file + """ + if isinstance(_json, (str, Path)): + return from_json_dict(json.loads(_json)) + else: # assume a file-like object + return from_json_dict(json.load(_json)) diff --git a/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/json_save_meta.py b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/json_save_meta.py new file mode 100644 index 0000000..5b8dfa8 --- /dev/null +++ b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/json_save_meta.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python3 + +""" +json_save + +metaclass based system for saving objects in a JSON format + +This could be useful, but it's kept simple to show the use of metaclasses + +The idea is that you subclass from JsonSavable, and then you get an object +that be saved and reloaded to/from JSON +""" + +import json + +# import * is a bad idea in general, but helpful for a modules that's part +# of a package, where you control the names. +from .saveables import * + + +class MetaJsonSaveable(type): + """ + The metaclass for creating JsonSavable classes + + Deriving from type makes it a metaclass. + + Note: the __init__ gets run at compile time, not run time. + (module import time) + """ + def __init__(cls, name, bases, attr_dict): + # it gets the class object as the first param. + # and then the same parameters as the type() factory function + + # you want to call the regular type initilizer: + super().__init__(name, bases, attr_dict) + + # here's where we work with the class attributes: + # these will the attributes that get saved and reconstructed from json. + # each class object gets its own dict + cls._attrs_to_save = {} + for key, attr in attr_dict.items(): + if isinstance(attr, Saveable): + cls._attrs_to_save[key] = attr + # special case JsonSaveable -- no attrs to save yet + if cls.__name__ != "JsonSaveable" and (not cls._attrs_to_save): + raise TypeError(f"{cls.__name__} class has no saveable attributes.\n" + " Note that Savable attributes must be instances") + + # register this class so we can re-construct instances. + Saveable.ALL_SAVEABLES[attr_dict["__qualname__"]] = cls + + +class JsonSaveable(metaclass=MetaJsonSaveable): + """ + mixin for JsonSavable objects + """ + def __new__(cls, *args, **kwargs): + """ + This adds instance attributes to assure they are all there, even if + they are not set in the subclasses __init__ + """ + # create the instance + obj = super().__new__(cls) + # set the instance attributes to defaults + for attr, typ in cls._attrs_to_save.items(): + setattr(obj, attr, typ.default) + return obj + + def __eq__(self, other): + """ + default equality method that checks if all of the saved attributes + are equal + """ + for attr in self._attrs_to_save: + try: + if getattr(self, attr) != getattr(other, attr): + return False + except AttributeError: + return False + return True + + def to_json_compat(self): + """ + converts this object to a json-compatible dict. + + returns the dict + """ + # add and __obj_type attribute, so it can be reconstructed + dic = {"__obj_type": self.__class__.__qualname__} + for attr, typ in self._attrs_to_save.items(): + dic[attr] = typ.to_json_compat(getattr(self, attr)) + return dic + + @classmethod + def from_json_dict(cls, dic): + """ + creates an instance of this class populated by the contents of + the json compatible dict + + the object is created with __new__ before setting the attributes + + NOTE: __init__ is not called. + There should not be any extra initialization required in __init__ + """ + # create a new object + obj = cls.__new__(cls) + for attr, typ in cls._attrs_to_save.items(): + setattr(obj, attr, typ.to_python(dic[attr])) + # make sure it gets initialized + # obj.__init__() + return obj + + def to_json(self, fp=None, indent=4): + """ + Converts the object to JSON + + :param fp=None: an open file_like object to write the json to. + If it is None, then a string with the JSON + will be returned as a string + + :param indent=4: The indentation level desired in the JSON + """ + if fp is None: + return json.dumps(self.to_json_compat(), indent=indent) + else: + json.dump(self.to_json_compat(), fp, indent=indent) + + def __str__(self): + msg = ["{} object, with attributes:".format(self.__class__.__qualname__)] + for attr in self._attrs_to_save.keys(): + msg.append("{}: {}".format(attr, getattr(self, attr))) + return "\n".join(msg) + + +def from_json_dict(j_dict): + """ + factory function that creates an arbitrary JsonSavable + object from a json-compatible dict. + """ + # determine the class it is. + obj_type = j_dict["__obj_type"] + obj = Saveable.ALL_SAVEABLES[obj_type].from_json_dict(j_dict) + return obj + + +def from_json(_json): + """ + factory function that re-creates a JsonSavable object + from a json string or file + """ + if isinstance(_json, str): + return from_json_dict(json.loads(_json)) + else: # assume a file-like object + return from_json_dict(json.load(_json)) + + +if __name__ == "__main__": + + # Example of using it. + class MyClass(JsonSaveable): + + x = Int() + y = Float() + l = List() + + def __init__(self, x, lst): + self.x = x + self.lst = lst + + + class OtherSaveable(JsonSavable): + + foo = String() + bar = Int() + + def __init__(self, foo, bar): + self.foo = foo + self.bar = bar + + # create one: + print("about to create a instance") + mc = MyClass(5, [3, 5, 7, 9]) + + print(mc) + + jc = mc.to_json_compat() + + # re-create it from the dict: + mc2 = MyClass.from_json_dict(jc) + + print(mc2 == "fred") + + assert mc2 == mc + + print(mc.to_json()) + + # now try it nested... + mc_nest = MyClass(34, [OtherSaveable("this", 2), + OtherSaveable("that", 64), + ]) + + mc_nest_comp = mc_nest.to_json_compat() + print(mc_nest_comp) + + # can we re-create it? + mc_nest2 = MyClass.from_json_dict(mc_nest_comp) + + print(mc_nest) + print(mc_nest2) + + assert mc_nest == mc_nest2 diff --git a/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/saveables.py b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/saveables.py new file mode 100644 index 0000000..16ac75f --- /dev/null +++ b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/saveables.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python + +""" +The Saveable objects used by both the metaclass and decorator approach. +""" +import ast + +# import json + +__all__ = ['Bool', + 'Dict', + 'Float', + 'Int', + 'List', + 'Saveable', + 'String', + 'Tuple', + ] + + +class Saveable(): + """ + Base class for all saveable types + """ + default = None + ALL_SAVEABLES = {} + + @staticmethod + def to_json_compat(val): + """ + returns a json-compatible version of val + + should be overridden in saveable types that are not json compatible. + """ + return val + + @staticmethod + def to_python(val): + """ + convert from a json compatible version to the python version + + Must be overridden if not a one-to-one match + + This is where validation could be added as well. + """ + return val + + +class String(Saveable): + """ + A Saveable string + + Strings are the same in JSON as Python, so nothing to do here + """ + default = "" + + +class Bool(Saveable): + """ + A Saveable boolean + + Booleans are pretty much the same in JSON as Python, so nothing to do here + """ + default = False + + +class Int(Saveable): + + """ + A Saveable integer + + Integers are a little different in JSON than Python. Strictly speaking + JSON only has "numbers", which can be integer or float, so a little to + do here to make sure we get an int in Python. + """ + + default = 0 + + @staticmethod + def to_python(val): + """ + Convert a number to a python integer + """ + return int(val) + + +class Float(Saveable): + """ + A Saveable floating point number + + floats are a little different in JSON than Python. Strictly speaking + JSON only has "numbers", which can be integer or float, so a little to + do here to make sure we get a float in Python. + """ + + default = 0.0 + + @staticmethod + def to_python(val): + """ + Convert a number to a python float + """ + return float(val) + +# Container types: these need to hold Saveable objects. + + +class Tuple(Saveable): + """ + This assumes that whatever is in the tuple is Saveable or a "usual" + type: numbers, strings. + """ + default = () + + @staticmethod + def to_python(val): + """ + Convert a list to a tuple -- json only has one array type, + which matches to a list. + """ + # simply uses the List to_python method -- that part is the same. + return tuple(List.to_python(val)) + + +class List(Saveable): + """ + This assumes that whatever is in the list is Saveable or a "usual" + type: numbers, strings. + """ + default = [] + + @staticmethod + def to_json_compat(val): + lst = [] + for item in val: + try: + lst.append(item.to_json_compat()) + except AttributeError: + lst.append(item) + return lst + + @staticmethod + def to_python(val): + """ + Convert an array to a list. + + Complicated because list may contain non-json-compatible objects + """ + # try to reconstitute using the obj method + new_list = [] + for item in val: + try: + obj_type = item["__obj_type"] + obj = Saveable.ALL_SAVEABLES[obj_type].from_json_dict(item) + new_list.append(obj) + except (TypeError, KeyError): + new_list.append(item) + return new_list + + +class Dict(Saveable): + """ + This assumes that whatever in the dict is Saveable as well. + + This supports non-string keys, but all keys must be the same type. + """ + default = {} + + @staticmethod + def to_json_compat(val): + d = {} + # first key, arbitrarily + key_type = type(next(iter(val.keys()))) + if key_type is not str: + # need to add key_type to json + d['__key_not_string'] = True + key_not_string = True + else: + key_not_string = False + for key, item in val.items(): + kis = type(key) is str + if ((kis and key_not_string) or (not (kis or key_not_string))): + raise TypeError("dict keys must be all strings or no strings") + if key_type is not str: + # convert key to string + s_key = repr(key) + # make sure it can be reconstituted + if ast.literal_eval(s_key) != key: + raise ValueError(f"json save cannot save dicts with key:{key}") + else: + s_key = key + try: + d[s_key] = item.to_json_compat() + except AttributeError: + d[s_key] = item + return d + + @staticmethod + def to_python(val): + """ + Convert a json object to a dict + + Complicated because object may contain non-json-compatible objects + """ + + # try to reconstitute using the obj method + new_dict = {} + key_not_string = val.pop('__key_not_string', False) + for key, item in val.items(): + if key_not_string: + key = ast.literal_eval(key) + try: + obj_type = item["__obj_type"] + obj = Saveable.ALL_SAVEABLES[obj_type].from_json_dict(item) + new_dict[key] = obj + except (KeyError, TypeError): + new_dict[key] = item + return new_dict diff --git a/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__init__.py b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__pycache__/__init__.cpython-36.pyc b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c64ac9e9c0774d38ed7dd132423c5ec53dc5adce GIT binary patch literal 209 zcmXr!<>hiHl!;~lg2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(SDk)nacWVqeo;zM zepyOlMvi`ZW=TFD)Nk)F2k&%I}V{&q8PHItNNotCIa7k%OYF-JF zww%=B;`}@V6aC!8%p9Nrx%yc^etdCaSt=5%B(=CiKR!M)FS8^*Uaz3?7Kcr4eoARh MsvXE(#X!se0A21n^#A|> literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__pycache__/test_json_save_dec.cpython-36-PYTEST.pyc b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__pycache__/test_json_save_dec.cpython-36-PYTEST.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ed0dcd83630d630b2a8e4cda7dfe8f1ebdc9d62 GIT binary patch literal 12311 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 literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__pycache__/test_savables.cpython-36-PYTEST.pyc b/Student/rdrovdahl/lesson04/mailroom/json_save/json_save/test/__pycache__/test_savables.cpython-36-PYTEST.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38929e577ad0661cb4311c98379030d78fb699bd GIT binary patch literal 5094 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 python ones: +# Type, default, example +basics = [(String, "This is a string"), + (Int, 23), + (Float, 3.1458), + (Bool, True), + (Bool, False), + (List, [2, 3, 4]), + (Tuple, (1, 2, 3.4, "this")), + (List, [[1, 2, 3], [4, 5, 6]]), + (List, [{"3": 34}, {"4": 5}]), # list with dicts in it. + (Dict, {"this": {"3": 34}, "that": {"4": 5}}) # dict with dicts + ] + + +@pytest.mark.parametrize(('Type', 'val'), basics) +def test_basics(Type, val): + js = json.dumps(Type.to_json_compat(val)) + val2 = Type.to_python(json.loads(js)) + assert val == val2 + assert type(val) == type(val2) + + +nested = [(List, [(1, 2), (3, 4), (5, 6)]), # tuple in list + (Tuple, ((1, 2), (3, 4), (5, 6))), # tuple in tuple + ] + + +# This maybe should be fixed in the future?? +@pytest.mark.xfail(reason="nested not-standard types not supported") +@pytest.mark.parametrize(('Type', 'val'), nested) +def test_nested(Type, val): + print("original value:", val) + js = json.dumps(Type.to_json_compat(val)) + print("js is:", js) + val2 = Type.to_python(json.loads(js)) + print("new value is:", val2) + assert val == val2 + assert type(val) == type(val2) + + + + +dicts = [{"this": 14, "that": 1.23}, + {34: 15, 23: 5}, + {3.4: "float_key", 1.2: "float_key"}, + {(1, 2, 3): "tuple_key"}, + {(3, 4, 5): "tuple_int", ("this", "that"): "tuple_str"}, + {4: "int_key", 1.23: "float_key", (1, 2, 3): "tuple_key"}, + ] + + +@pytest.mark.parametrize('val', dicts) +def test_dicts(val): + js = json.dumps(Dict.to_json_compat(val)) + val2 = Dict.to_python(json.loads(js)) + assert val == val2 + assert type(val) == type(val2) + # check that the types of the keys is the same + for k1, k2 in zip(val.keys(), val2.keys()): + assert type(k1) is type(k2) + + +# These are dicts that can't be saved +# -- mixing string and non-string keys +bad_dicts = [{"this": "string_key", 4: "int_key"}, + {3: "int_key", "this": "string_key"}, + {None: "none_key", "this": "string_key"}, + {"this": "string_key", None: "none_key"}, + ] + + +@pytest.mark.parametrize("val", bad_dicts) +def test_bad_dicts(val): + with pytest.raises(TypeError): + Dict.to_json_compat(val) diff --git a/Student/rdrovdahl/lesson04/mailroom/json_save/setup.py b/Student/rdrovdahl/lesson04/mailroom/json_save/setup.py new file mode 100644 index 0000000..d85dd95 --- /dev/null +++ b/Student/rdrovdahl/lesson04/mailroom/json_save/setup.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +""" +This is about as simple a setup.py as you can have + +But its enough to support the json_save package + +""" + +import os + +from setuptools import setup, find_packages + + +def get_version(): + """ + Reads the version string from the package __init__ and returns it + """ + with open(os.path.join("json_save", "__init__.py")) as init_file: + for line in init_file: + parts = line.strip().partition("=") + if parts[0].strip() == "__version__": + return parts[2].strip().strip("'").strip('"') + return None + + +setup( + name='json_save', + version=get_version(), + author='Chris Barker', + author_email='PythonCHB@gmail.com', + packages=find_packages(), + # license='LICENSE.txt', + description='Metaclass based system for saving object to JSON', + long_description=open('README.txt').read(), +) diff --git a/Student/rdrovdahl/lesson04/mailroom/mail_db.json b/Student/rdrovdahl/lesson04/mailroom/mail_db.json new file mode 100644 index 0000000..af4923d --- /dev/null +++ b/Student/rdrovdahl/lesson04/mailroom/mail_db.json @@ -0,0 +1,11 @@ +{ + "__obj_type": "DonorDB", + "name": "Red Skull", + "donations": [ + 1000, + 2000, + 3000 + ], + "status": "Villian", + "location": "Europe" +} \ No newline at end of file diff --git a/Student/rdrovdahl/lesson04/mailroom/mail_db2.json b/Student/rdrovdahl/lesson04/mailroom/mail_db2.json new file mode 100644 index 0000000..af4923d --- /dev/null +++ b/Student/rdrovdahl/lesson04/mailroom/mail_db2.json @@ -0,0 +1,11 @@ +{ + "__obj_type": "DonorDB", + "name": "Red Skull", + "donations": [ + 1000, + 2000, + 3000 + ], + "status": "Villian", + "location": "Europe" +} \ No newline at end of file diff --git a/Student/rdrovdahl/lesson04/mailroom/mailroom_META.py b/Student/rdrovdahl/lesson04/mailroom/mailroom_META.py new file mode 100644 index 0000000..65f45c7 --- /dev/null +++ b/Student/rdrovdahl/lesson04/mailroom/mailroom_META.py @@ -0,0 +1,78 @@ +#! /usr/local/bin/python3 +''' +this code shows how to use metapgramming with a decorator +the json_save module will allow saving an object to a JSON file and the reading +of a JSON file to create an object + +this is a snippet of the code used in the mailroom program developed in the +first class series +''' + +import sys +sys.path.insert(0, './json_save') +import json_save.json_save_dec as js + + +donors_db_dict = {'Iron Man': ('Iron Man', ([100000, 50000, 1000], 'Hero', 'USA')), + 'Thor': ('Thor', ([50, 25, 100], 'Hero', 'Earth')), + 'Hulk': ('Hulk', ([500], 'Unaffiliated', 'Unknown')), + 'Winter Soldier': ('Winter Soldier', ([360, 480], 'Villian', 'USSR')), + 'Captain America': ('Captain America', ([30, 40], 'Hero', 'USA')), + 'Nick Fury': ('Nick Fury', ([100000, 545, 1000], 'Retired', 'Unknown')), + 'Hawkeye': ('Hawkeye', ([75, 50, 20], 'Hero', 'USA')), + 'Ultron': ('Ultron', ([50000, 40000, 50000], 'Villian', 'DarkWeb')), + 'Black Panther': ('Black Panther', ([100, 900, 50], 'Unaffiliated', 'Africa')), + 'War Machine': ('War Machine', ([10, 10], 'Unaffiliated', 'USA')), + 'Red Skull': ('Red Skull', ([1000, 2000, 3000], 'Villian', 'Europe')) + } + + +@js.json_save +class DonorDB(): + name = js.String() + donations = js.List() + status = js.String() + location = js.String() + + def __init__(self, name=None, donations=None, status=None, location=None): + self.name = name + self.donations = [] if donations is None else donations + self.status = status + self.location = location + + +def write_object_to_file(my_object): + with open("mail_db.json", 'w') as tempfile: # Can change 'w' to 'a' but the from_json doesn't like the formatting + tempfile.write(my_object.to_json()) + +def read_object_from_file(my_file): + with open(my_file) as tempfile: + reconstructed_donor = js.from_json(tempfile) + assert reconstructed_donor.name == 'Red Skull' + +if __name__ == '__main__': + dd = {} + for x in donors_db_dict.items(): + name = (x[1][0]) + # instantiate an object for every donor in the dictionary + dd[name] = DonorDB(name, x[1][1][0], x[1][1][1], x[1][1][2]) + # now write the objects to a JSON file + # found that the JSON file is readable by the from_json method with + # only a single object entry in it + # as a result, the file will be rewritten with every pass through this + # loop and only contain the last entry + write_object_to_file(dd[name]) + # show the dictionary of instances + for k, v in dd.items(): + print(k, v) + # now we can get specific instance details as follows: + # print(dd['Thor'].donations) + # print(dd['Thor'].status) + # example of how to set attribute values + # dd['Black Panther'].donations = [100, 200, 100] + # example of how to append donation values to existing list + # dd['Black Panther'].donations.append(555) + + # the following is a call to read a JSON file which has a single object + # for a donor named 'Red Skull' + read_object_from_file('mail_db2.json') diff --git a/Student/rdrovdahl/lesson04/mangler.py b/Student/rdrovdahl/lesson04/mangler.py new file mode 100644 index 0000000..6e65d1d --- /dev/null +++ b/Student/rdrovdahl/lesson04/mangler.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 + +""" +Simple metaclass example that creates upper and lower case versions of +all non-dunder class attributes + +modified such that setting an attribute f.x also sets f.xx +""" + + +class NameMangler(type): # deriving from type makes it a metaclass. + + def __new__(cls, clsname, bases, _dict): + uppercase_attr = {} + for name, val in _dict.items(): + if not name.startswith('__'): + uppercase_attr[name.upper()] = val + uppercase_attr[name.upper()*2] = val + uppercase_attr[name.lower()] = val + uppercase_attr[name.lower()*2] = val + else: + uppercase_attr[name] = val + + return super().__new__(cls, clsname, bases, uppercase_attr) + + +class Foo(metaclass=NameMangler): + x = 1 + Y = 2 + + +# note that it works for methods, too! +class Bar(metaclass=NameMangler): + x = 1 + + def a_method(self): + print("in a_method") + + +if __name__ == "__main__": + f = Foo() + print(f.x) + print(f.X) + print(f.y) + print(f.Y) + + b = Bar() + b.A_METHOD() diff --git a/Student/rdrovdahl/lesson04/mangler_dec.py b/Student/rdrovdahl/lesson04/mangler_dec.py new file mode 100644 index 0000000..3b6651a --- /dev/null +++ b/Student/rdrovdahl/lesson04/mangler_dec.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 + +""" +class decorator that adds both upper and lower case versions of +class attributes. + +Same as the NameMangler metaclass, but with a class decorator instead + +Usage example: + +@name_mangler +class Foo: + x = 1 + +f = Foo() +print(f.x) +print(f.X) +""" + + +def name_mangler(cls): + """ + Class decorator that adds upper and lower case names to the + decorated class + """ + # get the dictionary of class attributes + att_dict = vars(cls) + # create a new dict to hold the attributes + new_attrs = {} + # loop thorough all the class attributes + for name, val in att_dict.items(): + # skip all the "dunder" attributes + if not name.startswith("__"): + # Create both upper and lower case versions of all non-dunder names + # They are stored in the new_attrs dict, as you can't + # update the class namespace while looping through it. + new_attrs[name.upper()] = val + new_attrs[name.lower()] = val + # Add the new names to the cls attributes + # you can't directly update the __dict__ -- class __dict__s are not + # writable. + for name, val in new_attrs.items(): + setattr(cls, name, val) + return cls + + +@name_mangler +class Foo: + x = 1 + Y = 2 + + +# note that it works for methods, too! +@name_mangler +class Bar: + x = 1 + + def a_method(self): + print("in a_method") + + +if __name__ == "__main__": + f = Foo() + print(f.x) + print(f.X) + print(f.y) + print(f.Y) + + b = Bar() + b.A_METHOD() diff --git a/Student/rdrovdahl/lesson04/singleton.py b/Student/rdrovdahl/lesson04/singleton.py new file mode 100644 index 0000000..890082b --- /dev/null +++ b/Student/rdrovdahl/lesson04/singleton.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +""" +example of using __metaclass__ to impliment the singleton pattern +""" + + +class Singleton(type): + instance = None + + def __call__(cls, *args, **kwargs): + if cls.instance is None: + cls.instance = super().__call__(*args, **kwargs) + return cls.instance + + +class MyClass(metaclass=Singleton): + pass + +object1 = MyClass() +object2 = MyClass() + +print(id(object1)) +print(id(object2)) From 6994f8bee09db44dce9fa08f89a72922854feebe Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Sun, 10 Jun 2018 21:55:44 -0700 Subject: [PATCH 09/19] adding lesson 5 assignments to repo --- Student/rdrovdahl/lesson05/2018-06-10.log | 6 + .../__pycache__/logging.cpython-36.pyc | Bin 0 -> 738 bytes .../lesson05/debugging troubleshooting.txt | 173 ++++++++++++++++++ Student/rdrovdahl/lesson05/pysyslog.py | 37 ++++ Student/rdrovdahl/lesson05/recursive_debug.py | 18 ++ Student/rdrovdahl/lesson05/simple.py | 72 ++++++++ Student/rdrovdahl/lesson05/syslog.log | Bin 0 -> 300 bytes 7 files changed, 306 insertions(+) create mode 100644 Student/rdrovdahl/lesson05/2018-06-10.log create mode 100644 Student/rdrovdahl/lesson05/__pycache__/logging.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson05/debugging troubleshooting.txt create mode 100644 Student/rdrovdahl/lesson05/pysyslog.py create mode 100644 Student/rdrovdahl/lesson05/recursive_debug.py create mode 100644 Student/rdrovdahl/lesson05/simple.py create mode 100644 Student/rdrovdahl/lesson05/syslog.log diff --git a/Student/rdrovdahl/lesson05/2018-06-10.log b/Student/rdrovdahl/lesson05/2018-06-10.log new file mode 100644 index 0000000..35abaab --- /dev/null +++ b/Student/rdrovdahl/lesson05/2018-06-10.log @@ -0,0 +1,6 @@ +2018-06-10 21:53:51,361 simple.py:65 WARNING The value of i is 50. +2018-06-10 21:53:51,361 simple.py:69 ERROR Tried to divide by zero. Var i was 50. Recovered gracefully. +2018-06-10 21:53:53,757 simple.py:65 WARNING The value of i is 50. +2018-06-10 21:53:53,757 simple.py:69 ERROR Tried to divide by zero. Var i was 50. Recovered gracefully. +2018-06-10 21:53:56,839 simple.py:65 WARNING The value of i is 50. +2018-06-10 21:53:56,839 simple.py:69 ERROR Tried to divide by zero. Var i was 50. Recovered gracefully. diff --git a/Student/rdrovdahl/lesson05/__pycache__/logging.cpython-36.pyc b/Student/rdrovdahl/lesson05/__pycache__/logging.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d93b437183d488657671422869ac11fa679e5479 GIT binary patch literal 738 zcmYjP!EO^V5VbeE$tpA@9FRar z5ni7H8GC32prY{IqeS>3_(u9Z1fqE1*=_Je>6&7ko{&bk!fMi8Jge2Yi&Hs)hGVt* zP%6+o2Ty8sB{gW%*xDADQ7{AbH-%^d&hZ3k4KEAUsjN6OcEZz`=8bWoZnA-Pfab>N zK8qCZUXp9?ki0*;qA4AFOPVWMQsJS(hZre{LLQk{^VpK!BM%5AJ@RS8C#io?wjU^B zN{|@{e_YJ#bN)MIyhZEbi{NxY*XA--9dwJkrz2o9uBO1ukVz&T+i5o!d#6@{V5wn3 z&ZGb~n6m{~(`0AdBJGkp_T{R{jv+QPut-fTk6}1fYTj&=vcPhkKvq&FNu*A)K)_&{ zWTi`Pb&l`!vDqQEcGBn<)*71ykZ-nts_@;Y&ZzuBYz5)(^VS;&*0rp#W+wPZwGx?H zW75{iQK$WAck5`Lj*RYf+FSc^3<@kyL9|ZNsQ{hcC{y@ljBf9={^@FdoM*+!JQ_}Q zh!?pkIzp?oOhYsePn*=<##k0c(S%DKMJs`@QM5(e)?%|;1MXyeVDwPpguVUa?(6QW k|5f>45k>1cZn({L&%KEeQw2}+nOzxO==rqjh2@a`0R>0D*#H0l literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson05/debugging troubleshooting.txt b/Student/rdrovdahl/lesson05/debugging troubleshooting.txt new file mode 100644 index 0000000..095714f --- /dev/null +++ b/Student/rdrovdahl/lesson05/debugging troubleshooting.txt @@ -0,0 +1,173 @@ +Launching program in debugging mode with a variable value of ’10’: +Ryans-MacBook-Pro:lesson05 rdrovdahl$ python3 -m pdb recursive_debug.py 10 +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(6)() +-> ''' + + +Performing a long list to display the whole program: +(Pdb) ll + 1 #! /usr/local/bin/python3 + 2 + 3 + 4 ''' + 5 use this program to exercise debugging techniques + 6 -> ''' + 7 + 8 import sys + 9 + 10 + 11 def my_fun(n): + 12 if n == 2: + 13 return True + 14 return my_fun(n/2) + 15 + 16 if __name__ == '__main__': + 17 n = int(sys.argv[1]) + 18 print(my_fun(n)) + + +Stepping through the program to find where error is occurring: +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(8)() +-> import sys +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(11)() +-> def my_fun(n): +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(16)() +-> if __name__ == '__main__': +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(17)() +-> n = int(sys.argv[1]) +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(18)() +-> print(my_fun(n)) +(Pdb) n +Traceback (most recent call last): + File "/anaconda3/lib/python3.6/pdb.py", line 1667, in main + pdb._runscript(mainpyfile) + File "/anaconda3/lib/python3.6/pdb.py", line 1548, in _runscript + self.run(statement) + File "/anaconda3/lib/python3.6/bdb.py", line 431, in run + exec(cmd, globals, locals) + File "", line 1, in + File "/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py", line 18, in + print(my_fun(n)) + File "/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py", line 14, in my_fun + return my_fun(n/2) + File "/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py", line 14, in my_fun + return my_fun(n/2) + File "/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py", line 14, in my_fun + return my_fun(n/2) + [Previous line repeated 980 more times] + File "/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py", line 11, in my_fun + def my_fun(n): + File "/anaconda3/lib/python3.6/bdb.py", line 50, in trace_dispatch + return self.dispatch_call(frame, arg) + File "/anaconda3/lib/python3.6/bdb.py", line 76, in dispatch_call + if not (self.stop_here(frame) or self.break_anywhere(frame)): + File "/anaconda3/lib/python3.6/bdb.py", line 173, in break_anywhere + return self.canonic(frame.f_code.co_filename) in self.breaks + File "/anaconda3/lib/python3.6/bdb.py", line 29, in canonic + if filename == "<" + filename[1:-1] + ">": +RecursionError: maximum recursion depth exceeded in comparison +Uncaught exception. Entering post mortem debugging +Running 'cont' or 'step' will restart the program +> /anaconda3/lib/python3.6/bdb.py(29)canonic() +-> if filename == "<" + filename[1:-1] + ">": +As per above, the error is the maximum recursion depth exceeded in the my_fun function + +Restarting and stepping into the my_fun function and showing the value of n every time recursion occurs: +Ryans-MacBook-Pro:lesson05 rdrovdahl$ python3 -m pdb recursive_debug.py 10 +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(6)() +-> ''' +(Pdb) ll + 1 #! /usr/local/bin/python3 + 2 + 3 + 4 ''' + 5 use this program to exercise debugging techniques + 6 -> ''' + 7 + 8 import sys + 9 + 10 + 11 def my_fun(n): + 12 if n == 2: + 13 return True + 14 return my_fun(n/2) + 15 + 16 if __name__ == '__main__': + 17 n = int(sys.argv[1]) + 18 print(my_fun(n)) +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(8)() +-> import sys +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(11)() +-> def my_fun(n): +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(16)() +-> if __name__ == '__main__': +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(17)() +-> n = int(sys.argv[1]) +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(18)() +-> print(my_fun(n)) +(Pdb) s +--Call-- +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(11)my_fun() +-> def my_fun(n): +(Pdb) pp n +10 +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(12)my_fun() +-> if n == 2: +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(14)my_fun() +-> return my_fun(n/2) +(Pdb) s +--Call-- +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(11)my_fun() +-> def my_fun(n): +(Pdb) pp n +5.0 +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(12)my_fun() +-> if n == 2: +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(14)my_fun() +-> return my_fun(n/2) +(Pdb) s +--Call-- +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(11)my_fun() +-> def my_fun(n): +(Pdb) pp n +2.5 +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(12)my_fun() +-> if n == 2: +(Pdb) n +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(14)my_fun() +-> return my_fun(n/2) +(Pdb) s +--Call-- +> /Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson05/recursive_debug.py(11)my_fun() +-> def my_fun(n): +(Pdb) pp n +1.25 +(Pdb) +At this point, the value of n is 1.25 which is less than 2. 2 is the only value which will stop the recursive loop. +N will continue to decrease in value with each recursive loop and has no way of ever reaching 2 which is why we are seeing the recursive maximum depth error. + +The issue with the function is that it only works with variables which are factors of 2. + + + + + + + + + diff --git a/Student/rdrovdahl/lesson05/pysyslog.py b/Student/rdrovdahl/lesson05/pysyslog.py new file mode 100644 index 0000000..49f6831 --- /dev/null +++ b/Student/rdrovdahl/lesson05/pysyslog.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +## Tiny Syslog Server in Python. +## +## This is a tiny syslog server that is able to receive UDP based syslog +## entries on a specified port and save them to a file. +## That's it... it does nothing else... +## There are a few configuration parameters. + +LOG_FILE = 'syslog.log' +HOST, PORT = "127.0.0.1", 514 + +# +# NO USER SERVICEABLE PARTS BELOW HERE... +# + +import logging +import socketserver + +logging.basicConfig(level=logging.INFO, format='%(message)s', datefmt='', filename=LOG_FILE, filemode='a') + +class SyslogUDPHandler(socketserver.BaseRequestHandler): + + def handle(self): + data = bytes.decode(self.request[0].strip()) + socket = self.request[1] + print( "%s : " % self.client_address[0], str(data)) + logging.info(str(data)) + +if __name__ == "__main__": + try: + server = socketserver.UDPServer((HOST,PORT), SyslogUDPHandler) + server.serve_forever(poll_interval=0.5) + except (IOError, SystemExit): + raise + except KeyboardInterrupt: + print ("Crtl+C Pressed. Shutting down.") diff --git a/Student/rdrovdahl/lesson05/recursive_debug.py b/Student/rdrovdahl/lesson05/recursive_debug.py new file mode 100644 index 0000000..5d5c5ac --- /dev/null +++ b/Student/rdrovdahl/lesson05/recursive_debug.py @@ -0,0 +1,18 @@ +#! /usr/local/bin/python3 + + +''' +use this program to exercise debugging techniques +''' + +import sys + + +def my_fun(n): + if n == 2: + return True + return my_fun(n/2) + +if __name__ == '__main__': + n = int(sys.argv[1]) + print(my_fun(n)) diff --git a/Student/rdrovdahl/lesson05/simple.py b/Student/rdrovdahl/lesson05/simple.py new file mode 100644 index 0000000..97ef684 --- /dev/null +++ b/Student/rdrovdahl/lesson05/simple.py @@ -0,0 +1,72 @@ +#! /usr/local/bin/python3 + +''' +To complete this assignment, modify simple.py to satisfy the following goals: + +* You want ALL log messages logged to the console. The format of these messages + should include the current time. + +* You want WARNING and higher messages logged to a file named { todays-date }.log. + The format of these messages should include the current time. + +* You want ERROR and higher messages logged to a syslog server. The syslog server + will be appending its own time stamps to the messages that it receives, so DO + NOT include the current time in the format of the log messages that you send + to the server. + +To complete this assignment, you will need to create: + +* A second instance of Formatter. Because the three different destinations for + your log messages require two different formats (one with time stamps and one + without), you'll need two different instances of Formatter. + +* A third Handler, to send messages to the syslog server. +''' + + +import logging +import logging.handlers +from datetime import datetime + +# format for console and logfile logs +format = "%(asctime)s %(filename)s:%(lineno)-3d %(levelname)s %(message)s" +# format for syslog messages +# added time/date stamp as syslog server being used doesn't stamp messages +format2 = "%(asctime)s %(lineno)-3d %(levelname)s %(message)s" + +# formatter for console and logfile logging +formatter = logging.Formatter(format) +# formatter for syslog logging +formatter2 = logging.Formatter(format2) + +file_handler = logging.FileHandler('{:%Y-%m-%d}.log'.format(datetime.now())) #need to change the logfile name format +file_handler.setLevel(logging.WARNING) +file_handler.setFormatter(formatter) + +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.DEBUG) +console_handler.setFormatter(formatter) + +syslog_handler = logging.handlers.SysLogHandler(address=('127.0.0.1', 514)) +syslog_handler.setLevel(logging.ERROR) +syslog_handler.setFormatter(formatter2) + + +logger = logging.getLogger() +logger.setLevel(logging.DEBUG) +logger.addHandler(file_handler) +logger.addHandler(console_handler) +logger.addHandler(syslog_handler) + +def my_fun(n): + for i in range(0, n): + logging.debug(i) + if i == 50: + logging.warning("The value of i is 50.") + try: + i / (50 - i) + except ZeroDivisionError: + logging.error("Tried to divide by zero. Var i was {}. Recovered gracefully.".format(i)) + +if __name__ == "__main__": + my_fun(100) diff --git a/Student/rdrovdahl/lesson05/syslog.log b/Student/rdrovdahl/lesson05/syslog.log new file mode 100644 index 0000000000000000000000000000000000000000..00dfcfab9c05775914d6362b34f66bb781473350 GIT binary patch literal 300 zcmcJ|O$x#=5C%}!p5i+|8Zr$@e<<#{7J|5s%_xCFVAPg+dOd(k-9LB((V;ffR>oIk zP*d-0??_os@EtIQa11y}=7dK<%1cg+%Z3+A(Ktsz#v1Q%MkDZ47M2gaNu2oloaasN T_QTi1s>U^cKD=se_p{>-(1um% literal 0 HcmV?d00001 From 24a91a14e136716ecb785f084a1e34015d3395e1 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Thu, 14 Jun 2018 01:19:44 -0700 Subject: [PATCH 10/19] adding lesson 6 calculator assignment to repo --- .../rdrovdahl/lesson06/calculator/.coverage | 1 + .../__pycache__/adder.cpython-36.pyc | Bin 0 -> 531 bytes .../__pycache__/calculator.cpython-36.pyc | Bin 0 -> 1638 bytes .../__pycache__/divider.cpython-36.pyc | Bin 0 -> 473 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 359 bytes .../__pycache__/multiplier.cpython-36.pyc | Bin 0 -> 482 bytes .../__pycache__/subtracter.cpython-36.pyc | Bin 0 -> 544 bytes .../__pycache__/test.cpython-36.pyc | Bin 0 -> 4019 bytes .../lesson06/calculator/calculator/.pylintrc | 540 ++++++++++++++++++ .../calculator/calculator/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 197 bytes .../__pycache__/adder.cpython-36.pyc | Bin 0 -> 612 bytes .../__pycache__/calculator.cpython-36.pyc | Bin 0 -> 2047 bytes .../__pycache__/divider.cpython-36.pyc | Bin 0 -> 617 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 512 bytes .../__pycache__/multiplier.cpython-36.pyc | Bin 0 -> 638 bytes .../__pycache__/subtracter.cpython-36.pyc | Bin 0 -> 632 bytes .../lesson06/calculator/calculator/adder.py | 15 + .../calculator/calculator/calculator.py | 65 +++ .../lesson06/calculator/calculator/divider.py | 15 + .../calculator/calculator/exceptions.py | 10 + .../calculator/calculator/multiplier.py | 15 + .../calculator/calculator/subtracter.py | 15 + Student/rdrovdahl/lesson06/calculator/test.py | 104 ++++ 24 files changed, 780 insertions(+) create mode 100644 Student/rdrovdahl/lesson06/calculator/.coverage create mode 100644 Student/rdrovdahl/lesson06/calculator/__pycache__/adder.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/__pycache__/calculator.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/__pycache__/divider.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/__pycache__/exceptions.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/__pycache__/multiplier.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/__pycache__/subtracter.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/__pycache__/test.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/.pylintrc create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/__init__.py create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/__init__.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/adder.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/calculator.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/divider.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/exceptions.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/multiplier.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/subtracter.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/adder.py create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/calculator.py create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/divider.py create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/exceptions.py create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/multiplier.py create mode 100644 Student/rdrovdahl/lesson06/calculator/calculator/subtracter.py create mode 100644 Student/rdrovdahl/lesson06/calculator/test.py diff --git a/Student/rdrovdahl/lesson06/calculator/.coverage b/Student/rdrovdahl/lesson06/calculator/.coverage new file mode 100644 index 0000000..b8fe66e --- /dev/null +++ b/Student/rdrovdahl/lesson06/calculator/.coverage @@ -0,0 +1 @@ +!coverage.py: This is a private format, don't read it directly!{"lines":{"/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson06/calculator/calculator/__init__.py":[1],"/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson06/calculator/calculator/adder.py":[3,6,9,10,15],"/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson06/calculator/calculator/subtracter.py":[3,6,9,10,15],"/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson06/calculator/calculator/multiplier.py":[3,6,9,10,15],"/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson06/calculator/calculator/divider.py":[3,6,9,10,15],"/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson06/calculator/calculator/calculator.py":[3,5,8,12,14,25,31,43,49,55,61,18,19,20,21,23,29,47,36,37,38,39,40,41,53,59,65],"/Users/rdrovdahl/gitroot/SP2018-Python220-Accelerated/Student/rdrovdahl/lesson06/calculator/calculator/exceptions.py":[3,6,9,10]}} \ No newline at end of file diff --git a/Student/rdrovdahl/lesson06/calculator/__pycache__/adder.cpython-36.pyc b/Student/rdrovdahl/lesson06/calculator/__pycache__/adder.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8677bba13795a40f46d556c2926f3b4fcaff6d8 GIT binary patch literal 531 zcmYjN!Ab)$5S^s0Y)id(Q9P-)J+#|a5Dy}Xh1hYeQ0|>|#ggFlZ`4Id{ zO!|7PPw$Z=A!G<4mlb5l7cggG6)WVa7PU)6sbjt}y0uQYBA6qhsrL@=Y!`;W%4uCm z#^4b${ye|zs*ek{G7yz%L^2VaILk{J}YVyon+SMVO=d#qWd5AK0&)? ze=)c>Qky`dR&N-M(%>brS}7Y02fa@Bv^AL8k;;0#PU|v`WlBY?#9(N1q@o+PR2rkQ z&PfnQX`H8#RXT{=E8CN4QFWrLXFMX{oOx`E%^Kx5v|Y0A*9uRFEE-E8iiQwlg?Z}Y zrVy`rl&&&OVt<8 literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson06/calculator/__pycache__/calculator.cpython-36.pyc b/Student/rdrovdahl/lesson06/calculator/__pycache__/calculator.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6e57f43af2cf75e7b54346243610043205d0bc0 GIT binary patch literal 1638 zcmb7E&2H2%5VoD{ZkldO%Rdr=RRxDV&@Dwm2q9Gd1idUs6%s55D`ea@C7Ud^Q?XUJ z(7p`339pbVCtiUQGfo!*QV(_HZ=B57-^_R>cNP}HZ{fDSygI*`nPPi8i4&FCmlLI<3`|VQ*$}wcz-e9} zC^q82@DM)o>O)69_|Q6HqZYKGgR%_)%%SW+2=gcd=)wZZIaq`SSja_*bqD8?fMZ1=ldY>t9MK?273K1E78fPkV|yHU$qxm``ojE( zq2{RR3mu@S+DV3SS$rk7Q9CQf@0E5j*Dz03U5r6#Su2|9_xMKZ&@bZ)FF7opAF6ASIrGp%#2$-}vc|lE?;v($TwnlJdExU<_yg<0RnV`ShJV_o07mwkl&qM z^*K_K#1u%(qz4q(hOBAa0uME<>i8*Lq#$*|8maRRj|k(VS&GIis5ybh%6~HVU-SHJMCb;tXhtCYnpm=_StP#8MwqaXjeYxg~%o6RfqFj zL7BO@%lStsvL@3tR@gMjCC&u;=zoj-KDzBVipHVt<+J)e4ruKUYU^Kcg37<$HoU7< G$dErg6K$LT literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson06/calculator/__pycache__/exceptions.cpython-36.pyc b/Student/rdrovdahl/lesson06/calculator/__pycache__/exceptions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96e4e8c7e18dc7508b608465d4e7554e5dd27f53 GIT binary patch literal 359 zcmYjMu};G<5WOUTLe*~l0=5ptAxMa!LS;aRrBsSo%3xXcl}2*yU^|G;@H6~U*8T+( zmqZj!dQZ=H@9un;qtRfNoIPg%uqPbih}4|m$3*v_Kt-PfgpXtuskneiBB^qSh}4|m zheQbEfmN&`^2N>g!T5T;E@g=(JXYw0QGPK=nv`=Rw#a!i;CyRUty?|h{IwRkuY7?! zrimSWm+Z--^UNt{-;~&B_EH9CZD7SR&n~W~%U#%5ljqs=R!Y>gDWGCSs18!uyrW-&R F_yJ_tS*`#8 literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson06/calculator/__pycache__/multiplier.cpython-36.pyc b/Student/rdrovdahl/lesson06/calculator/__pycache__/multiplier.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1e8325375e49ae01c28a38388bcedf105aad230 GIT binary patch literal 482 zcmYjNu};G<5Vf5ag{l=2Vqj&=(54L%Vn7JQz(iH4VhMv~*%poD#KCruin_Hw(_hNU z&WgmuIh3@P-rf1`p6{M72ZP@C*TqYT5c&kPCxGY4qS(eHvSRQ#GbqqU3Yvt&HE9?q6-p^GFL5AQjb3LbM( z#B)~(S-1n5lGf^Cd=+!1c%_)rCeGW1N9D5a_=*>6o9)TR$zIUN*QQao4k;~IE-9^h zl;&Dg%Ex_5-zuhdmA-Y%WjvR#nJ`EHTK1|;*XJ-8k7is*n)@`ujX&sZ{=yUL@aAve JZNq{L`URx)a;yLV literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson06/calculator/__pycache__/subtracter.cpython-36.pyc b/Student/rdrovdahl/lesson06/calculator/__pycache__/subtracter.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00318562f2560518a0f376a63d087b9ec88fb5fe GIT binary patch literal 544 zcmZuuJx{|h5OtgsLe#>BI!0_A+O$DJ3t zd8>Z#ILmZ6m%PkHxKQ#v<3fit)a8p&l$lHxpjZ^`HReRe5bfF{=tVAgmZUeG$ zQm=uif@Hf&D2BJw_OyNvu6+n=w061(C^?fa)Wg+DjahIqI;63(BX#)6q9-ksjuZ#V zoX+y-H8V;|6D8AlIJ)jnmu4o5I3D)z7!$b_Ab6CRl8eIp8Ow#%vKU@PjOMJ&t;}er zU8uogS$Vc|WQo@7@#^d#XkdGjUaRs6Dd=1fQU!!GuL*gZkhhZN+fG{>YBDw#z>F)q p@gS(lTDImu@OE%MuJ03gl4C-+WQ5d(|0XN{ra`{7UsJR7oL}VchQt5> literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson06/calculator/__pycache__/test.cpython-36.pyc b/Student/rdrovdahl/lesson06/calculator/__pycache__/test.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bada92b2404ca6f76f43fd5fd60517cb04db509 GIT binary patch literal 4019 zcmcgvTXWM!6xQluD~c1FkP8J`T%b_Xl7vf{4#O}o&}mDDloA+PF&&NZDnUlF!%C(h z6Q0a#r|BibKn^Q)_m0&T4Px_MPJkGc(T5Cyqb-wWMjk zYePR1^fk2jH*`{SH7TSXib!{LL9`JXk?ERDo1qmI+yc{9Sd47fX1WkgMULw*T@0tA zl3QZh4riiScb4g?upCv~iqJmSq$8(aYI54wyM}uJd`ZrLpJ9Fu{H!d4FEf7-d_^7r ze}MUU@N@DY_=C(ZfS;EO;1`%*l#ASHri2CZ^>#HwEWA?>8kA2Wnx9gih<95681dMfEN?(C+);o_9Rc|C2ce@iN!B!YBSG*ZK3-W0<`WM5Z z`7c{>XJaF11b!>|ddpY1Q{134dp{k-HMDphov*n9hSSM#FE!VY1{7eX4&Q-p7&io_ z(T|K>M7x0&-$IvYUG0U~zM5dI6kYwM_WkM$eftb}Bj=C4Fm|=3zN_yVOWLkz8bo#V zF5Khk@dw(|xd(6?I&p2!!H&TnuU@_4u4XDaFST(0O+THk$FZ-H&z^SbVQP{ka7i=v z!;RFcle$t7q@wwYrVe7&pN*CKm>#bvsoKwE{c*Um86>LRPFB|MoL@cn>DfDMo%82c z&t7jd{1947e7UlobR@Jkv@G=FxZPU4v@$UM3fXdb>v=j&goo3E*5({ejcs(AD2NK4 zoyCC$mxm^<;oi3Awd#@Yd8y-hQCoIGqD!7f(q&)N0=8mVhB~sBA~hXAi^+_(VE(Pm zTON4Ue`@1HZ?>_T#+^rOY+*nFRWvn2-7Gp-zKmDu#C`8qB(NeKk7*;VuxfiVVTi++ zG-`yKhL*r2YLWI{qV5oNN2nuD8tPd4?_i8tPy0kq*8a!%@_KMd6G3K5OBV39 zWKr697vvN|z)8!4KpwRUMIdR4Bku|bio9LT6N%1mBQg1HB?W#L6B|({&?x#Wv|`u9 z{3(t#u~u_9xKssODK-JAO%>3kPSl4PMbVxXWrj40+&gs!flw1{s4*3#R_rJDw@zYm zOor8joj;D)Ss0UWndkNqhUA<=V>wqr;O3A6SRw?`dSZ0NPe=ni4w;2U`0HxPuBQcd`%x{Vb`KiVhct7t zlh3p4y_s+^Qr9)i&lDi~3OG4Y0b>i-aGx;*s$wriL8NNbeMH?PKst&KWIV<^+pulh zvdfA_8)*ICKgs#iw>cHv8%g@)EPd$N29s!s=xPK!2u6*7r)$0tNbOc0rbOxNs-g)v zf}_$%=Ewp-)Emj%Sv2kbh?TFJLRmop;K;%*mkR9K#kD<#Dze|+GIazmj-$q<3hQ4~bn|bU z?b#rd6kf~r>RlTBn>63EAJV*w>0@brOvqg0Su%T$B@@(skq(^{RTuE#J31mSvWS0c zwU_b|{S7+5hkf%Z`ir5e`7)~Li{QRnstV(0L%#F+tl3npm)5}h|m`=8)Loes#g zPyAYKDJ^=QY&Sg5wR?Z56wPpFdhBw9e^8v?+zJ3W|F^cx>4tH^T^Jf3fH2oUBj0jY z!+$NVirl%Obu1D-kSa$O4dyTsjePUB8~#=jv|Cx>!DYLm>XETpQCutXGDX5p(n@My d$>8HEVOvZHZ&LNanU=CG9;0I8sa47q`!BASbIkw% literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/.pylintrc b/Student/rdrovdahl/lesson06/calculator/calculator/.pylintrc new file mode 100644 index 0000000..6ffba3e --- /dev/null +++ b/Student/rdrovdahl/lesson06/calculator/calculator/.pylintrc @@ -0,0 +1,540 @@ +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist= + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. +jobs=1 + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# Specify a configuration file. +#rcfile= + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=too-few-public-methods, + print-statement, + parameter-unpacking, + unpacking-in-except, + old-raise-syntax, + backtick, + long-suffix, + old-ne-operator, + old-octal-literal, + import-star-module-level, + non-ascii-bytes-literal, + raw-checker-failed, + bad-inline-option, + locally-disabled, + locally-enabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + apply-builtin, + basestring-builtin, + buffer-builtin, + cmp-builtin, + coerce-builtin, + execfile-builtin, + file-builtin, + long-builtin, + raw_input-builtin, + reduce-builtin, + standarderror-builtin, + unicode-builtin, + xrange-builtin, + coerce-method, + delslice-method, + getslice-method, + setslice-method, + no-absolute-import, + old-division, + dict-iter-method, + dict-view-method, + next-method-called, + metaclass-assignment, + indexing-exception, + raising-string, + reload-builtin, + oct-method, + hex-method, + nonzero-method, + cmp-method, + input-builtin, + round-builtin, + intern-builtin, + unichr-builtin, + map-builtin-not-iterating, + zip-builtin-not-iterating, + range-builtin-not-iterating, + filter-builtin-not-iterating, + using-cmp-argument, + eq-without-hash, + div-method, + idiv-method, + rdiv-method, + exception-message-attribute, + invalid-str-codec, + sys-max-int, + bad-python3-import, + deprecated-string-function, + deprecated-str-translate-call, + deprecated-itertools-function, + deprecated-types-field, + next-method-defined, + dict-items-not-iterating, + dict-keys-not-iterating, + dict-values-not-iterating + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=c-extension-no-member + + +[REPORTS] + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio).You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Tells whether to display a full report or only the messages +reports=no + +# Activate the evaluation score. +score=yes + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=optparse.Values,sys.exit + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes +max-spelling-suggestions=4 + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME, + XXX, + TODO + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_, + _cb + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.*|^ignored_|^unused_ + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=100 + +# Maximum number of lines in a module +max-module-lines=1000 + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma, + dict-separator + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[SIMILARITIES] + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[BASIC] + +# Naming style matching correct argument names +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style +#argument-rgx= + +# Naming style matching correct attribute names +attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style +#attr-rgx= + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo, + bar, + baz, + toto, + tutu, + tata + +# Naming style matching correct class attribute names +class-attribute-naming-style=any + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style +#class-attribute-rgx= + +# Naming style matching correct class names +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming-style +#class-rgx= + +# Naming style matching correct constant names +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style +#const-rgx= + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming style matching correct function names +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style +#function-rgx= + +# Good variable names which should always be accepted, separated by a comma +good-names=i, + j, + k, + ex, + Run, + _ + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# Naming style matching correct inline iteration names +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style +#inlinevar-rgx= + +# Naming style matching correct method names +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style +#method-rgx= + +# Naming style matching correct module names +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style +#module-rgx= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty + +# Naming style matching correct variable names +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style +#variable-rgx= + + +[IMPORTS] + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=optparse,tkinter.tix + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in a if statement +max-bool-expr=5 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of statements in function / method body +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/__init__.py b/Student/rdrovdahl/lesson06/calculator/calculator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/__init__.cpython-36.pyc b/Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69e65a36f9a47272e948a5c25107b5f587b37177 GIT binary patch literal 197 zcmXr!<>ji8R*Gf-g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(SCM{bacWVqeo;zM zepyOlMvi`ZW=TFD)Nk)F2k&%I}V{&q8PHItNNotCIa7k%OYF-JF zww%=B;`}@VGyUYmoaEA+#FG3XWM+JPW?p7Ve7s&kqf5X!NW$q5CaRC7!SrsJa{7{=w&@LO{bAfmMyl634|NGj6Tv{ zeFaaRoEBJ_WTw-Z&e!>7t{aW;>*D~dBgzHB9(b0r$Vtps*od4B^CS`h6F)ClDOa`p76m1 zZ%tNCQUf19sg<=pfKZFmFhZ$tdB(K1A?|Kr&1v)zRR?I6Wa*p`1aTIZ_NhVOEaS6` z+2$sq7)z*9pQPy~hqmJ!X!qakDT8axuZ&-`P&!tCbb*bt_$@7zltnxm_B!3$)^LuX zd9T-L^*I-rp)VjF6*CZdu~(J}t!3W1iFX}IweKQRq1w}V>6?6LI9Z~#MQ8`oHsL|D zUIvurY$7NvLrOQRK>vu+_ZiE!nFC5eaue1CQs*1u%HOg2=cmkSl!K;jzBDfa&v$HO b&~%lVtG(=%*x{JEGPv6`aBpt5U*G!!r2mzH literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/calculator.cpython-36.pyc b/Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/calculator.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..643068de575d6eb73fa64a4e784abeb63c668740 GIT binary patch literal 2047 zcma)6-*4PR5Z+z;?i}ZmwoqszRl<}?=!Du!g9Hc_R4Bjl5-LTN=<#4V-o1-cpM9*? zp*fis(tn0${u{sY)PI2|zFFrSx8kI%<(aW}clMiaXXewbE&qp)?*96BkFkGPXE?AQ z<1Ow&NH$@TOOf)qmz$?kd6Aw9e*ArSrA8QT&9u9b+FL+Oh%gYL<` z9681?F2B&E`|UzA4( zD>h`$%hV)`G=V*k$!S6hdhi{;zy`Na=~TPGs0py{lNdn!#k3FguNglp5cXJ0ouA6+ zI33Rtqx0O151;PsKK$bT(=&6NXM20Q_rHl_mEuB;lH)^Df;H3Gma3x2v)#|em&x(} z=7Ysq?S)~IB_<5FfuSHE%MN7x`edE+(pJkfyw~w7&zRVkhi`OJ4DFWUUmS z+3C;>kV=EltehXgNHUWL=2&$I4lGwK&9C8;9gKwbpzA)aNoj-64SY`ejT=i{BQ|N( z(4G=DlRNlRSh();RwtD1nl>B?gX z0oARW)%=x_ecU2j^^+KFb3Hg}B)y5@ R?@@#HYw})D(|5(t`42x9*8>0m literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/divider.cpython-36.pyc b/Student/rdrovdahl/lesson06/calculator/calculator/__pycache__/divider.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..086193f1ab5f8a330ad45ff0e7ebd9d222518b8e GIT binary patch literal 617 zcmYjO%}&BV5Z?YE*ud48=%GCf*1MdZ~v^v$K&Vr37)WB(DT4u-63al^t5( z3`x^nTzhY$SovcCdBXjP6tft(@*^MOS*&7_`eMRmlnLoE#3`*rKgSX$h(|&jtkB^u z*x;EM49$H2+9Lc&i4HmW9*xJW+|aFa<@eRSf5=oh#>x85M%V7^kYbR zteL*;W~z4HR2;1}*71R{T**?^rSt?x);w5QWr|p477;olcN-Lt^&{esA?ha(6K68s zywa{73<_1C_BSK6QiFTD&Nx}^kUtMm^Aeroeke8Xa5L@U(qb6-Q~(0^hEo+EYv~K4 zd4+yxU_#PursIYXT2?5;I1{2WP?rI(2|@kkw6Y=u7$w9fv&$rP5`KJs=g_*`0u2H= zEc1uLTVs6QyY001k6O2{G)Q+k?bf+cSdx5?koSBIw9dk_uz}I-!+d_PMTjp7M?tyU w8@<|av!KC+k7*=nG|6D9OJ!2&QD>Wi1G?Q>%#{=ZIX552G06UkfI3tzClo^A7fF^&VBX(R`9mZ;v3JH$HJk zEe^{CtHo^2lAED~W$KG0ezWC*{cTF$>Rik-o0NiNHmnUUfz4K+HWvI=OjXOq@SzZ! j)FGO75PB}sOMGRgaX)J%ZcVnXXtgXHf*uz2(nGs#1@R!Fc<@#V)ysMaF%xWIyQxW5Xz8te8DGUm z*sE{hL7b$&12a22llk&}ldD=S`o1`S{Ue0@pl>X|>>gboV*rwpCjuV$3j+S!Pdy0w zq#jNi(eq%a^LC)D&biqUrQdB(JMRqn6g?brGvx~^iFk(qZw5X_rix}z3^ zvy2xRb0kN?3?yt?U!?Ar2ab6Tw7pF`%Hq24Ymyf&lui_&aA1Qhc^?`jrAhj|POE*> z=uHqb?{r#?2hK%i*B~J2n*u~`cE&QHwai=B$(oT=yXji2P|fkA4DF%F3Ug{J)1&Qn znzq-i@0C?bb2bu`mJy}P=fV7t(vN~=tIj^9Ah|7TgG=Dc6{x+nzO7PKu{95aZR!w1 gH3&Ud>DGN^*|?vb5w|8gS5|MA1n%sUJJMnB55v=++W-In literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/adder.py b/Student/rdrovdahl/lesson06/calculator/calculator/adder.py new file mode 100644 index 0000000..4b53354 --- /dev/null +++ b/Student/rdrovdahl/lesson06/calculator/calculator/adder.py @@ -0,0 +1,15 @@ +''' +This module provides an addition operator +''' + + +class Adder(): + ''' + addition class + ''' + @staticmethod + def calc(operand_1, operand_2): + ''' + calculation method + ''' + return operand_1 + operand_2 diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/calculator.py b/Student/rdrovdahl/lesson06/calculator/calculator/calculator.py new file mode 100644 index 0000000..d3ce153 --- /dev/null +++ b/Student/rdrovdahl/lesson06/calculator/calculator/calculator.py @@ -0,0 +1,65 @@ +''' +main calculator program +''' + +from .exceptions import InsufficientOperands + + +class Calculator(): + ''' + demonstrating architecture of: + Dependency Inversion or Dependency Injection + ''' + + def __init__(self, adder, subtracter, multiplier, divider): + ''' + instantiates an instance of a calculator + ''' + self.adder = adder + self.subtracter = subtracter + self.multiplier = multiplier + self.divider = divider + + self.stack = [] + + def enter_number(self, number): + ''' + enter a number into the calculator stack + ''' + self.stack.insert(0, number) + + def _do_calc(self, operator): + ''' + function that will call the appropriate class and to retrieve the + result + ''' + try: + result = operator.calc(self.stack[1], self.stack[0]) + self.stack = [result] + return result + except IndexError: + raise InsufficientOperands + + def add(self): + ''' + add method + ''' + return self._do_calc(self.adder) + + def subtract(self): + ''' + subtraction method + ''' + return self._do_calc(self.subtracter) + + def multiply(self): + ''' + multiplication method + ''' + return self._do_calc(self.multiplier) + + def divide(self): + ''' + division method + ''' + return self._do_calc(self.divider) diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/divider.py b/Student/rdrovdahl/lesson06/calculator/calculator/divider.py new file mode 100644 index 0000000..fb549f8 --- /dev/null +++ b/Student/rdrovdahl/lesson06/calculator/calculator/divider.py @@ -0,0 +1,15 @@ +''' +This module provides a division operator +''' + + +class Divider(): + ''' + division class + ''' + @staticmethod + def calc(operand_1, operand_2): + ''' + calculation method + ''' + return operand_1 / operand_2 diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/exceptions.py b/Student/rdrovdahl/lesson06/calculator/calculator/exceptions.py new file mode 100644 index 0000000..ff6e824 --- /dev/null +++ b/Student/rdrovdahl/lesson06/calculator/calculator/exceptions.py @@ -0,0 +1,10 @@ +''' +custom errors for calculator program +''' + + +class InsufficientOperands(Exception): + ''' + use when less than 2 operands are provided to an equation method + ''' + pass diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/multiplier.py b/Student/rdrovdahl/lesson06/calculator/calculator/multiplier.py new file mode 100644 index 0000000..4c80cab --- /dev/null +++ b/Student/rdrovdahl/lesson06/calculator/calculator/multiplier.py @@ -0,0 +1,15 @@ +''' +This module provides a multiplication operator +''' + + +class Multiplier(): + ''' + multiplication class + ''' + @staticmethod + def calc(operand_1, operand_2): + ''' + calculation method + ''' + return operand_1 * operand_2 diff --git a/Student/rdrovdahl/lesson06/calculator/calculator/subtracter.py b/Student/rdrovdahl/lesson06/calculator/calculator/subtracter.py new file mode 100644 index 0000000..8ec2c1c --- /dev/null +++ b/Student/rdrovdahl/lesson06/calculator/calculator/subtracter.py @@ -0,0 +1,15 @@ +''' +This module provides a subtraction operator +''' + + +class Subtracter(): + ''' + subtraction class + ''' + @staticmethod + def calc(operand_1, operand_2): + ''' + calculation method + ''' + return operand_1 - operand_2 diff --git a/Student/rdrovdahl/lesson06/calculator/test.py b/Student/rdrovdahl/lesson06/calculator/test.py new file mode 100644 index 0000000..387574e --- /dev/null +++ b/Student/rdrovdahl/lesson06/calculator/test.py @@ -0,0 +1,104 @@ +''' +unit tests for the calculator program +to run from command line: +'python -m unittest test' +''' +from unittest import TestCase +from unittest.mock import MagicMock + +from calculator.adder import Adder +from calculator.subtracter import Subtracter +from calculator.multiplier import Multiplier +from calculator.divider import Divider +from calculator.calculator import Calculator +from calculator.exceptions import InsufficientOperands + + +class AdderTests(TestCase): + def test_adding(self): + adder = Adder() + for i in range(-10, 10): + for j in range(-10, 10): + self.assertEqual(i + j, adder.calc(i, j)) + + +class SubtracterTests(TestCase): + def test_subtracting(self): + subtracter = Subtracter() + for i in range(-10, 10): + for j in range(-10, 10): + self.assertEqual(i - j, subtracter.calc(i, j)) + + +class CalculatorTests(TestCase): + # setup is run each time a test method is run - BEFORE that test method + # is run + def setUp(self): + self.adder = Adder() + self.subtracter = Subtracter() + self.multiplier = Multiplier() + self.divider = Divider() + self.calculator = Calculator(self.adder, self.subtracter, + self.multiplier, self.divider) + + def test_insufficient_operands(self): + self.calculator.enter_number(0) + with self.assertRaises(InsufficientOperands): + self.calculator.add() + + def test_adder_call(self): + # use Mock to tell python to always return '0' when the adder method + # is called + # this test is not testing the adder function, so we don't care what + # value is returned + # using a mock value focuses the testing on the calculator class which + # is the unit being tested here + self.adder.calc = MagicMock(return_value=0) + + self.calculator.enter_number(1) + self.calculator.enter_number(2) + self.calculator.add() + + self.adder.calc.assert_called_with(1, 2) + + def test_subtracter_call(self): + self.subtracter.calc = MagicMock(return_value=0) + + self.calculator.enter_number(1) + self.calculator.enter_number(2) + self.calculator.subtract() + + self.subtracter.calc.assert_called_with(1, 2) + + +class ModuleTests(TestCase): + def test_module(self): + calculator = Calculator(Adder(), Subtracter(), Multiplier(), Divider()) + calculator.enter_number(5) + calculator.enter_number(2) + calculator.multiply() + calculator.enter_number(46) + calculator.add() + calculator.enter_number(8) + calculator.divide() + calculator.enter_number(1) + result = calculator.subtract() + self.assertEqual(6, result) + + +class MultiplierTests(TestCase): + def test_multiplying(self): + multiplier = Multiplier() + for i in range(-10, 10): + for j in range(-10, 10): + self.assertEqual(i * j, multiplier.calc(i, j)) + + +class DividerTests(TestCase): + def test_dividing(self): + divider = Divider() + for i in range(-10, 10): + for j in range(-10, 10): + if j == 0: + break + self.assertEqual(i / j, divider.calc(i, j)) From 055fda627e6de58ebd5003e4cd29ff4ac7b08392 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Thu, 14 Jun 2018 01:29:11 -0700 Subject: [PATCH 11/19] adding all testing results --- .../calculator assignment results.rtf | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 Student/rdrovdahl/lesson06/calculator assignment results.rtf diff --git a/Student/rdrovdahl/lesson06/calculator assignment results.rtf b/Student/rdrovdahl/lesson06/calculator assignment results.rtf new file mode 100644 index 0000000..d582090 --- /dev/null +++ b/Student/rdrovdahl/lesson06/calculator assignment results.rtf @@ -0,0 +1,162 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf400 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Menlo-Regular;} +{\colortbl;\red255\green255\blue255;\red239\green239\blue239;\red4\green4\blue4;} +{\*\expandedcolortbl;;\cssrgb\c94962\c94962\c94962;\cssrgb\c1294\c1294\c1294;} +\margl1440\margr1440\vieww12600\viewh7800\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 Lesson06 Test Results\ +\ +Unit Testing:\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 Ryans-MacBook-Pro:calculator rdrovdahl$ python3 -m unittest test\ +........\ +----------------------------------------------------------------------\ +Ran 8 tests in 0.003s\ +\ +OK\ +Ryans-MacBook-Pro:calculator rdrovdahl$ +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +Pylint Testing:\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 Report\ +======\ +39 statements analysed.\ +\ +Statistics by type\ +------------------\ +\ ++---------+-------+-----------+-----------+------------+---------+\ +|type |number |old number |difference |%documented |%badname |\ ++=========+=======+===========+===========+============+=========+\ +|module |7 |7 |= |100.00 |0.00 |\ ++---------+-------+-----------+-----------+------------+---------+\ +|class |6 |6 |= |100.00 |0.00 |\ ++---------+-------+-----------+-----------+------------+---------+\ +|method |11 |11 |= |100.00 |0.00 |\ ++---------+-------+-----------+-----------+------------+---------+\ +|function |0 |0 |= |0 |0 |\ ++---------+-------+-----------+-----------+------------+---------+\ +\ +\ +\ +External dependencies\ +---------------------\ +::\ +\ + calculator \ + \\-exceptions (calculator.calculator)\ +\ +\ +\ +Raw metrics\ +-----------\ +\ ++----------+-------+------+---------+-----------+\ +|type |number |% |previous |difference |\ ++==========+=======+======+=========+===========+\ +|code |56 |37.58 |56 |= |\ ++----------+-------+------+---------+-----------+\ +|docstring |71 |47.65 |71 |= |\ ++----------+-------+------+---------+-----------+\ +|comment |0 |0.00 |0 |= |\ ++----------+-------+------+---------+-----------+\ +|empty |22 |14.77 |22 |= |\ ++----------+-------+------+---------+-----------+\ +\ +\ +\ +Duplication\ +-----------\ +\ ++-------------------------+------+---------+-----------+\ +| |now |previous |difference |\ ++=========================+======+=========+===========+\ +|nb duplicated lines |0 |0 |= |\ ++-------------------------+------+---------+-----------+\ +|percent duplicated lines |0.000 |0.000 |= |\ ++-------------------------+------+---------+-----------+\ +\ +\ +\ +Messages by category\ +--------------------\ +\ ++-----------+-------+---------+-----------+\ +|type |number |previous |difference |\ ++===========+=======+=========+===========+\ +|convention |0 |0 |= |\ ++-----------+-------+---------+-----------+\ +|refactor |0 |4 |-4.00 |\ ++-----------+-------+---------+-----------+\ +|warning |0 |0 |= |\ ++-----------+-------+---------+-----------+\ +|error |0 |0 |= |\ ++-----------+-------+---------+-----------+\ +\ +\ +\ +\ +-------------------------------------------------------------------\ +Your code has been rated at 10.00/10 (previous run: 8.97/10, +1.03)\ +\ +Ryans-MacBook-Pro:calculator rdrovdahl$ +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\ +Flake8 Testing:\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 Ryans-MacBook-Pro:calculator rdrovdahl$ flake8 calculate\ +Ryans-MacBook-Pro:calculator rdrovdahl$ +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\ +Coverage:\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 Ryans-MacBook-Pro:calculator rdrovdahl$ coverage report\ +Name Stmts Miss Cover\ +----------------------------------------------\ +calculator/__init__.py 0 0 100%\ +calculator/adder.py 3 0 100%\ +calculator/calculator.py 25 0 100%\ +calculator/divider.py 3 0 100%\ +calculator/exceptions.py 2 0 100%\ +calculator/multiplier.py 3 0 100%\ +calculator/subtracter.py 3 0 100%\ +----------------------------------------------\ +TOTAL 39 0 100%\ +Ryans-MacBook-Pro:calculator rdrovdahl$ coverage report -m\ +Name Stmts Miss Cover Missing\ +--------------------------------------------------------\ +calculator/__init__.py 0 0 100%\ +calculator/adder.py 3 0 100%\ +calculator/calculator.py 25 0 100%\ +calculator/divider.py 3 0 100%\ +calculator/exceptions.py 2 0 100%\ +calculator/multiplier.py 3 0 100%\ +calculator/subtracter.py 3 0 100%\ +--------------------------------------------------------\ +TOTAL 39 0 100%\ +Ryans-MacBook-Pro:calculator rdrovdahl$ python3 -m unittest test\ +........\ +----------------------------------------------------------------------\ +Ran 8 tests in 0.003s\ +\ +OK\ +Ryans-MacBook-Pro:calculator rdrovdahl$ +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\ +\ +\ +\ +} \ No newline at end of file From 5b2e538df6ec0abf02202e389cd4cbaf3397ffb8 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Mon, 18 Jun 2018 01:14:25 -0700 Subject: [PATCH 12/19] adding personjob assignment solution to repo --- .../personjob_model.cpython-36.pyc | Bin 0 -> 2720 bytes .../Pasted Graphic.tiff | Bin 0 -> 96652 bytes .../modified personjob.py output.rtfd/TXT.rtf | 87 ++++++++ .../personjob assignment.zip | Bin 0 -> 224663 bytes .../lesson07/personjob_modified/personjob.db | Bin 0 -> 40960 bytes .../personjob_modified/personjob_learning.py | 188 ++++++++++++++++++ .../personjob_modified/personjob_model.py | 65 ++++++ .../personjob_modified_db_diagram.png | Bin 0 -> 48726 bytes .../personjob_modified_db_model.pdf | Bin 0 -> 80974 bytes 9 files changed, 340 insertions(+) create mode 100644 Student/rdrovdahl/lesson07/personjob_modified/__pycache__/personjob_model.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson07/personjob_modified/modified personjob.py output.rtfd/Pasted Graphic.tiff create mode 100644 Student/rdrovdahl/lesson07/personjob_modified/modified personjob.py output.rtfd/TXT.rtf create mode 100644 Student/rdrovdahl/lesson07/personjob_modified/personjob assignment.zip create mode 100644 Student/rdrovdahl/lesson07/personjob_modified/personjob.db create mode 100644 Student/rdrovdahl/lesson07/personjob_modified/personjob_learning.py create mode 100644 Student/rdrovdahl/lesson07/personjob_modified/personjob_model.py create mode 100644 Student/rdrovdahl/lesson07/personjob_modified/personjob_modified_db_diagram.png create mode 100644 Student/rdrovdahl/lesson07/personjob_modified/personjob_modified_db_model.pdf diff --git a/Student/rdrovdahl/lesson07/personjob_modified/__pycache__/personjob_model.cpython-36.pyc b/Student/rdrovdahl/lesson07/personjob_modified/__pycache__/personjob_model.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54d96fcc2a9fbd5fb9980a34d59929afe351bd05 GIT binary patch literal 2720 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 INM$Eh`(qm9xWvFl3W@3QAq7-Y&lOKdy0 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 ZKh(xh0gxxafTwkM9LP`no&P_F{{xKT`pf_T literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson07/personjob_modified/modified personjob.py output.rtfd/TXT.rtf b/Student/rdrovdahl/lesson07/personjob_modified/modified personjob.py output.rtfd/TXT.rtf new file mode 100644 index 0000000..36aae3d --- /dev/null +++ b/Student/rdrovdahl/lesson07/personjob_modified/modified personjob.py output.rtfd/TXT.rtf @@ -0,0 +1,87 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf400 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Menlo-Regular;} +{\colortbl;\red255\green255\blue255;\red239\green239\blue239;\red4\green4\blue4;} +{\*\expandedcolortbl;;\cssrgb\c94962\c94962\c94962;\cssrgb\c1294\c1294\c1294;} +\margl1440\margr1440\vieww19020\viewh24360\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 Tables from sqlite3:\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 {{\NeXTGraphic Pasted Graphic.tiff \width15720 \height7340 \appleattachmentpadding0 \appleembedtype0 \appleaqc +}}\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +Command line output:\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 Ryans-MacBook-Pro:personjob_modified rdrovdahl$ python3 personjob_learning.py \ +INFO:__main__:Working with Person class\ +INFO:__main__:Note how I use constants and a list of tuples as a simple schema\ +INFO:__main__:Normally you probably will have prompted for this from a user\ +INFO:__main__:Creating Person records: iterate through the list of tuples\ +INFO:__main__:Prepare to explain any errors with exceptions\ +INFO:__main__:and the transaction tells the database to fail on error\ +INFO:__main__:Database add successful\ +INFO:__main__:Database add successful\ +INFO:__main__:Database add successful\ +INFO:__main__:Database add successful\ +INFO:__main__:Database add successful\ +INFO:__main__:Print the Person records we saved...\ +INFO:__main__:Andrew lives in Sumner and likes to be known as Andy\ +INFO:__main__:Peter lives in Seattle and likes to be known as None\ +INFO:__main__:Susan lives in Boston and likes to be known as Beannie\ +INFO:__main__:Pam lives in Coventry and likes to be known as PJ\ +INFO:__main__:Steven lives in Colchester and likes to be known as None\ +INFO:__main__:Working with Department class\ +INFO:__main__:Creating Department records: iterate through the list of tuples\ +INFO:__main__:Prepare to explain any errors with exceptions\ +INFO:__main__:and the transaction tells the database to fail on error\ +INFO:__main__:Database add successful\ +INFO:__main__:Database add successful\ +INFO:__main__:Database add successful\ +INFO:__main__:Database add successful\ +INFO:__main__:Print the Department records we saved...\ +INFO:__main__:E101 is the ID for the Engineering department and the department manager is Mr Sprocket\ +INFO:__main__:T201 is the ID for the Information Technology department and the department manager is Mr Bits\ +INFO:__main__:B402 is the ID for the Business Administration department and the department manager is Mrs Pots\ +INFO:__main__:H504 is the ID for the Human Resources department and the department manager is Mrs Fields\ +INFO:__main__:Working with Job class\ +INFO:__main__:Creating Job records: just like Person. We use the foreign key\ +INFO:__main__:Reading and print all Job rows (note the value of person)...\ +INFO:__main__:Analyst : 2001-09-22 to 2003-01-30 (495 days) for Andrew\ +INFO:__main__:Senior analyst : 2003-02-01 to 2006-10-22 (1359 days) for Andrew\ +INFO:__main__:Senior business analyst : 2006-10-23 to 2016-12-24 (3715 days) for Andrew\ +INFO:__main__:Admin supervisor : 2012-10-01 to 2014-11-10 (770 days) for Peter\ +INFO:__main__:Admin manager : 2014-11-14 to 2018-01-05 (1148 days) for Peter\ +INFO:__main__:database closes\ +INFO:__main__:Person Andrew had job Analyst with department ID T201\ +INFO:__main__: department name is Information Technology\ +INFO:__main__:Person Andrew had job Senior analyst with department ID B402\ +INFO:__main__: department name is Business Administration\ +INFO:__main__:Person Andrew had job Senior business analyst with department ID B402\ +INFO:__main__: department name is Business Administration\ +INFO:__main__:Person Peter had job Admin supervisor with department ID H504\ +INFO:__main__: department name is Human Resources\ +INFO:__main__:Person Peter had job Admin manager with department ID H504\ +INFO:__main__: department name is Human Resources\ +\ +\ +The following is a list of persons and the departments they've worked for:\ +\ + Andrew \{'Information Technology', 'Business Administration'\}\ + Peter \{'Human Resources'\}\ +\ +\ +Ryans-MacBook-Pro:personjob_modified rdrovdahl$ +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\ +\ +\ +\ +\ +\ +\ +\ +} \ No newline at end of file diff --git a/Student/rdrovdahl/lesson07/personjob_modified/personjob assignment.zip b/Student/rdrovdahl/lesson07/personjob_modified/personjob assignment.zip new file mode 100644 index 0000000000000000000000000000000000000000..3c1db2314f6573fb67f1eb99f0d0473c5655780e GIT binary patch literal 224663 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%0AE#QJCwSqj*g8> zlhEX$5SKu6LD18gnR4P(U$a2tasf~H;>XkjI;7IE>1PdIX7;}?PR1k|_%V=|7o3}4 z;N>bSG<@-WQ;M(iLKBk`1WRP!zZw~!@Ar~dFN)2gvWbg}19l`Z0ZPG`9Q%=iNr0}g zwc~gh*o`A%E{2lB0Q(xE##meX(-smsaJ)Hrknikd20*KEsO6sF~P!UkxzM%*T>^bNqi_f3BW*Z0zi> zO_g#V!uf`p468CIV0n4J)ZMAKnV)0_?8iu+t>-#_1UX6UG#otU;OKaJw6T&si#5<@ zk`i;}?~y`7xcAnk#N26uvF}1enS-&F=v+W`eqP>0f0hJrdm1LK|z`dwT9!tSgPf&`e3YPT`H?Pa}E?B@`&g)`HwxP1Hh zQyz&$vr~{Q38%?@Kobev3+c^(&EZ#8S0~ps3H`|*o5H359zK|XpT~q=a|C3YE(}7V z`Zi-Ws3A#Sz1{(bYj1k9)#C3Z1S8?>E$~9Ehk>Pzl~}HFe=sBzbZ-cc8(F?eeO#%T zt2n8pF1b>YFAm|ZqcshvY&@QF^xmxOIKw$>Ww{(IP|Moj(ITn5?&icM$6jOQrqYP> zZk}>aN|)M7=b3tdk;!$D7PD^9H$K62q=;w7 z1WllHTsCt_TxN)9p0UL63bGA1=`{^68b_Fh=%kDs(J=&m1GH&3iw3(il@xea(p5_x zG(*a7l{F6gpIG*t1(@LLnV2+@(mnm*LuXRW*BZ4l>9LA2Ln2&U7$y+qsC`qbxYWl7 zDHFKk3Z{RcC9PRs)Py$LCLz6jjL)#LJCaPYJrTiMPMT3Zt5}B#9!UjLudT=)VI9u~ zP%rG?Yv-wBNIBawXc2T=VtUcd9DMFJa!*ef@J6@X1V~3m7qqz*MkZx zmNIiP9bt};rpA%LHW5p?f?xwfs0&n$NkY%b=)KpgSG9W_S?j?Bmc|}48TVx+mVWJd z_x`w1U`I#UuRHBBIyAsh(}gg-!yloY0(w3}dR|rA4t#a?wxi{qexPx%Hh}J- z@(mj-!3X^Uaj_b?cRl2jkw2ZgE^M3&d?qAx@L{9eRKG_wUjG-~8_=2e_VlESr2BHG z!Lfyx2ZctFwx~sfftP@e&(bVkkz)No##rFlY95-*4@56r((R0d>@|T(R6qvh%!F4= zoXa5l7hFuH08`-^M+b35`&=G2+it_j7mo_n%{cc*|a*Kxl=!V{s zqi(sr?Za)~jqOtBQ6`B8n6lpQH((Y@%mFXob#HxE*8AIg*1QfGRM}1T}Da?&OxwTumikmc*%9daZpm>H7FM zU;RAeoG|Rg&j^#5Fb9$}?4N7~)U~o0S(%RO4%iZcHpNS{|1Qj2PGn(XvbMgDWbTB~ zP%>y$!t3Qqz%cO`*{#IXnh+F-4%rf_88E zAM}ZC^-Js=0(9|vLv9kDfi_?9H(Id-?1r$ImVA?N94n30_&!*|*GFH1!MaPs7cX8Y zn2m+Zbm&b*u>|R%R=DgOd&_Nn4m;q*2dx^nmmnY+;9rT1Hlb?iNRi)QIOk|Os zO@sk{0MJ$d@6mj}mT=;+Vl9sA3PlC94MIzJu4Z6V*Az%=2^q{xpy2~K zS@vfWU&VaXnS3^h5ba~FWdBE7lpNPe{u(s4vWz*ogU^=B(oS`X3ixr?&wExr4CvU%~ZwfwZL~C$oc37|z5d6s4oc=r&6_nty73M;+=((j8LB zrOWDf+4KXYZSopQ9_rGw3 z4GUMuz13p>2d=1L=OZTkjOKs7C5#9QSHiQB+5YdK;acxp8Prr0BL45U46;4G*yum^^&_D){ctA&h>>ydm7`r8Ty^^B~5Z=1uG3;uePR) zk4`Y%+SvnE4ucbZCzgd&8iJ>KBqPKGRu;{SPi+~4B6B92%Gngfes1wFWcdNt(FD-Wkp#u8z~O>8pHX>bTSj@h?$v7x1?HZ z*YuZN!%0qqUytrsZHHKtPrBDMLrM~-Q844j5i*Df2-Z6A z6FINj_=#LeHP?0Sh?yl4}+*drNSl@6t(AeXXPk8rdZtPp#St*dmukMe+kf?MA3-)Uhcz)TdIK;f(mk7|~0P z|N7l?ysAO*SKHf~FxsHoTEAA%<{Z)-iF9=aNe^ZtYjMt#)IQJ+ukgO(0u2lJl>=1U zRAkBNpEz!wFe&qw$ruF~&y%2luJ4VI}I+wjHFBbh>07Uj`Jwj_+sC@fGiniMug)7rg*U7oXh->Qp zp4uM%vdKBP-;K<1Koh7u#k^c7*X_0Gb(?dlr;I4Olsu;Ix=!Qf!|=oEV2(LHJk|lx zJ~>dgxpEp=?F+PjTC2d#{YP3OCBL+OdZhk?D=~>Qk(?d$VlpIGgXDmJss_O#pKj^v zf!kLj0*2s)XsrgoYS=-_e7nggwP}f$&QG^Fb=gbd=X`-Eb|F-qx+-T^03>_cXVN9m zYgrdpni9A65-OWMXS-bzNrQekFe4gybi9?@7E@R>lX>ColI5x3Ub(mN#AECnNqjq1 zkt6fHyU-RHnXTtEx^95O7j)#6W2bU5=j?#t*0Vxjz&3i`keW-K5J~qj+xV~%T`!pX zu7{m~kw63|I%iW(Hxsvx;@6gj0l^?M{r zMG;13jF^iM8jJ1fg$N}}NQI(GEv>h%Rnx?c(}ekIP?PNN>HMM~ut4Gkxd zMQZ)*C$*cAp^N@q4}_@lD(=VuB&3LE*D>4RbZ_Nc$hV%?{l&7*CyF)CM?9xy7G~4X z0w|baYY=zUU6E=NzVV#807yc5)8Q{hSlqx)5W89j;d55fIDL-mM6cPW2rJn;*0JI{ zKX^j{7M)>ks5dbzce@gs?-*%q@6TSlxERxm_f0z)GO2C#!7gS%-E{qC_}8cp1fI+k zbmGV+DQqQ#b;1x!2e|SgM{;Z;k%WR$_A0u&8xAd%W0KmVFv zyHRe1w8jXjS>{1aJz~k3-_{gXto+-ONs; zgG^iJk$@O?3Hq4&$T=nD#|D>7+SP}p>@>tQRM-pb6)5bkRwC%Vlp*}ys}ZJ<2suJ0 zyPt`w45x>O?=3VIzU6l|%s*plAC2XIg}@<;OJ~}JQlOwi9?3gs;)^X6^nDnPj~gAU zY7>x&aZ5?^%D)S*1^B&rF)X{@b)ip2)c6n&wOb5rFSey&4ULbFv1o&Xebrf-U!GH( z;>`;Y4;o9Vn%GBlBuO=`qwlA{Yd#fk#NSqyY!Im!RJ$x)t6WRv!yc~KDGV*Hj7cbS z3=G%(HSi^bJAtiZ37EA3+RCY+`n9#V;&asi=QnX*haIqTW0roDKIU%hIX@aHu?uJ4 zk`@Z{0a_|%1gG7=r=Vpdz5E`j9&zJLlkF)*8AJ;#kNd42cFKDzty@aA%kPai^)LL6 z9mn*!*=snDM0zj;^&!b29D$WTqQX`~FSLGPJj?R|8@qiy?~Y zj3^?1i>DlQ^(-es%vSrz&|oA402lz$5c44UVP3(th-R-&bX8oTFhLTa`0s6rD-}tlld;4GpmC#(Bx+q<8mZD?6kb=wr9y1I zvD!!K9|QLEHO9?V-bnwFD0I&SkiP6h=S$#jSBRXqTTT~Rv+7L;scv@bMs(>_v@Ru> z6OCs_EbLC?*Xf(t0MK7m_yW?ocnfXq$P~k}?j)%?SyT~dBQQ}O) zc)bIds81D_eR@(%Og>U`HFzw9O0Jwk1!zc|583+Lx$8;#BszXT2NS}%xaa;r^4VNL zKk~_$Q}11*#P{PZS>dbDn5MQMA|hPRZ_(9ei0H%e+oFa6!BI<2zHZBd=GjPtURUiK zHW$kdkk5wISK47f47-@g%` zukm^9*$#bnP8K!2VI?LyFk!(Mw2Hu5TDl>zyP=>UQHXLsq@GTb5+K8rnd#X4utF4V zI{$_GMB=U8cL3a&mp*}{&RiWYFvamfn7^~61kCd*07OxboLO8i! zH%i+9$N6ON1?RgNF;yIfurO1rdT!xzJNX+WtdejE6pSk_m`+}HO`rLB`aT_bkM zyRl_i^THa|G#b!!irG)P{)L5z9nH4G2Sc*lL`Tj;W(CCVArrRHX6;o&!(3 z;Pz&#@F7!LpRgi!bv5P8?{`auj%_JQ(JZkwywKLCrwNl^q8zTi!W@EJ8_j>&#Asny zU#3C%1+TRXjD7Gj>D5BrYzY=J>%tYy<1Jn2HC9s*{*g@Sx?~F?igb52FvGxwN}2u< z$v%y-xRAR3DuM}`&iPZN?-P}hDG9z(IF8sD9u823+9#VP$|g+fmQxDXq^l*jj2{ha zi|(v}c%HyXp#j}d!Gx%f&`Khb@}*nhBZgg=noNT>d`6=pcajdkV2xJ^0Zm=gdW@@! zRW$dFl;WMutjYP&*DA%PA&F}NtAfKK=Ij=kQ{dGFU?{sq4Ez{ELRox;LZa?dsatgK z#@XJCtE>9#aX+M4afO+wz&c2;v69}3gs;U-TgwKezPJbHz0YHFN^esqE7SwVOLrDUTHYE zJ|2;OVL8Z^I%j$CvxlGSu?4`*uJkIj6lw3X8s)@8FrDeMlm0C=hZKec^|mxQ?NDNM zCM*%o(jn26dpNWwj!(ufeerPU+FthfEQl~*({*~u8G1n<{980hSzGL@45aafDTH}i z%(8Br0%=nVIu}TZJ%7|rOkzsh_+s3nZm}R4OoJ%tSzg{V^;c`9X<>S$bn(c+L5s?Buo#xbkddN)+mOk8;_P4gwBv*(@)sT2P|P zsB0F0E`Ap)Sq4Gfc*Z555YzKn;+X%E&s-QSqM*&HE3p7!GfEytTTAzW$cUYf0XNZ$ zw*cOl_2H@<7S#SXAnR_mmrJAxV@V+BQq74&)ZO~$Zcy;2A}pdkla5!jhJ}I1 z)VpkQ65G;A-P_cAwajz)wDopWKdiMqW|0RMXCYOk?K!`$8lmF8O78bVF@mo|z3*FL z1KXnW6DVbiPQ`&cW%5;Tdv3vCFW8@p!V>*I)?PqBRM1&}jUn6*!5HTk*f=``28y>G z{ZALJ(AGHnJ~N5>+#t1OS4GWhnXH1r;$O-4WlE>vx4a0-S_VtGY+wdb`;7wWnm-L}b#m&tXnL6A& z+rtQ{_HhjM(MhUm6nF~7MR=k1uX^R0vO#zE$MUA@AVYG4jW16g5D^nJiIA1wyeI0B zHik2TnE<4mQb7nwgWp3@2?0ZdKae>&1t6c4|5Q9x7J@j4QUNGG6bUGEvXhCt^W)~* zCwD8=7kS!UR<^x&#aVa8F)vyXwgWOScZI2CS5s{IoCnAUyJs=GEU4{n8>N&66zV0W z`g|+V;#k~z04*3q^c45};*`+~dG1cA#Uy!Pcz<;owAcP#bYV>q9NXK=%VmCC?Bhd* z{TA|wdq$>P@|WboGn&*Ca2nr@%gMWW!h^|*N19q1arP>FCD1jYLkpcPHrHtE$Q~ay z&!wtNKAv?4r4l~MT5wr0-gItcA|dn-EsauwWgk$4@!=s4U zdX1tT?J&CrvI8HLPVGu1oRmb!^vlWVgCv8J&#}O&R0#i zXS}_kCCmSZtDKLwuPvDRN8?O7r=)~Vv2}mB@nq%TsJdQLEvoU3D4OR>(}^4UEhI=s zJZ@I7Wym45G0+?yU~r9-z6-Ya9Vh*FvEVuYCsTnGE9(`PpPhu7;HPbd=>`xNk(>hn zm)Z)z`!EwU&@`KdO}RnP(Li?R!kHa}Gf-59GHf@Fr3}E)@jy}R$0AsRJ>i^#UYO=D zCnGbup|BfDGvuJ`Bb@bWk`qIV&`(gY{5#5ZWQF(fXjBRw1UhYR{`Xq8)Al;=+y2e~ z%cBW!N2T^)!Rg4fx;Q0KxVltY6Lb4W{WHvf+Qg+?WYX@$N};4*B!Az>w?SXUX7oa7 zu*2MAM7~F<<`HY+pP^h$<6-)Vvgu$RW%wu+cPPDx{$J}V*~`7jzk0flkh7J!&c1ea zeQN|S(55dO$h=n0ajW=nc+cK{1{I;tb9^6ck;OhETqum*#yJ9YeZGlTn}1QkxnsAm zb|96lM9c_F%P+VAF4PYgC~U~zNvo}VSMy^` ze74C;m|l`dJ73Q3Hvo*&U(lO$G6oTkp{$M&pmkCc*!3qQL|icM+^DU7cj|93bh!Bm z_Horqn2N_cL8{X?g}yjV@Uxeb5J|OGO%aRT2ZCEY`W9wp!=Kb6l&ecXBbN1SF}#LX zp;UAv2@mbTD8c5nEUv9QNK4)+c(laCB1fUc(FPtN;j^`ooW<3$S*tU#uL~P*X^sCqRS4gay1wl`*Z6c73!@|sj>#G z9<9azPP4OB0uNW|T|<>#F+=asz-3dbI`!Hgf%Z&|cAM@_g8b$;#xc*;P!&f%)4pnn zK>=pHr)C+{prX@}Bn=q0VoFXRF6zf$2o1#*;-Dsr~ zgl^$Weo%ZQg98=2gW>4vvb(#xt7!=egmP5)>9@~zTQ>JLh}3Hd?@1^W6>th6#x~GS z&Q>!f7iy*u)|H0kWlwl9uN7~9ea+z1<($t}kGE1XES-V#Q80$3eyu=18T$py-rBM6 ziB{z1fC{$=k;N{RkuH_ePV;ENx@g@NRZm!Ps%(wAN;q5&F(@ZwBUFGCKY0o#kr|1f z5;H`4%jj^VvLy|u_wTO{E?~03o8!iHBaDp_!y+U*AovtxvRCaCj{!j-sLus#yK;+Z?2z4{)|jNqh@;1X1gDvFjz12-exFy^ zGKdW%H0KU($$|u{0%5crckSvAl^olbecC{oyYQ*fO)lpE^rf+hkHP!Ra1|wTTy5^0{Sgrjx#l&`mirFbIu6V%AN znoQ|VLd|_wWW(#rOa945$EYhmXK3&?mT0JUn@Su9S^5Pn-o0*g1C`TPif~r_8upi( zfW3YQt8gAaOct9LH!A6`L;KAq@wGZf*xC>~78S9)Uui5-k*1{+|q$3AAUG7XT+XU)I z^~{3{jjN=N+r*h0o1>>Jlx{gx^sXF=rZhbL>s=eNN1tyUC$ckb{?B<@4-!i9*5Ia{ zj#n8(v@Dt{19NUk*aL=3`krzLR1V7;RNu6xm>O>DDdmNWQ!NLrc8_gakEN>I#u0AeQv^4{#HK z`;Ac%N3s!&(C;CVlPhCZm(DGIQaA_G=)xb#=jtRO)zZ*2gbs{GopGj>Y`tWZoK6r6 zY+QkP=Jg%`8xI{F9gJTygpJWmt$92U_ueg6`#Rpu1Y4m_-%=qZY4P#+c)2n?vX=Lj zC2);?QyM3SEKq9gqICGw&>cc>4+@EpSn598Q{`4V&6KPnRM{Ebd)$Py`k`h>z$Kw_ z2iwjFJyP?Wp5+@mf&ngPME;klfE~B)d3{2=2X(0u_ks2Mx1M5t+p&e*est0q?Gr}= zcAh+Uk1z7%w^sVHFzABYXRsah5$^s*!g-u>$l~P&MuF}jny{t}WOOHx)Azz87^E{$ zts-YWFLDAmu}Hn{!OdhM|5pmTttdVH;dby9tz{e>~Xv^VjYkE#+snt zDWK3=5=Dspr!wsZ1h0-Xm`-gQ$EniiZU=KY^em~bVwi*794*v?)~9Qi({xKDX;Xjgfokee(9LGa7P@a=H%xAq@27ZA2&%GeSrnVhHg;(Kll5hkETVrGuaO8F27l7{gO|a|BW>2C4TzS#|xxs zlWufhopqOmA3~0Kr!jiUb~3-*Vs7@(Mt(Ao^2=}|QXFlHN%crC=Laz#T^&@EUG&!w z8($2#U-BKuo@0{MyvCr3UlHYmA4uEf#y-LamAoJ`M|mILSY4Bl=s*cbcnV zpWeL$t-?mpCn4>;$_)mPL&2Y^5iT7^jY#=Qrh%emIJmPpm(Ssv{BtP5WD*@ypsVud zE?v??5-Ey_iw4`_Z=VBhYvhe(_X4T4WoG}#3^Zsb(Z;xLQm2>v=bqWSAG{hB=S#`u z<5Quv9C9ZZA7DB*IRr6J75t90K9K0x=(8)y32DbR8xF{uqGc}KJ_;-yumBZ9j@-YQwc7NM`- zFqvPW?zR6NG=wzh*m@G8%tMv+(BQo5vTEWO8L<~92p00#GTjk$*5Dw8lFsI75|)>AEB0ad`m*!QK&zuAUC~#FXp-#!~Eku1C5Q0 zB-2i!zv*_8T}Tq@{X??thqnTzk}04S7u*^wd0O`eIs%;ppJK8th#vAUy-+srD{U|b z)u0FctGuynL?PE15G|9diTQdXIch-X6%tPcqg*?I^oi24^2vfSN8+w6Xy^$fU!Jc5 zCX@IJns>Sa%E)vXbOu{lQEt7?mUhPwUgBZ_oqUBb-H!I`t`}m}(RRd_h;Bb`PXusU zj&}qKX%Rtxs*tw0hAc~iN3jM5J&$sle)-Dza;~nu!b5&;e)y7KQ>tJ!?uUgr+z9cGW zRgp&2$I>SYo3nEVgChF|*JAENpF-0xLWNQpeJ5;6-0E0HoPc70g!~yxOiC>AdFKNe zjR-8K(yd&RzzqeRT;qdals)AhB4P2>r&+nrlQu^j4hZ)UB>HScA~JoNN|D)iLOEk$ zRHx%Lg{O87AkeE`>(Guz$@Qn`j*UCx;u~~o%i9BvkBJ1KVjCzil@tkTYfS@TdQ!n8 z5E-_6xQWg(b73~M*WU>uVmkv!xHiuJrM;M9^uFt)PmjaYcvjWoWgm(-dC*=8pUq4? z&=B}d{(D6bTCMhm+LPP_VkwnCo#I`wr>RO1hR~Puf#?;?o~aJaO(4F>?0!8VIP{3m zW{P-d$49q747bN!$VZrEm7j@5{?lLk97$`}Fhxim9sPrk&NW2JJGh9zfDobJ>G(j1 zYaM(6UxZq0b?gikl22IXg)h~5T%TBeTL=J!{0?rdz$w?Fj_0gP&KKR3&ND$+IG~M+ z`VG?SxCL##c+4$C-^Qm3=`)1FtnX=Ny>&j76jkioI2WAnC*A9LVLrMq*^7C7xTCfO zcur$6@#J-Q%yda+G%D2IZMuSydVo_=4-P4M5yb@P(NQjaUry0K2>UaHucBqkVFdhZ z=Nic}4hO2iP+xr-t}v`HJFOJw3#;QEM{(Jqj;q9xc=^_IsrKkzXG~iFr--iN%!u(P zFM_5wiqKs!-`z-8(qhsF{OGLjhl2o$RAstFauYh+U zTvzDoVcHZ3BJ*{uqHXf;C_D!H`Lbq^VJ!?m-rNE2-HVP z#f!bG1<@y8^AXyyykPyH<;2UIsE>G0kq2`AoRH9u>_U~0jFW4*;EwqigPFqo`;Lx>3rtrEReUn7S%lBp5pH|#y8@-aGMUk%w;Ju| z{Z=@>Ujl117eFEqzSqgzQ90yXy#4I7*D z$y#Q43%`%70$x&cwc9e!t=DwVw5aE##kQjJcVFk%D_@d%2{os3XH!uh703J+uRj9Q zS*!h2Of&WSy{&)y(=vLmh_|Scy(byNdSAF)_GLc$?@2soy{uG6rU48cefusAJ+`OScHzGubX9(Qb9yi}aSCi7P~& zxz|>m++C2QPhcIScZ0TsIy*l>y*qCFD{&JkwJcbG=;gRPt;-4p=xr8UBUXMWheO1y ze=G>0)18d!VCm+n(WMU*Ox#GUjX{XawyM>{8Wt8t0VX_{s?nA@&=^$-TFOaHND!n6 z)7PPI2&Jb(+Lr421aA}(-0pfy{%(zIwwy3S2|#V6tXA3OT=UFH{;VmJLsxK-F{UO{ zLRTDPmwyR$8yz1OhAF4Idgp#vQ*#g8d9p7toQ_~U*wtq_i&xnHv!dwf$BTi3(HFL*O{38N+C*_p z`I1;GE^H3dxo`|sWp}-iOcf}Ux#%oqXx$LJR~BQ)pk@2(Y*Mkmyl%Zl?R}KK6X?d7 zSnI;*Z%}@=O@Syg^ZDp}M8-|e7~(bms1k*bB4|Nu&m68$$8Ripa^j51ecNAMXc4X2 zR)HUQbVUK@Ow-~4B1k%#hc%x&r-K@i_z-4H!aN=4DOAmREw)tDA0!>&M&#R;)JXUP zPnrtE&YP;fre^EbFMn_6NYS~GZm_>E94i}LzD1p57O5iwP2D8y$^OM-*2ZqWw(u-oRICF zr>3h(@hobr+TBU3Egln#s7iw8#ZiUB(8$z?`h{{X(Zt~JaKR`hOJ5J%QFx&bw&4tL z4*9}K1pdU1Mg_v7Kxop-To7Yy`8$-ONE&hHtgXmKQr{YEYo97@5I0roAHD-Wq7+Eb zW}?=N7^sf0GVLZkhmtb%9Ym7RIwtTSVJ~+z#>zZ?xCKD3Nk?X@DZN429j@bJt}$uT zC6MefA|UwN9K37DqWwFQR~?mG<(3@5=Q}m^7KLS;S^8YR+hm&mA_sP3 zS}lkUaR#~U_ApJn=SGFmsj2I`Y{`4pY~Z&#QzCj%ld5KXV6Dzoqe|94Ur$JxH{tXe zo9vBxH>c}4Df2%_q&_6Rhv~F==lu>Ph4Yix5m~VnTLhw!vJ={Zj831nou9qf&y=U&UO=(K7HKp_Q0tSX*!Mtf| zfjF+U-QAm8&MKT{16YnU5ByP_Ydc|&dTUj8s}X)WC1O~rI0%L5J+87=)~RzuvDVJ` z4tm{Wtj{JOdGbiKl79Ddu1rpvi>JgWU`^d2`&s;Eif}+9<$l&p#{Z_6MRFGATP)9- z)1`A}%JSr`d~$%M`$t7ab{c~;fprLwUJgko5ATeVPQAc+h$rrXjf6#Wcwo48agYng zX8JM>UCY{scWtXMK$_L=o`hUYC|;u85zPtb%-qR{FOR4Xk~wVRDaNmW!EVs;-8{YI z{J|A3tWx`zyu(rMRxzj~wbDhTEiuX0M%Et#phk-q{&bGWQrkX+tU-M>M$B_xULscI zb|B~=fAL-(054%*N7P+THs^%eF{Ao}296PbV1JTst=LeYsXuu?ksN8s! zJCEbMJm#|zf9Pun0z%SwflGY`d3te~=6F|wMr0toi1GJ&z`aTexAE<`c=IcZ^P)e? zyRk$FR~`sIj!4Vj1lui}Q#5d!rg)m$jV3*mT{T29NuI(5>8B-U??e zU8?PI4S%%Y=thjRG+E%|yfs@E3(ID1Oo0HH?=6HN2w=m~#x?cd?K7L0UvK0!B^Q%> z2RSrj3q$jOctv8pqc=|Dg(xR+=5gquEujaeD*L8f(fmc+RiWsCj4B z-zqjuaOr|NrV5AXcbWjsgUG|t0h*EqhGRmqVvO+=#-usX2BzaomS&z9GDY|gYR3Nd zJP#f$8%sQn$D=={qNx0pG!V^E1Do0y#J)ckdu<3!YV-~d75j^eg5kK$`&h;*rA`9;*VniZVUt1TVDXs4&Inc ztg7Dxvkdl@W60cd@a+2c)Uj0j-XZb0Kiys#jCUxI+v~4E;K<^ca9|vzdMQRQI$$oI zK)lGd5-k<>Kl(_VKhUlXNsIc>h~_d=6|paJvng%#VW`6pwV4UKVj;+2j`ahs_bkH# zYfKO7IA_yY>S0S(FJ4~qxwq?7SZ`d9{KjP#XSKcD0#(@^MfIx4*WO?JPtI~Ct9 z4DQM{5H8jO#5$Fb>aQ&v_^)wy5l=>)FzXxHS!3M^T&OHaAG7SAycC|(3AHcB*)zV2 zFXdRCTKCaC_84X&zuNF~cb{ooh*kd(XmeP^T^e_=-3@y*=Qx0KiFLlZu+im~qyCm& znQ^ZY9sv4Y)eM_GUI1jC=Y3OhXBse^{_Td>x(2$suSLpL< zxXYxRoESbnHU%D_p(!d-%Kj=Tac>v4KfKb0EJzG`f;#Py&ZL7qxcXxM{w+(qL%gLh z`8a}BJjk$ZIOFY_N|_1NQEDD5^e*Jm`*&OKZsqyjCn5{%cX@1R8h?APyiY~G`CQ1o zKTDo?+1GwUnMF%n3JYme@Y2g1(A~ilS+=POq9}|FI1Vva+Ricebd? zZ13z$b=tehmMRmR_|AOM{WGXN+}K2EGzinLy&)( ztk}#Dp?I(1-0$h0%LZ1q9pVTF>LK}80cJc=IiJ8>iUm!iIr#~=d zrcb7Op&@hZk6I}&buskB$4)qN>6181xyw$#>j!7x7g#mf4St1m8xUFM7t0Y-Lx9Kp zNo^Pq?8&m6j)9$<24QJt)`vj35uM`X7!a7{GWN}r6mV5<* z6tp-1w-B+4p{bdudIg+^w%X=Aea06WvZb1G(wiODpJGG)V@(k=I-ZnQAZz*fH~@yD zZu#i-=1|8;;!(8wzFu?e5<1y3`?EgZ!92npd{uC*S;>^~Rt36Z?kJKycr}&$Mg!%M zeWe=_@l|y+-0Dur$qxTD$J`kF>P(=H|=>zNa{Nu2!MJH#9xA&e)m_tVm zh+??+g;n1)P(z5c{*&j`R@{4H2){N@4;B9xm9$M^p=)c6(oVHD%u&J@dLIDoTrE~y zb^ZMlr8O+Buul!}>w3k?Asb>bGa1DA5S1o*7{*}wNkPav>BMf5@zN=r+kttgzsH|y z4yBg!DU>NcoCE1Eek+w_5*qTb862O1$JFm?a93^HZJ3$n@;`r`i%09YH$tEG0;A;x z0mt(I6+OC7rvstcbZPck3Ow$Zi}dLTg*N6s7}h$t1wI2k_#g^q_fW^4{5KtIw~%-w zj_>t`j2IeP^b34^bQLWt&k-C)31zhihl`80fI7!GUTQuP-=U3Q9U^mceI1!cTx5Lp zFXt5Sy*X9Vm}AuY(Dy{USUW5}m;{albn79G8?Q`tKOp*w{829x3(`qfftU;H+>~FV z4UaiF^UV^i93Ay2wj-$NL90HZXA|Ai0y|u~ej-^B zFo4N)xt3}1I^Jv-f^D!o9oG)pE+u>(t+%&Kt7I>ZIj)Kka*Ovg3YBy` zdE%zU(a4%V>>ry|XOjt(?mp>qajpE_v>{La!Y9uI!~Hd}=K1IUimaY<2R)C8nGq8P zmXNzGWe6Oj>d5xq!uw7NG2;NTu?)M9v}d-9N5~#~o*J#_GPi-H_<+<^0-H#s~q~ zs3`YD&CRf%-a$miWm?ggy;U@fm{?B^ujXE_NH>>6v1%6}P~kK80DMzDtn;^SfR$yz zH6%Kz2VV6#j_kXEg9IC2NU9ocI->>~5s+HD#n+u$XWBfc&s2umHCK0eUS33m?Njm6NGr|3rV zF&wM)fUNG^eV+gsV;a%KYJ6y_lD0-H5PkP4X=>2LonJQUayJ}9Vc;7@iub_Z)ezy; zYL?kD$qWGuyUMpQ!f=Mkx?S2T;=RHeyvb|E%L5|h0A?6Spofoxb{Cra9b~Iuv&C=m zwrrFt7!#zJ&N7%49V33=L{*;y^(-G#k;Y=GQvK`xu|c0Af@;NgKQW9E%1$mvHhSE9 zx#AV~QpdI0fopt8OfB20LJ}{Z94C8i_eH=8#em|C7{Z29ya5aeI3N@AHJujIP~YJb}~M%kL4jRtMgOnjB1bxAz7|8 zmZDb`Z;M=2FXFpY29ea(e`3$-)8^o@dhJ7;-p}eo&im`dn}PLO(OJ zKbi2}_NlOrwYdL&3*j)U*^dvN949)Dp^Y5Fr_RK*UWL7)l7|4vJDp{uW5p`;Fe(+)@gT zLXnD*f=COI{pSyU!opGPVDdqj!NuVs;qD~q?&UC4^S_X?inM$52LIEdfUL=VB;Y_$9659*L2t-H zeZPl=g`SDriU6jSa!lcq+$L{JrmGzCoxjE4x!c{nLql7)I^~z!E57U4CV$rJC^nT{ zqow{0TyH+~Ag4U%=C3X@a8^rx=%{Xfpjr<6q5_X~Yx(0RVP?+yB-a?*Gx8@K?P5sT2PHl8)BS z9pBd3$=v`*$GCjZHb zsNeAH|Kk&rou;aZGMhbIs)FMA!P^A+}n^F{I;cQTED?JJbyB4d=2zviGa^-{m{{^%ZAbRwu`mkgB| zI>VJ}ee8JgSqeKsIWHt1Q#DvQKst7!S2?fMFVSpjpCBKzE2eaIeRNkJf|G6V5b-<~ zRhIm9b{BKsguiyjTsT4Y)~a>Ca~$`>3up66gPA`CFssB5S`+7{=OT>*aGF~S@gZKc zKm>XpP~8YARq@O5IkE*1Z>KgtNsR>B)7 z{1iE`-Cywflf&uqcIINxQM<|UI~>x9xQhM z#L-6f48yLK>Wkr!w6l*(6a9FEcR&q;hC^i?iS*|rOA-lp2Hj?69y+V@MUxebGgS^U z?@w~ovo>F3M&Y_2K1LW|fXJe*Y@{*AF3|1-kge|MkSW{58aLh|?ig2*9j< z3pwWe%BcM&I0p`S*gc)g7BarpnVf1KJ}`tmGHW?&f(weng>F1sIsU);0d2tB<|;LS zrVUd=(-fO@*9`i{eMJyF1+d*+Neo9>9Dc47?%S6wB?oDT`C@V6(=Y*E;L+h)^@xl! z?br7yt)0%1*ZfxWtbPD5qFXW2iV_=vAk%v%+sA+Ki)P$=TWh7^bilqBn&`#_E#&*| zm}~&1L`0}&<7w4E@p|jPDeK07+Oi-+ZrHb`1K0p7rb686+CwSmb&?FaF8A8wER$#_ zH}vd|_pe}~S6Rc1hxD!1dgoo|XS6;iiS!?4Bc&R}XPvphxM&@GCzg@`R4fGkxINzx zh`oehxAJ@Su|%PLVHUfnh6%+uyga{@!v6Ts&UuoQ8XH#8gGsCUfS?62SbcN;rjDnFvFfX~~TUn~DS?W%xtbh!>eN5B#phG6)^ zq67pz%X&cAXid{rd%TB*6R3QZ3W%KW`L)Z;v>FUQ{+5&rpA{*Yruh_BY8@e;O~06i z04-UR#BRc3uZquB4|R7wc%%3|f?@FCSroe4AVVBF%*GF=8}d8f1=6b8;YdD?BLOeX z#sG`SrO-D5`5cqZW=`b^D#!YVhQm%$yQ{+pL!`~eW$YQKynLJ}T>E~bk6FxNq77cM z04+9qg(qm|&#I-KL-vbvGrlg|z>G%u<9GdFMN+&Yb&@vS-eT#^7!?YXa`%@3YwJ<2 zDRmgku0^YZ!i??#IJ{BZ7PfsF#PS^ zd(V2`ExKnMK20*w9`B^hCn~1d6NF8E3HWO@w%)E%P_?y5^#F!v^fAGHd-xjq4teu8vFcN%fI&`T?U%{LpB|yy7TIuL;F|5{Xa2#h zH|9_QCR&wE?8gAD2c(t8&mD*RK>i-YHy8YpNJ6j?G3!*u!5ipd!8rBfT*h#n&<1)J zdKQkGSNk0CeqSl!Li?6|Ne(oIGrEI|vuc8XunsR8GSldUHz!9o$8deTq)v33@Nc9>rZ_?DpFSDtWMVBt) z$C{@24?lL1>Ihx$U*G2U+oYfP+}7DAy4s%r^J>15D$A^hrF$TOJ&_^{;xRU-=ar;R*tIPs3dA)$%aHg4ZEE5;b0t1Bz zO8FCDxolG7Pjox3;#c%~lLGF7x7|WQN;IcP0!%+IVrjwM?fOOf zKPGI}69v`P!6I7R`_JRtJ8AJ&R>6CLnj97ska2V~nNlMFpy#JaqRXt?f<}++Me4dT zWM%;I5)VQ@aYz}hK;Mq$Qv_{v&^RdcROTxJrMzKN#nj-!m44MVc~rTbH_4hB^+p9{ zy&H0vO>{1u7Ga<(Xk3^+Ry5iBL>N{EX#Ti7Kv@+|Lc9;H0gtpp&xPH^a1yGyhwq7< z?6^`D9;m+%Q7j)tVSfiJ@r%h^FBVgKbGwlnpARlq9-;;u$4P8`aw6LszAm&f**g;{ zkE^%Id1JP#WCOle_4J4jW|QF#v`6UC*KDdWaUk3B%;eF+SotQ6RJ$1@e%zC@7(U}$c$v(a(5lq+A-(pYh#MN&kH^Zh7m;P z65ggu{H1930#G|qm;uCpW6R|q)eGbv1f-XRGQgc=Beh@0NpS8(pp2&G`y%4yN|993 zDxEH=i%*L=lBkbNw;3opa>>X8L8ZT1Z5$YN+uK{T#2lo%H_m@gDimON5$DH~0f*3Y z2(nQA5h!5Y64eiDUbcXj`7X@D<3&LHYWAKU3IK;fq-% z-lqMyE1?#Z@VM9=dDrRlcRN>=;~%F|b{{G|YTnZZSfYv$nBMtT$XGxNDwa z^aQMx0JPf6aO3F^$F$Ma11zK^2UEVV%rO*umXLK2XZ-#4wmwT6FxGGQ*jbg1gUoEw`w^%ckq*!L9dp_>=6zRU^#=yXc2K5?Y66 z)|JFXjblD7`$Vb)v+AbydIX;lA)ECN6NS&KVE9<>qsuMgF`1V+E^9LYn_c6jX^&ez zbi+abmtlv5oasq)>ZGB10wpc+tzOhyjuM`9%QEH^$^dQh5hEZ~D zx831y>?9ow+fkJVNdbwj0O{bk?iO~c&#pzK!p@(xiO^I;*92p4Ite6=eH`&PS@}gA z4pkCB(FjQP+iljH>UFBFAMVpiy2$OhQ9AU|@bdU%s#paV^OeP+fJ<6i-tz-ddO{Ay zq3<62cc!c&3EOsX@2YA@{D`GqR6lhRP%?Cj)H<5dvxdS-NeeJBlcl+;kMT>ux9ibP zMUBEbI)2$f^|?uUXKoLGdc$BBpe~atGwR1uE?r~HTFPSbkjUmy%#4IxR7DjyjP;P; z{1@fX%wj51GS&y2SF`K})IVt(ZDj?8quO==`p#Nv-g!$g&#wx)NG8TWka3zOI7^*bl^BVn4tIZfF;#-s*7wQ4zu0Vs-7 zb-}Y_3{^R8TG=ub#pSy|I#0ABYIh?&kf%O~!sYm}s<{Nu|C6aw?G8|mB=00lN~O`G z7|!VZxKU~7-p+BLVD;tin6RkEP}P)I*jM5sJokdueb?hlR8GcT>(b9nIOi~IfASp8TWc~n!h7V10+V^ zh?GL6A@x@`C1?T*VpjOS0X;y%znwFbz)6PrMYd%cm$p}eHSjbh8)j-~4beITs%39y zA%z3UI?qp4Cp7Dyg>`#>u6mL5a6PWyhrwW8rQZW-+BZ#zco(f5pv;AKg4~e-MP=+b zfUx`S2vDH1Iy3dFRffx#_SPU>BG(1;R?fap=S(HbCb!i3BOkJ;)=Y*AIj)d))E5wG{DPjDw@V<%auBy!S%<19FG&iH|0&kb@l;%wgv>t=ZEg z2sk9TFwl0cH;iwJ-3Iy+zwfO?hQ$Vm0*?LxfG6&R04|)DP*5WRs?vs`>gCd=F)Gl@ zLx+N6S$ERRMmyS0OH6j&zN<9VG9dtXim^Ip46^7Dz};Ya94o~ILu0NK5~MA9qzPBm zKhddCB4w@ScJYXHXW|tZ8?}mSayFe^cNA>Z=6jWFJNF-{*s1f3tJ&Svc&cHq?)H#( z`r6M9ZN*~ze_1^X4^DAy|Dq?rD5$J7f1R@(un=y(@{xieN>atPtl9jL%?z6efIQ5O z2MDs7Bw$u}r#tg5Ez|bDOiFWx5otDV!wBae>PIXmbI;IeHi~*{>1OB9Z?U zkGPI|tn7SBPy(P5Xuz{P+ax`lM)QA)=gpOICY0S&l7Jc+s!3@Hf*U&Xa_0nFz^`x$U$<{ zFx3CZ-nC-iEBeI`w(HvQb1KltT`uBqbV%(sFAB_N*LSJuj>jEawEq&;6Lmjv&MDwP)Yf%D z)7SgTqOkobbAOF<0>FR1TeWN>LbNQvD>>>)=xVU}jlvfI)$Lu?*Tv-b0g4^Ob8O{K z$-+W?J~EMUA!SkT)1$Anen`I_ar2|@i`N${Pge~WZ~nx5E#2uie9cHzv)FWYtJHLM zcdtx7=r%)`^ILpUu=H4-I<4S2wOXpOlXm(!JlcNF-a|2avAU=;$-pnzJwaW+Y~;JKj;{qO=n5DEdr#h#I< zV^wsp-QL?W>~|BNLI0n^UZ%H<|IP)ewoL0IYHYV^j{qn<2hN#nX77{Jt-Kd zajJ;3Mbn~hMK~}qrkHcIr)Acob}m00?f>T_4222<`QM=>L76!l4!R>@o^0}hlihFM zsEuKOu;hv-05~iin4wMA0JD>X8!9j^Q=-PcJd6ovMS3SNat@o}1ffcY-FcwG|6nYK zfB^^cS{r9coSmt0UxLCN{gV&yB63#0xK+(N1z;wz>=5HqehT}JS%asQVO>3uEs_FM zMd6wa1(iF z8l+@J${1GoVf+q$6gRsnr)_Ck&jy2GG~=E^y{W)a0I9H-2xK5!C%kP0Ee%%nuT`p8 zo7$`@8(&XSw&BW5ck!~dk#?77%bG#Xq=`!f)qN`G3U{#H7*}bL8lzQ!yO?L^%#e5$ z=}i*(%6hTlf>k=VMi1*zo1^A7Is7P%kfLX+MpmxPk}V0VXB@8|f};m!Exe<0bFv?0 zWpxvq)oy#tU7s2|YHoNr-kUb_ixEI)8g`!J3!HUXaFt8?Z*JM#a1WgHu$9ocNsYhb z^u5HhbxVxYeJO3p+s^pZSj2=)|N8O@Qz6&L!mN)I+v%)V2%**94dzT{mwD&Kj(;92~f< zFlPp^I~gYMgb(3rp}z*{33^E3HH|#w?cn@0kHjoKqFutZamEFx`YHBMU8=Zi6QbY! z41Sz;{ODF8duePG3*i>F(fPD0b4GS;se5K&PI$=Kwr$n&0Vxr#S*Xoh>s?_M3jLXKMZ4C93<{xnlaJeiQ$fVE={LkF6mUj);C zU%7wp-1`~tN4gRE-o;F_z?sJQ#q3PYWqNIc7x@Gv&puj6?>+ue^wh1Shy6?GKTdw) zKr>xqQ&+Z{NGsXVRVcYCL9)%H_)qH-#5AeLB zyXOTJw^gch{5R9` z;%1pab|Q8pNyv&Yp2*4l($|zI3Ori>(i!2v_pS^xUjDj(D=#tbI!ZghXthc3P2g(EwSAMZ~G~m1Z`@STe;~ zN+no!C0PcY)otkOsaELfWa$cZ>`K+1%#xY-R6-en#|uj*ysqmZ^jn?0k(ow!BxN#p zY$R8%bftE(;yts5Rgl20ep09Sz1}$G7RXL75IJKRal^vyUcJy|ib5J@s?YNN?thr4$3FKZy)A5m9#}S=#;o<*Fww0?1}Eo- zE%g(p>=;u%l!@vFJ4%IJT~UF^6P~WAskND@LtxJ;YELM7{OQg#sdL)ruB};0dE0V+ z*H!zbrpG=FN1GZQ?N&6ywt;!ecS!=gA z>bB;bBk-(J@L99avu@#MBPYjBbQa{-<`a{JWNQjCqM>CemA(|zpjmhOUeCSf7?mu+ z3MCeIacCLKp()eOCgGw2T+F4NCnb4XwUKl&icHFdSpmccG9nd?8W4nH)mfqxam`X3 zn$iVcwKbzMbKT0%p2W65-We}tn(#d?3zE-mQ_5DN5$1|{Y^HO|cjqdVP@}qYn~>|l z(Rnucg0m*`mC9~bWp2TiZp&E+bDjCiW)eSZ>rb=vS6a`fG2FJ47D(Nkad{c*AL}%2 z78ZOLw)_?jPA;Ozi}?Shw~ADt4a)7%AjkjtFMSw##BxWA@0&?09#K*8$BNU$iO%ybYRGea~bX2W8QPGcW*XpUEQ) zb~oQxsqA@?)cYc*??q+*i{^VTx=YIwIyndi0tS~?)-Un4I-&k>L!l_iLrzGgP3fM8 z(p)-)6qJo8R(KlWveH?s#!9M%a_QFhW6g|NgVxvvVbsu?!3gC-4nyKLivArmo#mTy~^ zf~@3_nX!0lrraB8%=lJBqdACD1%M;hE9|MPRN)tUOtgbT;tV#G2}osZ$b8GHPJ1)) zl#)uJR9~R<6&9(KNXTSim+L11EkE`Z+fLI(_$LSLHwXQ%F6p0=pMWZepz1KK9`+Qp z-Y=MVP_X@|5Hq-GH6p`oy!lY+jiJFNyU$zF>|4+0A+ec7hM}9Gi|e2|u!^gwC#+}& ze%sf0!7$1)bpr>#XD5A_`fuw`eJLOqZ3@yeW~*{x+dFOV$vx%oEh^r7RK5?XT1jU0 z3t`Kj+!g6#ubV8oV*OMU`hJ->M^e?l1h=D|jhL+*E1fu*KUoC}bOwGGW9|_*#@6yN zB69DsGg~EP%K&DI(i_ZOzV%u`=QyY)o?kVQ-<=>>Dj}BkNP;k5hm)+6{8=EQ%|!c| z)u%|sAkaEDm}GQ>U@LF;U+)|C!aDXv-XC1XKD%;8>0{v0h`2!si+&cZmN%&HYEM!> zhJ6q?*H=HHDM3!DA|p@~Gb&YuujZ*BK^t0*6<=8uv}h;1uly)j^-;B&KRK}=@$0m~ zpWNACDuEMfy}_Is$_oo+z|2*!KF_DSpGWm-Y}j*{VlrD1s+c2Cy%>m+gF)=vv*9Y| z5V7~6e5E@g`H^{X^PCiOANhN1z^;}l$2}=?FHZJmQN%Y%0v1en|g?k@T_t^9F4fr4$<5QKI{n z$%=xqc*?c(AHAo4jGy^2cXJo@h~>m-nX6~CxC79efmSEZb?KomVQX^JM2|!`7Nh**Th+m{g|nCcP!A%@>0L+?RwV_%P`F%7Xn&3U#o4_&lZo@ z!dxd|&EMqSrOe*VV4Xb=U5+wc@$!30lZP#j_fMQp`%Oy|FYAq|NI7Ps_S!aU@$LR+ zoCdf2>z#gQroqbAl-!+ac!HAzqVRqSY*vWM-i)Z}aZdx?lLs}A)FR}4 zI-d-`fQ^WU+QQ-93|X_2IzOsj$a z$6&yU!aQvi6+{Og!1tUj7D^*60x7E~8Zgs!%B}>gOX-o|vlSnSDG0{^vg)k>huG!; z@nU>*R?jp77)f|?X$-#&rnPb(H-%JIm3C`fC!YqPN z{2B0>N|8|}d__U`=%`bLeYzF~raPY6p`T`Q0oS0M3iO^31aw{o#zIbV`T#RKNdjTn zkv%WlFKGv8m5L&+!;o|TQ!8*)`DJ)4kTq9Z+-}GkFf9rVtE5>|&2qSwqIzNMMHQg6 z101OWFqk5PP5%(qdvu7mY!l!GPvODTa@!JPJap~C>M=~1i=e*v>Sna`J?bgC3dQg%tDQu%65;8^kfbBw-# ztP9;dECFkMIuQ*Q4jwel0*~7yuzVlOx<2NdO9LBU4A@p!-}kNy0Neh^aLWE;uEJ*7 z$7OA|V1g> zo{P%1I*)~q5Ptq3BHM;%uky9L5D-ORtS|_G-pU4^EYFl=P%cSvzJPb@EZNiTWr6ex zS3nj~n5(_Cjm!M#ro-F;o25$wzx`73ONR6Y!jFvlc>49R7i4f;^W~!eZ$8m$fh&^p zSMq%?Cas4BYQOw;mY5bI>)@FzZD_?RBZbdHCy#bVpO~;8j$7;19}_KMKUd}dP zF9dqGPpV}p-TQL?qxv{*V0S9?wE+WSoB@DLENnP-^Ih@VUXK$OHhva;uGxHns_h`^ z$^N|iStf)XxO6>Gw_k@*#?Cli3I6WS_s?zif1xpdJvx@B6Dki-DxEFGac|BzenFOS zP>7O);W03>&xeYIw=be+A90L+`*THkdhf5eSFfdhtyl&~Elnv5n&HZ0|gqJJ^SBTq@G%N&ST;Lx!u zfPI?)2<7V;#u8klLx~C^k5u;T1I=LpVb*ms6*KB%?xBm{f3H)xvKtwVrfmpD*08Cp2USIQ%sP0B|>t4{)*ZvX|X5yI$#X+rwtXSAHwIqsnD^50C%TtM2vv&pGFYWr+018lY%28DPeZBtRYtnKUrvBazv_3IwI_ zxj-OmCmOH^2MVK%sfk3a3AM9An+Mejgld_pfnq7%^zH3o{Qn9CH#}^FEIom^Akqr( zv(D}x7oXr_%^^;dDHKUga@j2YxEt?Q_ua7h=ZqU*ULInnKXa>Z4cs8j5Rh$7 zfT{ZXQ5euL+2Y(@`g#|38q9W_0MzDbNt*nrSsAR_0e9HZcbj{pbg+fK8W$5z1uPYJf=~$xCN#tHz$*jw1-%LaEbu5ed9vg zA{wYNaB1C1i4$5PKncG5?#sY;DQ7F4XhQmDwJeaF;Q&|sJWLg$K|)Gs7)Zbx^BqXqoKO)lsy+Md_z&TfU#Sut54Z0bmSydDr{J>l0(CTgb0Ti(W?$j@ z=|RH9s;bu!_S{yE*|m3Pe?#_Zi_*ZcjM>ayvCdy7ixtne^WSUsRLA(+sphFNON|P2 zJjSvH0o5MeaXOM16!@*|e;?XIsZlt8d#zqwy5No1(Xu-*AUJ7D@v;4XIOnQ92mdV7 zO!Go#k(WaQfZnofEM!N!3b^NQP@%Po-#~asQUyT)RzOuWJe7;`7>J21z{t$XHef`p zgAwGQLJ%-$yT~tO2IL!IKG_ixT713&@WjWNBRjULiP) z0KRDlM0FH1&=RMWjCDHcnBd#l&$ar?5lzCQtWa5#-cmm6;Bl)|PpuDElm9;doLU^y z$5SuPUoyG17u|b$#(=!&0wCLjR!|fUj?~<4hs?kF;Z`HI7p))%hiG38Whca-mITbS z+_{^Zy`uGvC*bj{0l}7Q;&$6do5h}69}D8&-H~0>sJl>row0(zR_=mr-Vj2bXniae7Q>D*QO(>TkKzgZfr}IYq($m zGT+J#K>sg?PnlWv_VcdKwjPV!p9?}(VYd76FJXk&xw!wr=8yr5l$}!l4`a{iya5vu zKr9IRzf^f)QnCKzymp^!-ABFq>TBw3E$UgBA7+XNz8UBxFd((5Z;Aeb7NuQlS;`^S zuO5M%d~TCMR(b8W#n1}QhLZ=8S`){2u$6t(o=NQRed`7J#??kC-> zHeWx|zv-8#&mI_*BrtwrIj(;CW8}E`7m%E!*qDrs-w3p~#iu`$x%IqGS>8)9+V|pH z!Q$YWw>7t;YTpU|kNH*e=#A-`tn8tsj+NN z<;7HVaf##n2k%DoQnKj9utzjoh}DUe4E%5zBp}9~O9B?BE9gK?xHzWvgJWLK*Ct{3 z^UtUK1z;l0sYa7f99*oqb+#k2R%U8w$zAxvPiyFpN{+M!3w`O0`nbnmzVJ1s# za&l0n15VTge6s&J(-F>HlBoi!qsL=r^<+VGG*sEI=fcErm&}fxA&zQ~i@d>}_!n0G zCfxEPdS3L&t)$J%%P>0RueH$E;~Whpy&F7SBGvEWY0#7YGR)i6;VX$sg+aN-6xg_L z79a{!Z!&0Tk`)k@#N6R%uNR_&x9l=h74}rW50?Y)=f*Ay55D_i?j6yZ%YN%6{%9JT z=)N`)fBi3AjSUZ=KEpB#oo$2O8>4>rS5C(y#y!{phbIMW&(NT~ht!Ze?mq|5w)-Ax zO=$d;OpK{ByWrz0vfKODCW zJJZC<03pSDIAre4V17xdUYP97O9J-L#@6TD@ixG8NXlmfDdCA@Dpv%8lQZ~yZ`Pbq z61dhZqU?Tp$klB4(ukz%x^c5||U! zHC-7Y6>|yaZExA7-&%6`uzLEAL-az0>B1PF4!@MMxqcS+E)TGZmm=2T!VCA@-TtrV)mt;S zX>_6fGB%AJ(p3gcie<)2eTX1gyik;) z!ZO&Ck{MK5M2rj_d_+m*y=Mizk{zlB+_R(VeD8QT^Q!9sd%*FI@T+b+qsMP*M&BMD z`$g)cfX8WWq^&cZK<$<9lb<<(n~nbBitG`2+v&XHZ=7o_+8^rEEo?ZTmN$cne1xB* zlr4qUwC)dcOTW>|AxK)_UUIDA%2QpK^=o~?tFuqv)CT#va5OKj!B@RqvN-3qPb1pD zkr;`RYHFN1?*C*7-s5%IhM~rb4~snM&>vc?hk>wsBOe2}xH14bPoQHVBp5#V`+if` z;-AsljlHk;?>3+4nYz75$&4CdH<(U1D!*oG5&E&!ckyMLKt@0&TEj;(FZDb?uDRF5 zh6rBRJ^p6Z(r)*&w!Fr7+PrspX!u#z8?Txj7Y_Yy`rqiz(`glWAs{}b1GBCp@t;t9K*^H>rEaFiHH zlT34E!#~NOuYKarZo+U8ql@wW406_}J1Zgtd+&5SUzpO*s}kpm(fp%Rn69{A|DLM) zJBs}A#H)k{DYcWmW5mG;3UWxubhuN;O&2EXpPJp%o6n;PgXh#NtgelAT$s}JzB>*l4?K^E>pj{Q|q)mu5 zY*aBTD+y-$xVn5T^C9vR8^N<&uFLG!uasDUy%=3ka&BJ&g>bY-G&21_Fn+|O|6t$` z3E(i;=5WXe6>}VU^CA;Ikcn!K!Y;}*g#HO>`E7dc&(nc3vFBPyJ3P0w<>(NLF++&W zjY*QM>{xcEq?+)xo=>?Ea9m>^lradnBxc5rBxD+AkcHP@0bnPXWrZT$&@OIfb(&z0 zof3(i{mbt0YmD|A|M<_H``pwHWNbHT$7CP>fSKx2JevhQ&HN59hsFd}X`3|(Og9yu zH*B{j=_a3H!`fuUMw#Y%X85PrncLZt&4TN1%& za6P&E+8m@L%e#|@X_wfimLr}mh{mmmcDxk*wl1c+B^LKytWj;J?aa>mk>Xq~wEqQV zl}KXt6q-y$GJxn{tl5WEX{jkJ7Y;zfL5^>i;M9o%e zJ?^N<2^j(;xobk~ERflCl8Tp?SdWub3lEKtITC*)gybq6@9iStFCU*EuQsi)`%F=7 zK{0+svGb+kE`!jqQzw0{$={uaQ&o(X!q$XfB?mMTzkElq1DLBUqn^8QhQ*&#dUsQ` zB|nJ3h^ek-s4RFU9TV?Zi<+^Pwpn(FSF30|6aeKq&| zwbX;P5<+X@-)Y^AJEop=EFtaK-LuE`GPKomv=j2R?-qv4#c1zU>Lk?Y+`X)`*PyH3 ztebFM_wFs-4FetZ4!wkay}J+e_6GIUNA(jX_3uvWZPw>;pDdDIKS>R#P7^2?xgXrbLCOz`AwGvNmm4~OXV@= zZe^#6_qJ|3N4kEvbep?&TRUsKc1}9s?yl~Z#Ou}_;l4oh;EnNcH*$5CKHeSXeh}s9 z9_Lz_WPjjjzEJ6vRO8isS;=*G=Q)#ipcuiNK$I5so)mHk`s>}vPISLZIOy?CY9%Dy zCh`u6E{vb(p7udOKITVHR6g-uczMEo)2Hl_Z+D09!GhnxieKdqzsbKR4<3;<*U3rm z$lcFQRxbH#&JYgf{JZzaeEekht$<|S06xK!i=uu#903Op{5RMFv~&Xb%m_W!@{M8S zDhEQ9YY^{2K#$Q$KGVR3-~N2|A&b%>J!~Q0{R65r0~W(Vw6a2yy-s=9o~jBywU`&m zXBn6r7v@nAR#kGUCndD%N~p)pu;e>oi_YO(l?usv;fv)Fe2*eL#v`hpL@fG7^3?`v z-3?uw3s1fu&G$6gBO$WtYUJXJD89WYj~`K)=-}_KgL~0Yi@niROVNwJWB8h*wQ9V6 zNXMth#&>C2@GB-9(@aRwN$535_+gwVTa&9gpN$2l4ozj20_rd8OgJ+H@d#mn-5?oAa|KRA_0CK}i=0_eIk?h{Z!5;k$GrZZ3 z>K8ZVkIg9YFPy#jGWhrpI28-`u^AulD(?z%r!i1%FF@`Cwg5LQq(LP*$ivUutEJ%$ ziJu&m907PC$VQW~{6Skg6i&(T56kEiYu4717Ld(cR?YHs%pM@8JWt6|rECP}+i83_94$IrFV@~Vc9^V~Z6dmyL#YT=C8*JlY zek-{C&$}m_e@IfyfC)!p@EA+X@-=}-@9$ot7rZ5Qty^qNm>o<`>)X`!DVrQB z4+D?iM^uLK-)faqdu?y6{uf}9Zj+(gSC#ng?KFoBc?x%ubLz>P{p|p1_q@Sz0w<`) z(LsPZ!VNdF{XRE*;=)K+DT!I-e6iZ*vi4pi01OX17L{eZj<0r85@gFW-QX0caFFFK zFyG{?o{!cMEwOyVCCF23EnRNC#Z}{W+e`7H?OSfaikUFYTKjk0)vdQv|BZCqkXf{? z1KwwEl2E4dGT^+g6bZ_CKLC_eWN4;cq0mg1BH$UJPk^_h8I?S|BYjOE3RmpRdhBCOV8IdBUPoPeheE-JvaY(1-mAZP3x_pk)TfbV&jFjd(}HGE0{ciuWQ5p6 zXXMSRf);UC8yjRUs8O3`FT~TX%U$Sf2l|iqr8?Sf>MOI}dXh2IuT;>vGi*Xb{6lXi zBXJM88{}q`EBI5k3t$d zB}%iHI_;Ztn>*z*Jg&%KVh4cWHE$Y+IGP5|0Sd1cGXVY!KLE|z$id75lzjsda`}fL zTKLT`!|?{z6`oCbs{xAq21c2uv(HGOeI|fuRG>5z=d5Pj_bz}oWYUvRv0vKaS;>It zX9=ekdXhzQYopD$HA&P%;WvF}farMt8^ABkIW)jxOaKU|l~V$Ln_rs${K;)bvK&Ba zTiTUN^SsGKNgjfz>fu1X|GkC>hOD72fXAKuE(ccyE!r--%zbGvGC>Bh7En0H{FMXc zKS>M{KnAn%Z1#oy2dS?A^VjbN!^2x{s}*=J{?EJC5^6MF=$kKf+{+{QG93PE$jI8I zqFdG8_0nG>r}-pBN4Hh41+U}snmNI=hX?JD&vDYNG`Zv7+42-=nZ_FQigh|LDQqDD zz49|yfXShwez$%5lP5VDf99I}llVX5>eC5l-swF}_>0i7c=mQkh^Lrau+S)rlXQyL z{S!9yXiq?3nE?YO3N=pCBdSkH6RUtXp#*aAE(32ViHD zPnLR9R{&q{tKAORTl;WMkJG2xWm%>VPh#zrL7+xo%jhOx6eAZ1H*TW zKb0TPoCeV6Bk%4b0-m2u{L;K|Z^`e4Xu)0X=y{-*lE7T+ic7g#Ozhd$9ut!sOXHAz ztIq)YV&(IIBee(D(W49ledt2$8Mb3%7!&p0f_N=UtDi)vpo;RcG7nqpG}R+P^R-0w z!YlV&1bnDYp`fw#UnKpl@!)ExJPn{P1Xs(~On4|jL2o+VrM590su)s)R4D%88f6o@ zI#T$ABIf}BLdAW@iGBiEJc<^}SKVOecG+fKT{^hPLc5{6^;MWVbpJBHn?F)jjI=>GI^m)cbTuqlKn>X@ouT`t|N(M|R_A2Z<$* z36QL`8gpY4pLCR|efECK zInVo@AK&?Z|6KQ)W6o>Lu@EI6#Qmq1EV(^a+rtggIfxJ+K5E8Qv9AJ@4SeG40+}J10Cl;=RW2I05LOcRP3Ul%udk3Iq+f@U~ z383oY6MT~=X(~qcvFgK^(3hHzVw!h-9;=s)t5~x;J=3sZFZ^}J*bG_W1Cc>3$U#Zt z&-xQZoh|sMPI4@^FOTS8BtpD6LlWW0ls&~eK7cRH`zTc;!zZfn{4qW>IyI^|iT!81 z01>hcAPn5NxxU=(LP16<b1`-nY2-ELeyjmp_#X2&~X_)!$AxJ;RPaz>#}3Kl5-4wK;SQ*s(nL@S8=1V8G%Pfe^k5epo8lIV5)>Wo z5Z}3)`QhxC_0Pd`f1xQ@S>p5{%H(K(+ZXGbonNeC8b8D9>lBic-^JcHeA$SN-b8Y( zG`-WsIRdxc1%K#ni!}K-?p|YE3&bMXQo}TZZY$i3@S4gz0BFhJho4zKP446l90^p1MlqzK;Wf|H)R-mTFCHFhN|NLs0>jjd22LBnyDRol~XZNqLY;4HC*A#*Zy? z=7NgpgG~XPQ)0e@X)i$3KgSY)fPf*wh6=vBC3?#LlFfoOml*zBQ+2PQ4CkktuX8_% z=YsbJ<6rl9)#2E3frXwe5g}6Dcx1;|l*~S$CXcg9k6_w~gQs=30+15q5NvPJKme^o zXo;hA;FGsZGBus|OP)Sw!xy9&)l+r`|6KhNVEd&9Ks_a$!C_>R0QU{&((;AOi{>Gx z@QuZ{pSpkZ4h<{1b-Q@sxyQxGp}-&&E5ch*$R5y18L&B3UAyx9TT&#=q^Bp#Y7K#R zad<$PSBI{xk?-b3%5w}0gX%R{o2a+TH^f~H@m3_AAwsOINmz6Ymd zAHBVUA_77>xdcE-Z^n2uB>cWt7DgAfjQYtc&>LI^@N^G4xM(2S?xp*XPy0mN3@+!> z4R3SF?|#r>!&Csc;i)MACsE3(m8n5`bb_44Hk1$Gz zLis*Ddz(00deSoJl2UEhjNbVgcu)H+P1WR{bM)TZi*!+v%C>eMP%6NaFopo0T3Q)3 z<<0?#7G$)Dmhv7p#7#Fc(9uA$5PXEsC0pwSZjw<><@g)ppq8%DUckGr8nOpzixV7K z{ALsp_G6&?9OwG&YfecIRf{76deb%2xHtH3l*oYmn1`6}j>%L@CtDu_KA-#vWNEi%e zQX{vzFHg4r&^L#FEm1*};$D}u=^i~fL|>im6$;xP_08FzhCKMfA|gBcyfC`OdeZ!{ zf_d44YaiUg9`Va~gw(3O=7BY)S~WadL&lyc|1jim)c#6OOR@XYWxX+g6y8Yr>rQmV z$@R&)z;~x@Z%2D6Ec0$&sW0MFi`}X4i1~_r{}DGHFVcSY+tpj2DxN;Sm|)OzN4wuC zxX6)+aA+JAZgKuXUcCoTb?{%!D)r5_PjZ?@TwERIYz~jkS{`Ibf|jzZQ3Hsucv&Kl zM?>MOO&=567Nj4z$;bsXAMAU*Ain1+o#H}xO$l;f05fel;_8msJ!;YMYYnM;m#$N| zNbTiml1^odf-2l3h`BCq(HGVYkT_cvbSa%HfGfK9V^m4)r-)6yj50g=ZOr$F_U|vQ z-T$x$VEe~KKHxK=INPI($74BH&lZ2XMlEH=cQWFqwWu2`25?rkLpFAXFa1sX{Zw## zI;?;FFFZ^ek4eG{mEu+5csqdiL*f(1arW*-Ju*e(21U<|IJVa~A>N!qzMS|)PWu4P zsKDa|={(uu$M1gcfBv)o%V|1UvHng8!(=I=L)AQQ#+n16!v86iiNmJpB#_D| z8oJI&=Va&X@Zm{V?Nhb6;Ir=c0$l3X-MNX(waR;7@gf8dHE^8*g3wMP-O?rFe4m*5 zx1$1TU*S@XT8qOpC?Qr1;N16Q!tSsCE&blA@s8gi|6>3zK+wOE?my7NGy6A{fo@uXTHCiW#p1T%+0-+TT zmf+B28b}uq+zAx!GBD=@1B%%ym=UGy7~Hrr5hmLtgTa7Dx8Bh|n(2!dD~f|{Yt5Tku#G5N|9G((<5xmrlD;uGMNXz z$7;$m>eEldULeP#QL&G7qR7Cnd{Yy|7eEQWt$7op_NnNwK%oDAvRXz(*zc~e%g4#r zrvb-DlDBKI8aY|_O?1 z{%&n*C0byIq{ub$@v_$Rueu{po1nSfMg$UF_D~%9xyQPvj&KL zVezeVQjxlj67jpe7@=t(UBLW|_Y~h7qE9pt`y=>f8UbSAS76R+BM+c23jo6iqR~7( zU>cy3s#4S2z0{QS#BVjcwg{0*RNAry3|1HKex50sPI%s^6x+u1Sp8MNNjp0y7HBh| zZ`;KH(Bv-_ACvAU%MarZPmM16aKC`< z`~z2j9vYD)O=kssh}GU@|6?&5)pirjz*|&hmwHr|TI+c<>zY(F~N@ z%?G1pvoj91o5>D$=olwKT{jc31A9Oc`ns1Hzb7|XZ1oKfdykJ8|ElnL_or1U#+><+ z)cx+pNA}4M0Tjp;W=-%CrR`$LjF7MS^tIzb!kHYI@A%QN7yKfHu_;Oc|ARN0m|Iq^ zU4RoYX`E-YhX0=J{DeeWn$@(OV(OqVS)73L`x<rcJ^Or3XYSofMO&zlsl+ZW;TMZ@5v_8XV5lz$o8JUqg}-i`F!aoIgNX~Jm&v7AQ}n_F27 z8WRvhSANZLzf z9dxxtdwa_M8FqMk@F;@Wds#1SpH67lHIL25(>i0{RBFVvIn}$&?f)<)J#c+5=sVAp z)&9v~%#B6Z&od|g!1To5(I91(9dx!6Zno0?o-IWOqi&OK5%T`aeOAi3UQ@>9JITa) z7#@7!t+~9trTgOght#M?ZjZIkc)lwixA9I_bPdZgS5h|D!*L}VGTOVGs8CikXW8wv zO+!BkPM2Kb92Cn(bd^gb5hiUHbXxuBvtkus3ML5UKYdgS;kdM?mBh6 z3jWE*EW0kjo~Q2bPlvp?bo1Tl1tBT9ItKC{7a?$Nfn=_ownk(5fF~pI$!}L)kg^9X zO8C~fHBXm|UySX@yP=pam-wK$ZbQ~pcfAY4!*dQB;_^kfHV|7&Svax4qaANmGg+kBtx@Cqz{I#a;9W z>o-Un&PW_%z2L{OlVyKD0Z7)p*!!{LNC47OV_+c}b(tk`MKUSyq`6P~h19d|TEjpT zK*6|_y2W3E7{E^aIvpv+QyV6Ek^XDd6h{7`pizG?vroo_Yu?S040ezCK2yYC4n3>o zXO-wzA zOlW?yyU#+n*i#zfCBlWTdoLU*aPCD*mF6mZeVGWNg?q+Pgj9=7Rp>S3$Ju`5>UXca zgUhFjM$>hUV;{n`I@PTjI20QqSe#s$f)=1D-Dka4r;g|=OVe;wg1h`KNs_PAJ?RI! zlc@)S6u=2lN7eH(C>+v})GcvXYyccdJe;$giVY9uPWMbgR_&N#sAfb*vs8YPF4G%# zX76G}pM^~I@DJO?A0wtt6!6pRtM23543B$P_jEXvoH?T0INCkO-cRGEZyVxKf{;ak5N)AK zLYV?L$GGY7@r;v)fk{wBU$o*no02cD(&jyI;}L-9BS{xLsLZn7kL2)ejnra2XtG`y ztv2d(%=B@%FnmY8R%pvgOQcweJz)e&(h)3wZVkm__E=Grpuby`&fXP>dqv4|*y;hq#f5Fz?y4 zQWk>t6M{6Iw={s9Jw`yYZ^2QD8ti_uO`1dNCXn_HJ z6b28I=$7?PcByrc!)FQ4+!J*uiHT$kYM{`Q!wY>FF#{GPB0slDIumJ-aDv~T&RO8b zq5mlViLrYARU71lI@2l{fE6~81ZJAB#v^`HGsd7%O0a2t@Mv3zX?Msd^{aSjcwlqm zfwb=^-p_hX$ghQ-%7CUb{wtB69vSIGj06xg<1J<8RSivVh~VzqHS5>X4h_}&a1MZFKx(JkJ}Nq)TE@_v$+^-)WzLdmQwbli2B8Ia;-8_=f zX@M8g_NN`&${;588f{v}C}F->VEA9@24dxLOWb`Zli5I;){K)1-_g0mbm$+*nI zY67UfwVY34ykTI&BsZ1lG~lp7>CCcfu~_V~ptV|TH%wyN6Gz)8&_Cq+>d>)unF;kw zQQTRg9l0(zpDkAzZH6WTala->n{teS4--wq`IeC-T+bGJD71Fre54=a2{LYAZ@Uu5 zD3UNguXMWW-RY0}UMdqf+`nNOG&YwCYrBF4BUwi4|8r|*#0oeN-elNJV>6KF-QTye zBC`RVtE@rGy;^z#1+YVoK^ny5hEw1Jgoi8mLr@FAspGr~4*%?i4Y7&>@yN429pwT4 zS4{I?yI~I8m{xka@vVO_O^?u3>pe(yFbXJO#PASjA)e`f!!)$W{|MeTJm`sgAn_l; z+b3I|zK#2jt+Bs%!~7=`KP0UDC#E@G_w?Q8@0b7Z>VNh5`*S_Up}!zhvMdv90At1R zyEPL)4q~#!=m*IRbNRLOWM07kCb}PO%v>NUiY7nX3T_ycrqtKnATcTfu+5x&Oo9wf z75brLIO-?Oe;!W(5GQ;AI>AU}{C~qVkil`#XTe2-2+O6Sq9_hIG?1u{HIJm({SpGf zp=<Q2#t_-0IsZEzDl!R*s98S(5hX*3NqCP~u^icF1_aIYbC96S?k=Bbsi$|2vx^S0>ro#z^)TA8aD!q z0dFsEdSk8`XG)}NH|XHm z`brd|Yp7zWC>id4?(JIgBvRC!2(eK*MgScs+DAiC_v^2zXvgPp)TbA50C1(0i)vpY9zR`}=X*#ko7 zfJ$8Sqi1i92g)%5RhQf{k1Mg4m|pbVUpTUN9wKp~4;k}D>!n8&p8$xclJ+Zt!DxMj zEA9YjNuFX@O;$>^d&Fzx8hY7vT>wC-VVRMDg?dAe&q&q>K++Xbu8XnK7p7d9c0gNz zC~OvuCr1edptOu%Wu6`)v}`hCkCGE%wI)ZIpjQJUu{Ey8lZ87^qW3w^88urIA)myc zK0X*x*G8s}R`ggKE5aaA$vALg?1q76j(vv)M@O&8^RK;}q>M_2;Y^0aMr{_%9zaHh z2Z~6kfXAoKKey)oC=@hPRc!#*r^E+>1Cx=lwfisx7HKM=4!UwQb+eN>oEXD zz!D7z)A7dQ91N*O-qT0Pref@wCO$Lq!vSi1xn{mIU*M@GA_XV>X3rbfI?EJW`po zHK~jvtPS$rrXRpf#`d5;9-9MkdLk5!$bz<>Z03{^E1e0x?a@l-QKZ59cLX`X55$a6 zGcy6KTtQ1cCH!nd?gRf@OQ9!F0XT?F5Q)=JgbH25nOg)q`PxC!P7NfYL%NmYuz%0E z5-E`MS5&oZp=rqV6uLDa5F8y3QPd+2%_#3z1}9cGN>2|$7BQp!JuBdBcRO~xgXF%iW3Kk)8;rc0?Zs&LGr zLjKFt#2?3>S_16z;bY)4#a8N(V;U7Ata0s^nleu%fL+wwCN{`$`p}xobmlNe!eaJt za`!Pu)uaiY;{7}`s+bwSwmG8wG2gHHP^jPq!-F;;4y{6gpSWZt3+D%PzwU3QG*rh; ztaoAox|=RBe;5#WZ>072^S~%X5H<=1K@_$~5%Eni!EPp%xbj*g!X8!1se}+p* zS48$`t!Oy3(DCS%?=yG7jH>M={ru|J?x(NSzFxXqS-<06(a^ZFbib`+ik-DBHARF( z0Ng`gw;Zy&b~>?H!_&ZvO*kBO+GCE5a+U~fU$Z8H?QA`v@bS`f@6CdQA~)qR4k}#; z&9{Bh8(~x04t`81@ex22-=VSw5;aJdo zD!AcUq7!{X^aMu8h6?}>Hl(Kl8q!=303E|g8o(;c^ zxQn36Nznul!;HwJ$Sq3wvR>NsPn@m1LlZjgmIx29 zzaeXqu8>515?VyP<1H9!@SKkfP<(@X#zm2h!YJ7`g+ybyR>Qw1O&B{x`YT5{CiTya zs5@$89O@NvV?NKU1kguP(Bv;Qx%o@KzGGFpG0Vj*j92ViWCSdIm4yMh4n?nR2E`nE zt{*r=j>mr#_hU@DQjO6>pX~g5NVcYLBQ*->P*<65s_I#cKjRTm4g6gV0BV)LWbR5q z`%dzM*AVdy(bPYP(158u$yX>gF29^b%amu`f|VPswR0 zblqN9S@yVoHhkt|)1Bgf5LIYW^|Ky*+ikD{gm{ z>kvQLt^8gYj`OMi~=;5U>b;S%LxaB-6gZsmk>rXF6 zT-v{XZed^vL#`a6YQS*-mX|*b5Nmg+tQc%L`6maF1~?26;k4^_)Az;2h8O?D`jk0m zu8G}ealL=A5}O4}0sV=%PJ|}Sm_7&7Wb>GkW`+mK#uy_VgQK2KHhz8t=mKCalwMO> zSgJ*Lv}6(ZW}nRy4LE*!Tt(dPZDnENic=7!T34MlTVQ?cP#~$j09dX`Lf7h)>~W&% zLysDUEE>-#epcN0exvZ9$#_~T&(P-~N7doq*|kAzj#=#~TbOZeB)5=VnaxkU7y=(t zq;yr=Vl+jhe$E07G68}@$acS06O{kBc66nD^0k6pu$=kNaaSE17{<)J9mO=*FePU2 z{S*go5jMTwn!?r-o2!%@DKNqoytL66a*xmvH+sYDdT7$gos~$FQLb5!KV!qo=X*Z~ zyzBgG-yak}5agV`%6x8DZT5AWM3U9=xG`224U6UuB!5({Ks8zBcoTA|%}>g1tR>}5xav%~dL!&o68**{1s_|>;CyKf z^t4@$hul?;cAD-v`$41lv1lk-Y|VyHyR;+$RU8NXoI-%^ldXK*riR*+-BpFC0}d-Ai{7 zh>5t8ENP|-;#mbD3(6Dt?{o@^dra$%EJeCpBFjk9-f3o_X+8%)AeSa>4e9UE^+qqE z_0!LR<%>Mov#Yl`krY9L;Z0yHnZ7ufO9r6vwLcxpW+xkA5yjlSF>oXZX#@~nh9qMD z=H*Wm@acW@X9D&Xa z`F_V=NecZlK zLFqcrtKl`9sng-o2~in>thq<+1<^Bac!rF40kB&w5Lgw?Gw`{J3t*%_j~VD^!o~3; zs@%^=aN-;}qk^UPqqywj0qZ4hNEWxD=GF0leD6-4h+#NBxD`^t3!SB-5FibiEXcuY zvc^IO8l2wvP+TKO;iM-9C<0z&FpXc?s%?$VZZ(}hnw$2}kW)zWD#;!O0EG0&ndB<) zSlm%Agu zn@x{%KZYynBG-Q6SBEw1!7KTW_X^6N6(|se4=_c)qZHN^oTC!X{;J?ClgeN(zG|2& zr57>HEnz@V0K0StQhG*QTKPeovj*DAX4=tKt-(+Vp%6B~&4w~!&3VXz0h*6Vc4L*(tD!Qa!={vu5>}z40|*_O?>Z*1hpaPh>%_v07i`mFQZ9w4AZ= z#sx83QC@=;8yGbwkxWlClq%#FS&y881yo!OyzXH`uD4cX;(cUd`H>3 z;b(RwGgJC3G_&kF?k`#VA=ViqlB(`|+tg3o)UVbi*6d4Q3c&{v;FA*Ub5M#~ICm^A z+AeM)pg1o`eeR6do}Soe8y{K!)#T5w)HZH6>mrz2IDaOGd=}r(x&d zHk`%K0GF)Lt*|ihNMGau!T++WSgJQC4tM8e#NnUrD1L_NS^(+A8kUE+XeGI7B>lRN zNq8FBRaKCcKE-gAycnx5#F}BemhakmT8SsebUlCZ@UnqWzWGLhn`(ud{i47cgDaejC5({9BUH}D9JH6$=|tmlcD55 z>%B_#VQ=L#K6=h1361Zpxh9@*i@$8Z98YuT zhaDBN0_4EnWdQK3g(afhOV3$O3ey>J))q_&C`by81~<^s^)D^scAhJ>iZ$FpBJqiI zP(XxysRz6<%$AuDhhU%WB|M}is5Gv!aOd3RmS)qT0Skal>MjI9fvmJZXCYJ)2QIOa z(G|c;W{>T-nO4JbrX&}A07XqLQ!Fzi?NAg*prVO$sUz9XP29SF^L)5h$yOle`@Z)V zx9R(dWhltNUf*#x5aMq0q9NpK?nvX#=c~v2B0RQ!v>pDiWg5oaL!Q0AdCjJ#xB$iw z`br40^0@Qe#b9K2xJQ+hK;FJL8z+F9$4gV`?U`7=L@6qNsk{`|jSd>)%Do(%_&&@n zYq*B@_fi6LJV2z!OZpS%;K_yJ1GIZ5Aw*b>P(q54%(f+c;1@9(V0ywT5YW7=daD4f zHCn%N0wkPQ#U%os>qD_N`&3N{)E>XZ6Eo>w-6Z5!|3kpUZZHkhpL4;F)BbtS%jzvt z`U>Av^=~T$fH1s{G6`!*s$0UpOggxnEcNPk>fCdIr1^};r=g5R0uY)N1An9{z#lBN z<4U~}$8)hdcg){=`!>dl*Wj6>0y&7FmO*UO4WrhpIsEM#v!cOcqgRz&r>{qZE2Z?3 zBlqMiCC?#7WW^!V#TOQv|14xnwYShZA?2@HSHxE9Y|-N;;~#som~GU}QY%Q#+>y&y zgaDA&;sIdnmw<1lNGp=rz!BgVrrjxw7DS(*nL|w}p3Iw|?Ie1=C^%bSiU4$K?ZCBc zWgqMDE6QWpOV_Vlh+!L_QF`S>E8D7#efVWauB2=m>KNb}G1_SL8^ z^lN$Gl3tccqg3HnX$j(6pVE{qqccZ3rQ#KtlhQ0Y+cIz`pCSh$NYEHg?56jjyXesC zW*Kx=p%y!O%~3nZI;cyd4!c$E*c)%LIiPaY@=JKm7iIu!&aCSauW{-Nxs#YZfNl?k8kMNybey&aW@?)|In_hw>SeHx^?jQ zgl_)X$(cIiu5%(NOs%eqvv%J7u3Lz|UWEvydhGZ6W70%Y_2K1`L^4g93PxF0G0#wi z30SxZU)iTeOV2OHgw$N>0GzYW(M?gh@@JnC&KbV;oNS4c|M;?xD|P?0&iMHV71rDE zNKyK#R;juAAP4fbL?i?+hX-nW9DZ`?ne`{GcmK3K+Qa=OxO?|E>+p)nhIY4)Dvr6%-QEbe`p4))AoPbzVtv<0kA zB$njc5=lMo`d5_rh>+W|&}|@Sl*yZjGe-Op%3O(f?fF$`kE-heC!~nI^JzYlo6)Yo z7DX|!s_tr}mBZN$%uvRwS59LtK@ZR0(da1KELXW5|Jcn}xgaO9UhRq3Bdy2Uui}zt zM8z+$o&O7ef6KZuR-1x#mqG--I9457Q8fGYjCIN>ZD))NWe$JR0T_H~NZYEPcW>Vp zHvwuXP!68;%L&Pp;M=hR{V^oDYZyE7v3Gk{m`Jdou6>#s9^^2j++Odl4F+&YGX-2c zD_8!4^1R}AI^1hdfWqSp4vI9j_8x}`Kq$8x%a^`ND8BW4cKx>Ly=NC;XEa+XJA2}i zw|GTDcf)vYbfy*nUPnvyA4;{ITNTS+)9gFnJ-d5{2<9(z<|OCJj2u1Ylm33b?m*CN z{JbXE)a6RrtKfWc6v474v3b5l@7;ZkY4Gy;mn)HU-qdQZ;D}T0pY|RJ3~LsR(Pqe+ zaJ&_MwKbYINMy8B(c+JVS9+Uw9Vvm~DYvuQ+RO-km&Mv$r25iNFj}|KVU!vrx>!Ff zdayjZcs%Icr8{@pddiYpG><5wkyqzD83c{tqwE9NUb)D^J6AV6@hMz4sWb=~+x8Qa zCTwE<#v-L&X=RcK9MLFEiA;M3z~^D$5bX4|QPBZ?W-JPuSgFXQ63hj+iG@1R<#<%7 zd~@awN$rVbRQ#9Sc6)&T`U(~U^uE!Oo~))?uHDzty6?Em^yD4Ymxl2~W`9Rj@zdWw z0rb7O3U6(*^Sy4(dZSPM>;4S>{`&jl|1uCm9S;?y3#%W0O{^1P~~JY2MA(_Fb09RYn`aFoje_ottpw-{WZ&*LxlS! zG%}n`Qa7zx2L9{;d{MS@kr%$$OSH4k?iS>j_R$Yz%e%5YV6=0;PpbL@7uE44{>du- zExkS-O>JhqAIq*^kZ)jRaDU2(2-{7*`@SD7G;sYxVIf~`0)KykAmsX20Q+`)=!YS9 z?vSSAkd@j{psUe&Gb1uEs@5^0et}J&AMBK6O_s|ZRxkp<2&*idEMhz*YUog87%Gv} zCpqByF=In!aLU{8wbI~s#UUQ{sw5U@I-mo_o$=DicoGlF_AZr$?zL7{$Yxfd{{4jG z1G*N**r57F1qO0dayn3n5k#chm}xp`M)M&xzoz(X;5$>s{8Gna)5a37=}ng>eKAd; zs54>2F}<0I2QQJXrp05b~1L;z4$2zmwWOLF*b2IzM466BK>3J4W4tYGqPVSVfHlAZw?L z_kF}l6&lvfbWSc%vN=5s%&Dan{{ejV(OU~LQ?_RSzjsB^N{KeBhEm_ zP!AGlle&wKWS1;MzX@lY1OSP!w6{=gp8m)(gTTyiu$Clbq^q>DMLH%)QO4$B6W2P; zzxqz{vg3s4?YIG5iEBzcK!Qss?o0N2aY&J|6mDatv5?2HJ=((hCl33R3t!{Nf^;7C zxLYUbxyKkv%yQ@8_F4x_A33H~4Kq!+;bA-$BW$P^tiumZAuWc+XA%++k zJdXEFHLoEma{h@DC&qhDLs+a<#S6|$*0#%F8Z|6wJSo-lPpU6Db_v?=ksJVU;1G6D z-fa(4vv*dvk6m$0ZhBIn_oPL@xl4C`Uhm0Hq~jMmowD*d?AI;j=Ot9rWGv;^ZPFMJDl2xASF+R0EOGMbt zGuh8eElgvSc$w%PTsQ{%5(guaTjq|)su~FtG z3?DJ5A&z!v(RA^IwOlT({F%4Pvv?YNkjAs>a~kD^C~xIwL8|P|&6<~5*o&@X5M}HG z0aspB6z5Q|O2$~{8`$&a{ULY)ARjM zPpILth|IE<^@{aKk=T~!rB~^g>ftf-#9y76t1csHSQ2ARhx3x&V;>GhKX-o0K3~B} z-02qL)DLpSH5x2^{Q2_ZUo<*!OOi5Vd=4nz{L=q z?oWh>2OT4VytIvaR%D>`VfRoj%`b|UZ(k0Wn zAmIE)t#{Yqns!VJnu<^g5RdURq^Cczl;F+Jn5UT31|=0#1NPx%Bn8s9Qk-0|von3r zYi`^7S0t7ZO}M5ZuPVndgqc!f zYH#j1nyO@c4jwCpp&)dfZAo_XhB?8J?9izBp9!UYCV^?1LVF&3%F^ zL}QN^1q1?36p0N}T%P9Rj)u~``HsG8uWFC%+#`ee!CS(k9nG|=#iW|1;0?>HrnZkt zLq$v`_H#vY){gTW|C@nlp{OOy<0;3(v!|XGy}RVK$jOxAN-=OpB`K|1c8fyIB7rA& z?Ok4M*BV|Q2#gHf2+{~Q2$a)GBq#%!R$83TO_?c8Yz9md$fqsb#Uv1s^vTWuJ{}cr zLDi1;&bDX!&a=<}$D_ad=RImVuLea1u18lCfh5r5iB@AXA5 zt_38c*TAA!?0V6udV!^dkxt-uq#t&DmGji~l&x-4foneM+hAj@q-!$!g&MQoxfNL( zvx_e^UObKQk6-a{+SG1UZA1DJfh&taJvhmnxCrb$5-Zj8*nOns1>nN1fj2k5XBl|@kvwW{}ix4Wb{2j}qoj7D;t+Tx|mo7e$ zc16KkQqOBE|K751+P@cZYUm)`4l-%wY^L$(!w)pq%;CM`j`JUXvZM@r(!D9a9XAp4 zYWY|>w0{K%XxPu6tq>6Hz#cYD#0k=0LKT;Y5|;oP&S?GS(!b}!u8r&e=o>|z~HHUQpu9m?nFK)b8 z&c2pxpJ{I+ZQ|O(u{P|MRL%6mr2Zb)I@~+kK3Cb)^&!u?aZrwZ%dm0%vwzE-e>XI` z{pHvOoJ4kDHZ*r*6524%$hWgNZr&pxvXPu$;9z5M!c9(WV>lweCgFHi4J1U&g=#6Ck%Wf9WHV;oc3z8M{>nNIC@R;I>Q4(8C zzdF0)Gx;nU@K8ZNk(waY6s7j2cz((8a=*){#N))$*4=Z(RypFaP^Fh~w7bLgHs+k4!!{v&^-Q)14n)N^CM zhgx+`yA_Vln8YWcb6&#&XE^pm;f*4U?#`%PC&K~z9gEop0<^Lv^G^rP5sStmhuZnz z92ewS_l9KQs-m4rm*66g#;(Geg$qOOAp$l{A5D6m^4@c6LijWl6*N7ysB?ewF0i$0 zx94Q$5BJ7*p+aYS@42F15t@Evw5i=6SbW3e$8j&N-B^0`Bm@1a|3%q*xHa{)+oCf) z1PGx>F9}ULp-MLtB~$|f(nLT|KtPHpMg1kAgLqtGS zuwMQ4xA)!q-t*jh&Ofl$Tx-4SopU_n9b>!?in=}JIyw`h<+C1?-Sox2e|qRxKu|>f zojl2zIXAUGP^0{g)8LG=TTtMKzK*+2Q+;!aioqX#K4=l(@2Nc#8x}0qc`xt9)7fU; z)4_(lxATRko-5wXW{uJaDLn4eOJ^+<#!JS z=03Tnj5*!>0%19GL2&?%LBZ)=%uR;1f&fQCPw5sq)p9>ya$ngN<4M2)(ey`$!cgD6 z&Be0^Dz=lXYmO=94OM<(OC3C|Su}j(Q__>Q3kD@mt9CG)m_)O(vFe><8-;x98_#Zj z#-v$RIn+$nd`=z?K;ZZFS6sQznf%zNdA9CLicQUQVC#JSSN62QH|N@)H+)SQUi*5n z^JS&u+;{KaaotOeyQ#K{0;!Kyn)W!-t@h^*zG~h}9SNwSWi5V+=ESC$SB$@F`Icr| zd#rBi{hjZe=|fi68Uw$4PaAoEq2tBJyFaj8?1{b0TWw#(8ve<8^7_-gpV$nms)@DF z?LX6>o{1U!@b&&LF0PcvtJ`}WzcP;0PA6?l^hq^BC{98^%Q2Y+J2CsC3S$nf18Rv| zI6x$45dj}Mc3-&{nPpBJ-p0xI)>9 z`~cF28oSsuF?JmQcepz#PKHye4sfN?Dgb*zK%crO20C?6n~ezEBo!1qW?Sp;hdsYr z|5;MURI2R9`wW`;L=r$|Ge-d=lgL5JFfFlAktCEP>-JNDBH#jG2ZEFAJ&q=6y+RvOt1i2x$WjILSD*wk7r@Go&_@;iTt@`+YW>R#EmH73n;#_qS z6z_((!7@il3oL666v1Iip#Y}VJZydb>U5ys`5(9RU)+80>C(%)-_I|btd#Srj(cWq zMvr7>;nT_zBSQ>umN@WGcaRF^1$}8(F{C)Uy_kG29#9{XpuRA1%xz~N)=T08lBUdj zPt@)TZ)WX1qhtB6qZ(n?7KLni6J&SO<+0e^6=!C-^{0zG0M4BJOv+%O^F>IU0ZkHv z4=#pqLw&erv{O%71K4E}2xALC)Af{Xno|L`f)CrbKYp~vV+&& z%lEWGIsu;xgqpti4|YTY)a#!o?!o^#vh^Dm3H_IE)LF;vzlwaa;>(Mw>9R%_#=rIR zZd^w098THl1kg<-vefA5q!55MAx0;_T%zMh>V>WW^(cCqkV%^x`%?O?eWi#%{A{8U0oS(?Ag?TqF(FI3i00Om2t+uy`~0 z;E*#llU88;M6+m)3JVMxX8mYys(4RheE^USY@84~YU(0^9B)*&dU=pYGp*}4+7Ro9C-$jZD%WJ=W_DXDW%Ec+f!6J;uW7xZ;G@>S+A{X7bT0( z_QqMViT&8Q0IRspDY?4IQIo8}eR`-oiXOBKQ<@(h1*sBBecRJgq z_1^P8vi3m5hMWRG2}j)oTubp4Xl|oyBx5+KW5ph*FztjlmeGxDs>mh8n zF{O(omd-Ab#m(z)0~S1L#tx%;k9sDI^oz+haTC`Ip)Favz%}MsKp>sd;>z=PC~op= zNWn846{w)Is(V4^hM5$9z=Se;X^RnKOi%6}rAqLl-KLV*JKX7X<8=V!5RgCLF75U< zA57yk!GRI}Y>jGMe1^=o#Nebt9vSeU#l)Al?;%}VW&6r6@DqH#-Oc8#{;b?P=KHG* za7tC|G~_?iJ8R3VH&zop&(BT*N6F`!8T7IfqRYo+k)sOb=H>nXTCD0Hn5b)q)92c$ z*3ri`!-KcbA+gsIpZ$!r)TXw~x!IcqUAo=MLO!=EYwmXT$|I7%toTfd6+HxSLq@-n zndY<*%c`z6a}1s&kg)knQYf;>g0|t9PhGOFJ+(kR;r8q(E>N-ae92^%G*=+u`EQmp zc4;9dUvbIi&rf+{y}_-Mdi6;&P@jo$=n{Vj&y;38E_l)kWnok^)3tmhwB9*mp$qP-!^;Qn zeKpbT6N}-{k110yWUBpHGcR^b8}ilUUXI{Zl!d3EpXt)s79j+8OD{k$wOK3@&co!^ z1p^UOXk**Qrgob@HM3pTdE=hVdUC{ATSQWM9fv7U>Aumm9fuZ#66EABzij z|Jm#=R-XK;xIXH-RekOx!V~Q8K7EyyyPfspx7!x`BfpT}s#{?%UIYEt9S)=qqv>j1 z9z7W;3!MKrdMiKgzyXP2!YG{WcZu4q+|PRs*Bc z_bRf04(u(dXAKqGsLNF$*NtB@^+4omBk=(!d?blU1^8q(e8J^n#u9lK;!@2yOftK! z``|?3cTcqzrtYm1!?m842+^fqT}i)>bN*l=o_2LZ2)Y*rm|QR%znG|Ae}R72bC2%G zToy1gp%y_z=RH18F`rj1u5rPuu}_FXtTZmDk6d~rhFqB1)%fc8j!^9I_p2Z76xhAs ztN;G|^DUgBc z>OF1f{vQyNRRGM`Q!l~hjoVmIq-QY7^D^2q72xyOUcA#{ZK^M;5MGw3N%5ph? zY{iK!0sy0T+$22_ibaEci^fhr-rYM6FBgl#@6Q;Rm4%%$Fp0&mer zm5BpHQh6{G=6c`=QtG6%%Zj$f%3;kFCj&T-wulj~Y~K&cWvQ3Xm%AGUk}hRK#5f>} zJ-jx|KYcwrlkE|w`?D()w}HWz#_?2g` zlgHzuUCfCa}f(NkY2E`vL4y{KSMQjP$Hv^|CP`S8`nx{2;|{ zl5!^W*&OEwT}f4A4plQIZx(A$uSFe-E2*l^c++V7rY(zf>Y{tQ%*1Pd>D2v$tD+WS z{buN|uRC_BNvil>eK|A&7`uCunNIOs8M8J=Cje|a{m+g%#3$25`fXR)DR=H#Mbb~X z1o+!bW-`x-Zfjvb0D&!2sklNC(1g~{LJ*q0{5iOUoVVM#)!SG6J@Wj6rm82fnNG=X zUuR@-h^Kh|$QVzH!=}rv<&L9)+^^G)k@}}0iE|27ErjLPLJUJ6gi%*5mLVB!>67w zU~$Fa1X0yTKxgE4AjF%-Tic3)Yh6<>GOZahR8MfJ&H$ZrLx6Ei*M$@_?2}<+Sq5_j*F@8C+w1l*e*$TSepu(Rti^nTt}^`OMi^W>jBW7I+NaPz7(2$A3gYyQh@$-c!K$p zOQxfj1``I{?>*-s031*wYj>O77YU>KYEqL}L!Svo zE;eA7RQT2E=}WmhkDn0H!>K??@N$rJ~?B%)qS!Hq^9k6ub#9^6lJs+ z|JPn`tK6;j_&A)Q;-s!Z^9e^ED(wXoHmWbT&nR|49TJ*k(c)!g&_bGM8FIL@xKnB= zT4t$K?$zRatFirKhuPV|`Mz6l%Lw6f%D*v{fa% z9V@CfB&MG0wrTd11x9T+_=oxSaf*)HC}TqfZ5QsHF)tMz+IThOd6-dS3H$38m;R_@nysb@;hw7 z?|>yIY~%a%u7Z&XN$kSPh}lQ1^J{E?`E91Tm(b7f)=~n3dz71pBF2kT=FQXvyuC`8 z7Np;DS?qEF2@k<-{u-G&!855m{z~O7LY1CG#OPwqC5a`Kiu2qP&+dIj#~Ily5R66h zKqNZJQ?Eza%yg53^cJvrKQe)H734~z+y6nsrMnt&ymhReO#?QZlyOM5s=ooQ-r(($ z;ZyJ2oDT<&{v`SLalM(vWqk2hylZ`?56iPtq&Z6@w~|_XA$IamoIH%%z;cJ8r0JSu ztEPub(tCPEpHgbcE2PdVuK~vy@fvFS#uDLU0^Cu8+(|;*MHfbzM7Zy3Sl$yIn^f4@ zQnY^{-ph`S3mCm>jm^fVlrD^GtgeS|^+yaAKV7|I$8~&}-4#F#d1sBZT1YvYfOn51 z%~*T4D%#JN8Ste98YvtxkKM6~JdhZ9H?{TlP1y3mlLsyh1-4%TfW618of=2qiMPyc z#1?W}^9|U*Il1_j+a@-+if>231IWuJ7A+poX)&)!m#``2@VuKoF8vsnQ8}3(`$#;< zE+WT7CXBSc)13Y+IrFviSX#kSdcjskAtbYSD{1;&GCATOr%9?H+7M##t4sd?geY!0 zHB>hher&>am|G1#H2+XG`4O55#`hPwn6=*3>n*Q7h|odhg2Fz3WBCxURB2 z%wrzO7g{PQ+`3M+U<$LL5_^?xjyjm^-16>dbTK(I&Yi((Z`I+td;cN{;N(Pk*pac_ z1Y)(jx(GJ0S5i%`*j|x8<&l(H^+K4wct*dpy1Zz%m2A$SjCyrsgX`}=Ysua?Cgf4M zAixsr79lRYHtNScq1FDmKq=9}6Vc0&ndS}nUgH-g7jXdP@qSSEN-MCb=fES9eAI#V zQT!_sjC&*l{7cYR^i1*o3)KU)&$quL3Wra9DqQ%2`>Q>CZ!!w8w!SSo)2Ln+%ahMX zz z-X7A;21hakn4o`wODp^hJEU+)IeP_g&z=@HS11CeavYwJNC!TEN<2)0h`h9zc-GDR zU=afATMZlI{~07ZjTkt0{Oamh%^Bg>Vd%huyve)4ZjBbVy=SHjfRBr|!yDh(yiP!N zhR^EQ=Jcn*y`I^RdIRhyr7pmkGxME9r4$2hSo!l(xJ!2vH6-ryMLqY&H$EdUrmddS zYCe^F@XOaW7aoXDLqy{NJd+FuTpGkIzz!&l|kQp^rHLUeflfXPl3EWiz=r zI@0{irtaK1>+UyK2z^i_>eBQ`t@efpAjEw6Ju#}prq$(aK#-bN8hT~xZ5bK~G>3RP zfDTs$$G4ZZJ(1n6wfHo&-mA@Nk}dmKk=P=y+HNRZtUbt>|W&cM%rmp~L@ z%>r*t9D&x7`k(~`^oEzSI8XYW1E*3S)&4K@b6cv57&3i}umxvOmWCZ;qVz^vfK#3+ z9_GEwjb)gX#tVUjMKE+;vf14e3R7AJLiK2XiY~qZj+`N(w3TjJ zPMrkkrifd2rIcs;u;rNX;=<0y{`lvNUUm+?78Zo0LS=$garPi8g!kIVri~+< ziy%_>7N-WqOp64APqRXyqlj&FE>*&J%!;&$ht7($7}T#!xya zQoW3XAOIM8ayE|t`xL9!OrCOTEB-Ifsx&%gBq&K8x@uI4D}3b2K>~u8rT^3vlyJJM zR0bxAhHzxOq5`{g$TzOw`8Ow7>T$P3MA)u=VF9!fk{$xk@~<-f5(OObxV~>x%>;pE z%}8N*8^AF%-Dg}eEQqyI&G36{V)6M)<^H8{8hGN0twF*q_TJLVfJgE6j}sB~Bd~2svPnU3UBu=gk!?H^lr<@((l7?NH}cx4cbAd9pBN zXXe$t%O?v^6f!(7H^= zi~{h)y7c%7w`nRc=RGTZn2nH&;f{z&`D?E||vwV*5zoGiKdbIJNI#mbw_ zJkJ9%fmrwAINuE<#&`yxJjvr6&Y|4P4kU&h_vfCri#$9}Oo?NHjfWzeRU{V-QZ0+G zz!{AI#o?LUl>Wbt_U1KdW@kUS`adXEdzHiF+5b+l;#anxWN!!CTFe^me+4hiwNL*a z_H{G*vOe&JJo^z>E0-YUSH1W0?KeEEW-qC}hIbWMK619!O;dYqHt_$*)g%k0AiPcV z5vMo;lDjnoFgvptY8|rE*hTPE-8*M$g$||>sKxG@(JC@W8I0@d5DQzbC1)&vIN;6V z&Nyf^UpT_HN<7V^lnmC;ZTD6Th7p*OPc_MQuF8kr_6e0c1gBf?H5@wuoxNx#eOZ;@ zO)v$31Fbv>5FD2h8M&J1)}-tfZ`C-`kx0$VcS(S05yx?aW7$8SL9Ka(w$j??_22>0 z>yVDzdPRlmX8gEQkfpq%lCw%fJ{q5Jv}a4e(~*2Ig$a~lRAsxHtZrj<77shE73m2y zX~J*ZQheQow4xiG6gI1CCoc+KiH}kI!gH>NEG=&xD$Ccn>F|hnfnoKNF#QEdJ3Lzq z0Ht2TE>fD~{kxa}9UTlL06?l|cszkJBgNd|zuDJKR!S(Qx~l?6nD{=BB%HvZ!!W7X zXY9FPL2?W?T&$K6jyxtlt@66eyCj1Icm(Lu0LrYfF&iB=GIoH^g-Bv zQ@-E*1Y)f&iKs z!NmeUYzFr>c>&v^2hmMKR!Nj)#buFZrdYttUVeG1M-_%^03U_G9fn~HM@&-q2M$$_d3s}*~ z3FB`mUu}zo&=M%?BdCyu$hBy~CF&XHSogb^v-&pK7dCN9@FpKi*yS(6LTvy|i*ZfUvMai?Z>Fa4oq&9pJgeB*w zaKTRPC%!fSn2-*mVb6V>B%sAH<_dswE%xX{k5Hb6GTXqRE=aF8AE?31n+EXJg>u*f zpd`=_5G#i_pu+p!`Iz5yGrBdE_VL8-gZ!2+1MCa;>Kfv$xz3$@ErS*8&pqAOV6+rX z#=CPsH;+qE^p|`9aF3GYLlE)uga%1pj{lIol9c0mR2^<_3SLs$;D@wIEe6ZM@#dzx z+TB<_+fh$4T#EHq?Wz^)ZcfhTZ-l}cQIJdyfcsN|`yiR3;S|81i2#`~sLfbN)r157 zJQwB(e;i$osV=|*{KM;~dsT?_mL~DdLR~8Rl`8`O3PaV|7R}=8ull z7QfZW>zQoJYQ{1FlBR9M;^PaP@~0nzN*;&OrlF&1FcZO_ruSg1<8ZJAr&z#815Rh+ zW$ZAOV_eWpb&Bt09Z4#R)+R?)LX!+ptZtnyDDO&4FSC_hIMwXCdwz3qD)}IrX)VQ&!oIL?}W|hYm{li`xLH<$ZRn@>ll($zjDlPk2fZh1Z?qW4Zb5UJW7>oyoVxH&v zSi%{1M$EM6@?yuet|{(vBqv^BIrI6xgbElwIH2^A=&}ks>M+~M3INirR;#07yA+;} z-1a*r*}FrhqKLc*V#bdHtG_53EypU_kxS8B-Z#*jN^E#(cgSm@tT28cCyP%PZv3oQ zj@8a|fOOgK*Vt9Ot*ER%t$f>DBkYw5{V6vUEsj_XG7o@K@sE}kg>NqWbusMD9`51e zkX*N@BdXF;*;o)6nYDgzeyfTKYYu(VZBt`j3yoYM1L_UKbN`-&&TUTQL`^SHfMWb=S4H>ax<%$Qg!^oh68<>{*179U_5~@nGT(6LjkfQxQFO zM9A(C8Nj9ecjT&px9->?vMHhD)R=KoSfT4(BcL75f<3sJ=5<%+rB-i>WpM}auX9{P z!Pb!9zUYgl5us_gLg3?hU#w*M?7ioA>%Y^NS~+w4<_~Z_i+rhrAVb(Cr^6B>NM#89q8;vzinzL^LWn;9t9ivPvI3aIwPjJuK_lk zC&fIuAkv#1fZ&LXwcU;RoUTzxARz<2AvMr^v1~x+$qazznkud7KIsqt3_I9p4MCCu z?Z;gWZde%P6rfz;F~yGrfpxB3_NfoK0n+JHLy9JpJC!NXUJlG~Di9Ys=XX}Mj4x*o zesI$ralrY@p&VbA^S)P4yL^c+_jf&CS$oFyOW*AvxAU*=pLP3+=m~YdATt#1E)Sft zq#1#&?^2t0Dir=2jM=0w1K`-d2+P(1FlQe(haNhnu38_HlDfIyA79^QgR|Gj1^Er$6SGNL1_y=wS?$t|p@=?B&#Q`1)MAl+Fo?yBu$~UX@gzwpnwdq9^ zuNvRQ6UlLB-yDP~cD`zDIH4CWw-l)=oMk4L#s{TjRGOxI=7Gj@yCGl4#kcSGct?VT zp0}Bt)2j+LFT&qoOQ5-Rg>n?cmmU);gO?y6c=zJA;Zt3r=gUUbxwDc`=E-r2Tmn#( ziP|Xw#cN!9SNq-Kr#lhBOQmMJrF`DGN0YOh6c0r<@q16WrDUB~{da`QamBho9(&sZ zeN1lvNO2id(9_$~g{j#6VRo#{k_0fygKyh1DVY*|v`<*@lOq$4hM+vbNoH<=>`8u| z6<0Bd)ZS_W9b<%y^?}KCeSM^BEa%jf^4GEl$5;|AuQ-1U`ZkCPdO1m@2+@ljyQ@UH-nhd13a3NMaV?}X6EeN6HTyl;)CQ?&yeY{skp*z3YG3f#zdWDlrWoC@ z9xA+T*&q!* zV)dyXOU0+u!$!h9m$3^U@{e{c59`)y^@}-W-|-Hfyw}Gz6?X5KzwQaUJ0W{#Y9ctV z9Bzqa%FA*t3)LE*Z?O0#MZ6)y2l!M{M(4E9Ne0<6-hF!m+k$_szR%MF%Wz(ce?_!p zW2*JEG)tUQt^&KR9moY??oS8C6)pUpc8UTf)prC-CztKqzSBa2_w}^p^RKwaWQ7Gg z4&BSwexu?%NM6x5Mo5pU!YE1rxz3h&!RX`h&m$P)Sxqge_}i(@8>X}UWHy0ZcVWfx zHkaWQEvfde*TbZuKl%aD121+n?|+WDMSsPaa@sf35`?t!O*E}GL+;w2d zXL0^Jb<^Yjj!@y3>Mh9U^}a|kR!Ls()A?6~N@{4H#-oC1k&_og(?h599~XR;IQfHm zclTQlsHBMdZ z%F{S}X1MU~fxj<5JTH8ta9aQL#jT`IM@g(w%D(Ka8b!`azn|&}nEG98-pH@*MCTqa ze6qzIAT}h8>&h;32!k8>&)nzp*>(4`ng})Bb%IfWBbxW0YR$v7lSOxr1^o1?3&+L~ zjPa%}y$)|g6mD5LS-bLgIXZK)X`WeK6dtByjga-t6>x-TdXaC>ITrV*wk|#P3ylY{(3$9drm#tV)+oXL|dCAbxVSl zdf6h<{orG$j+tc|&$KnNbR2FlXvB7qjdGz4C#?#%IEkqXv>_l{pvM=v5ysTGcw>1A zwBuf2a}3k_7b7`Z$K{>!b&s7#DZX2Q@A*7mZ6Lq`Kss}-Eh(unjyiB-oRiF~=N&JE zbFyqG#Ow5#2VKp-fIeOBF93ZkF3hFNVSkLk7tD6lL2h+M2*L=V5rSX|c`N<`E5#04 z(ou)wVAm8``^m;LXKPY@^rb_8*d~=P&!-?y_VNz+r@{Qr)W4>xl&X zOU4PwYvJ*R6IAV!#Yf}t0I%#9+B^|;@{~5)q@T`Au^dF;G&O5iuI-3Nz zX>K&D4+$C@#YAmX5ns6-4?;&)I_w|=*OxG3{|9}-`f*v*X!#HTmy=44Xb;;3JU;)| z4m;*FyTVIdnqyVyZ3(;Tgxw1_<&NJAUxJc!L|GQGv#*rUv_#g;xJ~^Ms%|{b4&AsC z-lp3Ua6q~_IBrw3ihYtbJ_&$>@|il^6D{^l?Vb=P4u%-3z?D?TUYk<+H@5}q(d+yQ zL9L|@oe>y4%9SY{%boDx_5|OVNzO>ISp7l-FyoeV=^=;bkCHgnXg#TFRJeMNUYD7Y zw&^(?X}E4rjdq8e6)!HGgaRfzWi6!UZnZZU=En9y>Jj_0Ua@$JJOBW<2B z>(1((aqN8y%zjW9qJeE8(>+S9tRp6mX0)C zhgvA*SQzA5SYJ_Jd51QDag#NvvoGS8aw_|2RC{kIUQDImz7}W$@F96!PS&JW+EPb( zxxd$S1W|f8i+vr&@D>tOpt%O(T1t|mPTcR`=JpbRQ2>l`D&Fr8v~`TlA)B{cY2eF` zHz*h=E@DU*1Nb$I)$6Fj-OjC^)T}<4(M|b1K6*$nx1T{`H9$~p=<+epemyD>hR?F7 z6gw8$5LMir&}c6;gIwufonb9ckEQIQ^;y8=?xe-*JZk@~cIS)~eM z+KWjYgdbIz?E;OOG`2#6+Fv4jW+^-Ng5ORQ`W>X>!U(;y>HRg**=30LTeJ`&`!{0( zb0j`<0ZLt>SyU&?#{&=s|Fl)l^rb@cZCRSMmQ|L8V6kG?euoF0`o(D6b^<;$Gv`@f zq;uR-T0E&d^KE#_t`kz;78S(?@Xq%Ig<>IT72H{|RIx%7n4;!O=(3{QMGm)~Wrz zPh9V36|5X-14jnOj;xZ7>>?@XX{0jFZXb_r?wTD5*mkVvveM%MzXPxz)#yeAwh8i0 z)DT#WP8165CDdqrJ(BNPZR-`s9F>M_D2|+Vj$-zXiZ~0u*aKz- zf`S1F)Ix4g8dcGrM%~xmQJdZvRmAXyx5*VX9@Y=hKD0K>O(N50N5pZRS@UJFe1#~% zNU0EP;yoO+U%fKYCcb>5?sgSh`HRsuYvF!;y5NZvs9{`N38aH#QhjOCq1Dm%7(h6q z_qhOst7A+1PzM^@Ma&WHbh6kOn=7UEi`3|ZChBz3yKh5XwsVDc_|zkg{Fjc_K9{=A z1rdyiSI=VBaay(W5Qt;Ntnj#d#j*bCjFo5^^`IMrrU_^=rsD%o?l@-GHvtWh{V|SI zD9zv=WHhD(jqW7T-~kyjR6!wzACf}=spEE|(eP-H!$bccoXpLA)RqL|etj5qPz9%Ona+TzQ9ucJa{R8F zvDy6b)|rs_1;Ywg$4BmAq3+aft@}w35)GwuVGa$Y%E7513VHJh){9r6;4cMVACP{oUwW(OHf8S;IZ9hP}@tZp>Yp89Eek z;`o;nL0?Z?+U5W3APrmNc4#o_MX&-<*9$_Dm`6|5uDV zvwnSko^@=1=q5eSSeHv@cWv<*vqJ8=Nf?K;eO-n zK&JnYit&k$!H|N&dR1oKk(>t{UE1qntfbfs^EoD~3Ka^TWDOt`|r7 zZhEhbvV2|4ZI}t!rJC1&n)-}rW@y`<3_d~yyS`XmE#yhEqXFBsZ%Z~9?n2?LPSO5% z@+%DB zb!V;?$&^B-u!DRR+5CjC(@P3Mr8OcG=zIPyHAVO8ie?*%eie#{7fD6 zrp`mW-G={$EAw(6{)QRaL@LMxd*=LPnO|2>l*y~n1ikn*^x?;6kWYgkPlEVcg5-a` zP+3i<**NS8b*sPC6J7;Y_pLKilCUQXQ{@PuS=p*4( zXr5?!dd$rNdS;^=oJ~)>h9u2nBCY8qZF#67Fp?3~5x( zhJ{T!f4jwYGBqIi{Qj`p!9>P>*XI3~L(u$coJ5-yxno7TRomXthni!O>6d_1!2WHj z91k5W+*@7rT+TbSI+Ct5KH{YCl%X(MFFanaL*E>CmdSRNX?h^jT_W=VQ zch~94Z`Z^~tNThfLS>!FM(ZCWqNA#ADOL^Eh0Xm_jiFW3=j-g_s&A<)e-Ka{uX;|2 zRji`aZr}X0ZFLTM)_l=W$=v#rfUVL$>f6NR2+8{q+z-vWZ`RaF+?cDou^nO-J9chA zdHbnl*hj0Ge~c8$?tEUmt1#`!8q7c2*DhanRlfUL_)u{;X5n*cMfd@>3tXWWB*HEz zYJUvrRjD0=xL`HejTwm%D(&kHGY?ZSIjQ;`~Rc<8~OIwoGoyzsCn>ekh$hsA2Y&qX~giTZdw>Nhi*t2A1oOzrWtZ>km1M=GOF z+=xC~75z^&|Aq2z88y+jYNH?4ML(^Nei8BQdPDT@#u%=q7>VW>)!P~(O0cJQ007?u zKf%@c^8V~Nv6d}uw3bnzxpE}(>LIbW2V49+TO#F56y?8PZ>PSu=KXHd^6vKTRe30B zJC-Ffya-F|KL>!v$$YvB(LjhhAJQ1XKDud$X0b63#u3YqWJAH{pJNVAU;1a}QpW71 zA|-W};iZRnzb6Ihieyt^Irprt=yDY`~b0tTY z1ayz)T^0)c)8ilsSGa9;k>*g*E(eP+B}di|mM%6WPej zkZ8P`{3(wC%)lvkfd4=BT7TrLQDk%KSyb=q2>p^Hr=NX8AmdHT?EEI856NmP-Z(hV zw+UIR0H%)qB*+Zp@*4*ratgPOWmi7j?7j$vDRl#(t4d+nB#0bSlFFX|D}cT{mNRuG zV(w=Gn`QIt2krYo8}9lCse+6pPYC*e!i&l`pP!|IKvXpgVs~$CuRJ^b-(ws{v9WmA zRSz9`z{3Vn9A8SQcyac^{4W$LzGpc!a^bT1{{Q9zw-#|ax9hlGsr{HEWpvzl$q85$ z_f!9RjG-c^ypOV+x?C^@a)MW(k#zw68HgNKD*=#Fbq-y4nTApVCN*@#oQiB_H4##h z0)lRLJsbaG*!_N4w~0(V|FNi#I{1{DvH0(Zg@aVci|45XN-4axoJRV0#6s3Z=V9KS zwuTu#n_Lp$zp>{BOi@(e#sjMc%9*M~&YK-)6-Ra+_-V|2?P>1DNt<&|L`jfQz44Od zaT5_lL1v%?y74Uhso3MDZ(Q1j&qCfvl@ew~Yybj+8>BOgH*a6@0XJwl>Sm^>-YiYK zeTTBbI0dQP#b>z63FK-W0M!9xN7-82@B-sDpa3mhh3jwuVC0(xAnMP{C+f_3V%7Ap zpRaTK0XRsk(B^4H6`MJ8;(_{QjYBTh{!}QrR|WuYY(UPKT%>NN*UY9p6+!xV)*Y?s zFwAEfm=dmSV$9)6h0CQk#&+>^M--mYm=H`PLA%caIQpW{qy}9dV={hD{qw`br6oEC zK`vi}AaH2%{P8KJpHVL=edV4N`!XL0ii}hBxb6J33OsmV44^Rh*6+6r6&6SQgDu*c z0a|L(?7jd0%WJ)3RgSgYh@aa#R-&00s#&L4jjxw`a#HfZhlNs z?>>J&HGm9NZDl(-HfdTYy$klo9exXxrXsg_b!{_a5f#j?BY*Dpx-9?*?RUWdVabmQ z3EIUyAv(FqZ%_GWQbC(p5fwqd=?p+RC zK^iYqNXP#i`2h@Y;NFRx9j=drR|bzmfRNvS*s|Hr6mA|j81#Oy>80zjO{{HdwJ|NY zn6EwG$xST0@x1NWynf<2vdLzyz#<^W-|j@zWepgB^T zw25Sh=LiXZD~dFX0;A`HQSA4^&1CXYjUU6g#!mA~h8|C*)fiJf-vmP&FDQn#s>QYe zQF>G>9QXQ*z|aLw{Oot*3AhUhRI&AhzCvZK{Xv3PRmuXDDoK8_y)yt}l2#V`D3k2o z<$`~-E}YPm!vS3|V8qa9TD7O3RC zy-y~dg(~T`;i_IghwWOzSimz09`M2=+@tWBk)MrFrRM93$)aZ-fi{JAv|q12zuG(5 z$oHl90;bf7K-WA`$n53davl{_!ktVBHxQ2-NLI`2a7D7%QTr-}Io_mRV3>LcxkvjD zY%P9PomTpt>67+P(gK73sHUq+R}iyT!Ffp2Q~ePdh)B(e1At*;0W*~80zgtE>*U&b zEle-HETy%q_`79FJu8c_eH5?Hf^U_CPo=8g_a3eaDTmhBqz;yMxupqb}`kR6J}E3!$c?Fu3a{&EgIDk z-NrLRgK(wur?Nviir6K;Oh!+U%dG~E3hHHyX)~}m5mI>w+>b^B>!DQuI^Py z3%d@9Cc7KZr!l0>rNeh^YeX$eu0HfpaQyK1JLflEJ-E_rsQb$)|5UjY4=dcEaa8h?gG<;>FF{GpoJ;5PS${4;%PyX0h7wng~vT5j~@ zs{iMr=jR`K&4#r*K+A+YfklzICn_dt3UDxJc;vHaVOcIi7UpQ7H3+l|i@u~8gaaPX zo76vB)zcf&a;IHv0jT6H(XCp$PX(gBf}Vim=CXHUyrSC3$-jeXvhs&!Dty}LPzpy1 z!~c=j{zgVHK-Y}^r&VaC)f95mdK2T%O$&H=zR#jyCxzTaca< zJSLP{aNI5!+;h!0+(@nYkkVCG5u9uBh8 z68%c2{*plf1}GL_S>LKqJ9oCqIB77i+kRUN$i>Zj)XY)r6T;^P%e~(zs_fQ9&avL6 z*)^?k7hRZp?2lKXvI+a}rM?1y!p@Wfx+wY#c&zX1Qs?^T`s&dD$!1^zpw!n7o<(3(x5?xCL@d`bEN1_?@P|iJZvgS9gEZU z*M9QiTk*&H+dm)P+65HS}Py=7Qb?YlO9 z&oILbH4HEy&CuN~HFS4}NQZQTAPn7|_JC4~NQ;U{m!zZt4xof6(xIsT=lSiu-~X}S z5AWCYX{~!5SDg2CUgv2C_)}!&Px>ZGtsnib^ZXO& zduoAyD#<@JFw;gcPoxfSoZNeTUK1eHlg{bW?5}O2u1Sg@=T%6W{usas!B^EwkX4)>c~>}yYIJ|Ys7dBo1<_1m!R zWb(ZO(>Ne4sG}k$=Dprukq6*0O`)9%Pi_EE$smK<{MT{=(Me>lMc*5xax$ zUfKrkUit7U>IY=3U3_wH#c?9$hxYa>+r|^;56iJXQun)UCx2dbG>!hze*W5a_s`W2 zzZ3RI|D&Da;zX6Wr*8Y2k^g`D(u$_;4KcMrO#={(Q=>!*F6N^Wr$K+;(> z=NgNwhkt63FIEr*Z2*)me`px>GD9FZEfpn|`=Kbk2~4cIk156^dagH0ihf%Y^0?!NtADy5ld!b}SnI$3w)4(7`4BzG#to$Jy^YzN!y* zi?8qQ=d|(y)8e82#p_4F?|1T(dqbn|V&%O*@Emp&Fno+rijn^=n%y3$y40HPZ$@!! zMS-*U3B%nK^ur22k+(Vjr1vQ@kO=9LFFWcK41R3>s<)MFVcC+o*z#Jg^2(` z`#ne7mS@ytAA|0P1sFHvp&Fyn>Xen~pKX#vIS?Nm)%Ew6bK7U1axy9B7aiOf34LzM z{G~k1TrlQD@$GeHgub5Qw#sSt*qaa?T36;UILBM_=r`M`nc9`Mk`_W1(O=m_nT}2J zPG7X^0(!nE>z_FrvHVIVuY&3$R_-otbAI@D@&zCr{tC~6e_Z)i8zr{A{Bk%bZaKXz z;+FcG?{&|&`O_2$l?;96YB=@?}T8#c`h}1kv zY+2?LK?P%NEj0in(y4p*YzEN*b^_S>sb{1PdEdrK2pQz)4YW8cNs7D*al0n-L^c&F z%(Ncg0ed*0S%)6VO%#I{f&z{sY%x_L=+mP%a~<$;;(rlblo1flsiF8!f0|K^YA$zA zCrToWtpK|#6fs=n)@QIt(nRf^Rvy$O?5d3V5veM6W`ZlArb5yZH)fDpj02} z4<028$TY^Tcy%pEf2rKvw+uP%6s)x@|gYD>qJ$jm& zOmqSJWixJQun@uTI_HDeBxVYC_kAwR{V!(1E(HflaXSbFL63rGS*ATNp_f^MRZwP8 zh{wrD0705%a8Bn56USIRlP>j~{FCR=2)TR>1Fpm&3^4^j6cBn2Xvs=uUVa2;2LpHk zAfH(cU@+5+5-d0eU!VV|_%%~Zy-&~7j9^=JWtX_YUij@KWS@*QExCY4lIAgVjg3V@ zPCs+ymDu% zE}`RsN5N!D{BN%aP=|<5McZcOFy!M|rcy^V`3+N0K`p4qKXZeZyO-T80V$C#i-mAVx$!j5Qib%gJzWY$ucLys86_$i zlb=)b@Jo;UW}$&r@KgjH#K_W~oXpw^gk}jG)>Sf+ReDua!A8GYCd zbvk*>PScSl7A_Re+0RN!SkNNd;7y6s>tluU$FaEPNV<;r2sENx%MvR+_;LQM>Fm5; z{+y0pDCHM$ioJ(HdUtola0e&G{8TT zb**v5chX4o{p$h!2CXQwY=Ze>Qu5stKuoR9%KGkzs{e=oitY^Lbfe30peI3{xK8?1 z+A%%~&?ybDg?Zb$Ky2F+>}1nSg3wXwcWBqTf2FNqAVvJddobM%-aZ#T>ueJ&y@}_# zz09Gh`>FlFW1G@pTiJ;#0AfdMav2(;%K>y>a4B?<&E=tbR89w}zRuYHRcwY841U0}Il!|A3);(j7j)|cRRtmu&*V8t`1erePPoS>)59%-QkUQcl}H(zz;$&EXQ0!!r&?dEU^{*8vRk0j1{FHmiZwE-h{N z-MKV?$@0<5*B4*bcbV01yT^wJl0E7-3V&mCG;16w4`p~6Wi9D1AL}l&6zYM)9798n z03$%$zsbzz(SV-byp%P_noBtGTJ~h3k-Qyw)D`bb?vYV`hE-3+s$YqHeyk_|`1(

&5xZKSpcaOTpd8dONKn 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 U=2b8N<@JJpmF{8&_4@6904OD_W&i*H literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson07/personjob_modified/personjob.db b/Student/rdrovdahl/lesson07/personjob_modified/personjob.db new file mode 100644 index 0000000000000000000000000000000000000000..f0466e4647335e4ba67e3c89356901409f5fa668 GIT binary patch literal 40960 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 f`AZ9ojZXxJxCMp$M=x~MwKM=H Date: Sat, 23 Jun 2018 13:36:42 -0700 Subject: [PATCH 13/19] added lesson07 mailroom assignment for sqlite and peewee --- .../mailroom_RDB/QuickDBD-mailroom RDB.png | Bin 0 -> 33234 bytes .../mailroom_db_model.cpython-36.pyc | Bin 0 -> 1701 bytes .../letters/Black_Panther.06-23-2018.txt | 12 + .../letters/Captain_America.06-23-2018.txt | 12 + .../letters/Hawkeye.06-23-2018.txt | 12 + .../letters/Iron_Man.06-23-2018.txt | 12 + .../mailroom_RDB/letters/Mr_X.06-23-2018.txt | 12 + .../letters/New_Guy.06-23-2018.txt | 12 + .../letters/Nick_Fury.06-23-2018.txt | 12 + .../letters/Red_Skull.06-23-2018.txt | 12 + .../mailroom_RDB/letters/Thor.06-23-2018.txt | 12 + .../letters/Ultron.06-23-2018.txt | 12 + .../letters/War_Machine.06-23-2018.txt | 12 + .../letters/Winter_Soldier.06-23-2018.txt | 12 + .../mailroom_RDB/mailroom class details.rtf | 349 +++++++++++ .../lesson07/mailroom_RDB/mailroom.db | Bin 0 -> 16384 bytes .../lesson07/mailroom_RDB/mailroom.py | 558 ++++++++++++++++++ .../mailroom_RDB/mailroom_db_model.py | 41 ++ 18 files changed, 1092 insertions(+) create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/QuickDBD-mailroom RDB.png create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/__pycache__/mailroom_db_model.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/Black_Panther.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/Captain_America.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/Hawkeye.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/Iron_Man.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/Mr_X.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/New_Guy.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/Nick_Fury.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/Red_Skull.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/Thor.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/Ultron.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/War_Machine.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/letters/Winter_Soldier.06-23-2018.txt create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/mailroom class details.rtf create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/mailroom.db create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/mailroom.py create mode 100644 Student/rdrovdahl/lesson07/mailroom_RDB/mailroom_db_model.py diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/QuickDBD-mailroom RDB.png b/Student/rdrovdahl/lesson07/mailroom_RDB/QuickDBD-mailroom RDB.png new file mode 100644 index 0000000000000000000000000000000000000000..093784f30c76eaccc6dd55dad9391167c2811c5c GIT binary patch literal 33234 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�!N=TAIOy74xA zp0$<*1uKs9=1cm#^cD4!RAmznq4~|?k?8d2foQY(goJlyW@dZji+{6JJgHACrKHR? zomi5K4C#w@!&br;Wd4PyFXe+y%N4VX*o2A#7YWtFZ8NxK`LN<;Vw#$t0~#!p;Wm*z zhrtt`=JmWQTPi1zo80(yv$Af?6O{U1!h^v>T2hLQ*>_Qgl0V^()_lg+0Lz~^xlL!5 z`GliVtyYT?m$8Voyg#J`ty6iq>F}iVkkfN>p6;lFv)qQbSvDXJm%vj4ezo#yzbWdwd#ujIyxgmP8q1NWxqKSbczO5(X$}MRtirl_je_eE00jsA6e9>tY?+ z@oZVSBA@by7ry_+4@Xizt7QC9C5d@#jqY9!vb% zuK2TSK@vB#ZINXTVt5DK=M_q?&D$H2*qF{MYF25PEtbbR~}K%G&-WTt!hqqCD*t~Z_A zkQ?MF6jwid#vG7v3!wftF2Lo%oCJEgKoAv3HBKF@*yHI?qD8>J1O$7=6C`uOd4AT} zUfDPNhzm`QKYq5=LDk&Vn>t6sS)Co7(gj*oxL^^jv!1~j#BE5#uiRUWziMdrCa?|yYMrT zh;^O0}w|o|1H}OYQJCZ#rt%J~697A27Vn3xv>vwXmpYIOh&aSX( zCiU_a+a^5 zA43QZ(;u$l0DYoV9Ezs4M3!_#4$K|iis$qtZgB`Z=zQ4tE8ZypjXfP9ri@= zr)ux0Vi=JK|4XisR&EhDYm-4$_rSnFeMKi@>6i_QbZwlvuWkabLJNt3g%Dd_0|$A! z!p(^j(f)O4{HH0BDo?+Xg@X&-z6Hq&B(-lbxb-Fs8n>IV^dirrW;N2IbQ7s8)Yetl z*CzWiMcLD98(%@PeYWH!bUb_9GjhIP0`NlFHNx+5!z*{tjsC_NJw{hu|L{9`^91{2xdR%Oxo83L;WIY(eMLeSlf$$NlZU+0qW+E37&Ri+oxCf3MUq>ee3 zec?QyGpX$gbV(N zdb++qiJ`7Ugxm*)4nYpgn|p`b=>m+-u|uP=pO7w*+306D6fm$zx>>?w`t(yYV|J3{ zXoOKrOk%wdZSNU!x8ty

jZgP2su8lF1YUpGB8iabhuvZn*M!43n?DG7z`YG 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:>*u?1A%mmfuffTf}~qU|nrmNgKTt{`jLrj7u8Z~U~ok|HOC zqJ0yjG31U|$cg9z^r-3V$yzEs|I2a967!@eHOnim^&Q1Db7!8ii=xa61{`XGVYl&L zX(lI3%PGm4R!+br9G9%%I3{b0Ei=;5a_5}tGn9ty&p_-Q_M$X~YF5^zDY+@n7fxkTv9oHH6Pr|85XC!D(57c9-mCg%0?yYCaPraq(@8FLp1MUXj{K14E>Iu z;Mez+-Fdu-Ut{O7B2w3tF-XxpP}YQcwrHY*687)P7NaCC7(L%#f&QR!xxA~9Z3I=R zjV+QZ1X9uVsWajzCfrEn95nH2dk6xZ^8A&e$vhd4H}>{6e!~a+n=UM;+-S9i*bjz- zchFb%X)B9^dLL8zWPj09mNjr-G;Q1@RoefhHUuUt$`LKEPvbq%#Vw|TJnR}ZqeCIhGEE;XL=&g@M)?dV9UU9*2J5 GhyMT9#;;}o literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Black_Panther.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Black_Panther.06-23-2018.txt new file mode 100644 index 0000000..dc1f0fe --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Black_Panther.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear Black Panther, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $50.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 20.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Captain_America.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Captain_America.06-23-2018.txt new file mode 100644 index 0000000..70b30cc --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Captain_America.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear Captain America, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $40.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 16.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Hawkeye.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Hawkeye.06-23-2018.txt new file mode 100644 index 0000000..56dee39 --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Hawkeye.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear Hawkeye, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $20.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 8.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Iron_Man.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Iron_Man.06-23-2018.txt new file mode 100644 index 0000000..3e778a9 --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Iron_Man.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear Iron Man, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $1,000.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 400.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Mr_X.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Mr_X.06-23-2018.txt new file mode 100644 index 0000000..a9b375a --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Mr_X.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear Mr X, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $400.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 160.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/New_Guy.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/New_Guy.06-23-2018.txt new file mode 100644 index 0000000..1640517 --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/New_Guy.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear New Guy, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $0.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 0.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Nick_Fury.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Nick_Fury.06-23-2018.txt new file mode 100644 index 0000000..a62eb00 --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Nick_Fury.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear Nick Fury, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $1,000.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 400.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Red_Skull.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Red_Skull.06-23-2018.txt new file mode 100644 index 0000000..cdb994e --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Red_Skull.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear Red Skull, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $3,000.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 1,200.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Thor.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Thor.06-23-2018.txt new file mode 100644 index 0000000..610bebe --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Thor.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear Thor, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $100.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 40.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Ultron.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Ultron.06-23-2018.txt new file mode 100644 index 0000000..fa77c1c --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Ultron.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear Ultron, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $50,000.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 20,000.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/War_Machine.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/War_Machine.06-23-2018.txt new file mode 100644 index 0000000..9bb94dc --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/War_Machine.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear War Machine, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $10.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 4.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Winter_Soldier.06-23-2018.txt b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Winter_Soldier.06-23-2018.txt new file mode 100644 index 0000000..77a7416 --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/letters/Winter_Soldier.06-23-2018.txt @@ -0,0 +1,12 @@ +Dear Winter Soldier, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of $480.00. + + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide 192.00 kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA! + + + Sincerely, + Your Friends at AFAK diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/mailroom class details.rtf b/Student/rdrovdahl/lesson07/mailroom_RDB/mailroom class details.rtf new file mode 100644 index 0000000..8412f3a --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/mailroom class details.rtf @@ -0,0 +1,349 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf400 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Menlo-Regular;\f2\fnil\fcharset0 Menlo-Bold; +} +{\colortbl;\red255\green255\blue255;\red46\green151\blue31;\red4\green4\blue4;\red48\green232\blue26; +\red239\green239\blue239;\red163\green37\blue27;\red252\green35\blue25;\red196\green6\blue255;\red194\green102\blue28; +} +{\*\expandedcolortbl;;\cssrgb\c20961\c64158\c15777;\cssrgb\c1294\c1294\c1294;\cssrgb\c18251\c90714\c13124; +\cssrgb\c94962\c94962\c94962;\cssrgb\c70575\c21649\c13659;\cssrgb\c100000\c23715\c11979;\cssrgb\c81919\c23714\c100000;\cssrgb\c80989\c47739\c14240; +} +\margl1440\margr1440\vieww17620\viewh23080\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 \ul \ulc0 This guide is for the original class based mailroom solution. It will be modified as mailroom is refactored to use databases\ulnone \ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\b \cf0 def get_sample_data():\ + +\b0 return [Donor('Iron Man', [10, 20, 30], 'Hero', 'USA),\ + Donor('Thor', .....\ +\ + +\b db = DonorDB(get_sample_data())\ + +\b0 This command accomplishes two things:\ + 1 - A complete set of Donor() class objects is created for each item in the persistent donor list\ + 2 - A dictionary object is created in the DonorDB() class which has a key/value pair for each Donor() object. The keys are the normalized names and the values are the associated Donor() class objects.\ + +\b \ +\ + Donor() attributes:\ + name\ + donations\ + affiliation\ + location\ + Donor() properties\ + total_donations\ + average_donations\ + Donor() methods:\ + normalize_name\ + add_donation\ +\ + DonorDB() attributes:\ + donor_data\ + DonorDB() properties:\ + donors\ + DonorDB() methods:\ + list_donors\ + find_donor\ + add_donor\ + gen_letter\ + save_letters_to_disk\ + sort_key\ + generate_donor_report\ +\ +class Donor()\ + __init__(self, name, donations, affiliation, location):\ + +\b0 self.norm_name = self.normalize_name(name)\ + self.name = name.strip()\ + self.donations = [] or list(donations)\ + self.affiliation = affiliation\ + self.location = location\ +\ + @staticmethod\ + +\b normalize_name(name):\ + +\b0 return...\ +\ + @property\ + +\b total_donations(self):\ + +\b0 return...\ +\ + @property\ + +\b average_donations(self):\ + +\b0 return...\ + \ + +\b add_donation(self, amount):\ + +\b0 self.donations.append(amount)\ +\ +\ + +\b class DonorDB():\ + __init__(self, donors):\ + +\b0 self.donor_data = \{\} or \{d.norm_name: d for d in donors\}\ + \ + @property\ + +\b donors(self):\ + +\b0 return self.donor_data.values()\ +\ + +\b list_donors(self):\ + +\b0 listing = ["Donor list:"]\ + for donor in self.donors:\ + listing.append(donor.name)\ + return "\\n".join(listing)\ +\ + +\b find_donor(self, name)\ + +\b0 return self.donor_data.get(Donor.normalize_name(name))\ +\ + +\b add_donor(self, name):\ + +\b0 donor = Donor(name) # creates the new object in the Donor() class\ + self.donor_data[donor.norm_name] = donor # adds the new object to the donor_data dictionary\ + return donor # return Donor() object for new name\ +\ + +\b gen_letter(self, donor):\ + +\b0 return letter\ + \ + +\b save_letters_to_disk(self):\ + +\b0 creates \'91./letters\'92 directory\ + iterates through self.donor_data.values() and creates letters for each donor using donor.name calling on self.gen_letter(donor) for the content\ + no return\ +\ + @staticmethod\ + +\b sort_key(item):\ + +\b0 sort key used in the generate_donor_report() method\ +\ + +\b generate_donor_report(self):\ + +\b0 returns a donors report sorted by total donations\ +\ + \ +\ + +\b DonorDB() Class Examples:\ + +\b0 In the __init__ method, self.donor_data is defined as a dictionary of objects where:\ + the key is the object.norm_name\ + the value is the object +\b \ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\b0\fs22 \cf2 \cb3 \CocoaLigature0 In [ +\f2\b \cf4 47 +\f1\b0 \cf2 ]: \cf5 db.donor_data\ +\cf6 Out[ +\f2\b \cf7 47 +\f1\b0 \cf6 ]: \cf5 \ +\{'blackpanther': <__main__.Donor at 0x1032ed048>,\ + 'captainamerica': <__main__.Donor at 0x1033b99b0>,\ + 'hawkeye': <__main__.Donor at 0x1033b9d68>,\ + 'ironman': <__main__.Donor at 0x1033b9b00>,\ + 'nickfury': <__main__.Donor at 0x1033b9748>,\ + 'redskull': <__main__.Donor at 0x1032ed0f0>,\ + 'thor': <__main__.Donor at 0x1033b9f28>,\ + 'ultron': <__main__.Donor at 0x1033b9898>,\ + 'warmachine': <__main__.Donor at 0x1032ed128>,\ + 'wintersoldier': <__main__.Donor at 0x1033b9e80>\} +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\ +The donors property method returns a list of the db.donor_data values. Essentially, this is just a list of Donor class objects\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 In [ +\f2\b \cf4 49 +\f1\b0 \cf2 ]: +\f2\b for +\f1\b0 \cf5 d +\f2\b \cf8 in +\f1\b0 \cf5 db.donors:\ +\cf2 ...: \cf5 \cf2 print\cf5 (d)\ +\cf2 ...: \cf5 \ +<__main__.Donor object at 0x1033b9b00>\ +<__main__.Donor object at 0x1033b9f28>\ +<__main__.Donor object at 0x1033b9e80>\ +<__main__.Donor object at 0x1033b99b0>\ +<__main__.Donor object at 0x1033b9748>\ +<__main__.Donor object at 0x1033b9d68>\ +<__main__.Donor object at 0x1033b9898>\ +<__main__.Donor object at 0x1032ed048>\ +<__main__.Donor object at 0x1032ed128>\ +<__main__.Donor object at 0x1032ed0f0>\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 The list_donors method iterates through the db.donors property and returns a list of name attributes from the Donor class objects\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 In [ +\f2\b \cf4 50 +\f1\b0 \cf2 ]: \cf5 db.list_donors()\ +\cf6 Out[ +\f2\b \cf7 50 +\f1\b0 \cf6 ]: \cf5 'Donor list:\\nIron Man\\nThor\\nWinter Soldier\\nCaptain America\\nNick Fury\\nHawkeye\\nUltron\\nBlack Panther\\nWar Machine\\nRed Skull'\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +The find_donor method returns the original Donors object for the name given as the argument.\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 In [ +\f2\b \cf4 69 +\f1\b0 \cf2 ]: \cf5 db.find_donor(\cf9 'Thor'\cf5 )\ +\cf6 Out[ +\f2\b \cf7 69 +\f1\b0 \cf6 ]: \cf5 <__main__.Donor at 0x1032cdf28>\ +\ +\cf2 In [ +\f2\b \cf4 70 +\f1\b0 \cf2 ]: \cf5 db.find_donor(\cf9 'Thor'\cf5 ).name\ +\cf6 Out[ +\f2\b \cf7 70 +\f1\b0 \cf6 ]: \cf5 'Thor'\ +\ +\cf2 In [ +\f2\b \cf4 71 +\f1\b0 \cf2 ]: \cf5 db.find_donor(\cf9 'Thor'\cf5 ).donations\ +\cf6 Out[ +\f2\b \cf7 71 +\f1\b0 \cf6 ]: \cf5 [50, 25, 100]\ +\ +\cf2 In [ +\f2\b \cf4 72 +\f1\b0 \cf2 ]: \cf5 db.find_donor(\cf9 'Thor'\cf5 ).affiliation\ +\cf6 Out[ +\f2\b \cf7 72 +\f1\b0 \cf6 ]: \cf5 'Hero'\ +\ +\cf2 In [ +\f2\b \cf4 73 +\f1\b0 \cf2 ]: \cf5 db.find_donor(\cf9 'Thor'\cf5 ).location\ +\cf6 Out[ +\f2\b \cf7 73 +\f1\b0 \cf6 ]: \cf5 'Earth'\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\ +Add a donor object using the add_donor() method\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 In [ +\f2\b \cf4 85 +\f1\b0 \cf2 ]: \cf5 db.add_donor(\cf9 'Mr X'\cf5 )\ +\cf6 Out[ +\f2\b \cf7 85 +\f1\b0 \cf6 ]: \cf5 <__main__.Donor at 0x103366898>\ +\ +\cf2 In [ +\f2\b \cf4 86 +\f1\b0 \cf2 ]: print\cf5 (db.list_donors())\ +Donor list:\ +Iron Man\ +Thor\ +Winter Soldier\ +Captain America\ +Nick Fury\ +Hawkeye\ +Ultron\ +Black Panther\ +War Machine\ +Red Skull\ +Mr X\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 In [ +\f2\b \cf4 87 +\f1\b0 \cf2 ]: \cf5 db.find_donor(\cf9 'Mr X'\cf5 ).donations\ +\cf6 Out[ +\f2\b \cf7 87 +\f1\b0 \cf6 ]: \cf5 []\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +How to use db.gen_letter\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 In [ +\f2\b \cf4 119 +\f1\b0 \cf2 ]: \cf5 letter = db.gen_letter(db.find_donor(\cf9 'Thor'\cf5 ))\ +\ +\cf2 In [ +\f2\b \cf4 120 +\f1\b0 \cf2 ]: print\cf5 (letter)\ +Dear Thor,\ + Thank you for your very kind donation of $100.00.\ + It will be put to very good use.\ + Sincerely,\ + -The Team\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\ +How to use generate_donor_reoprt\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f1\fs22 \cf2 \cb3 \CocoaLigature0 In [ +\f2\b \cf4 5 +\f1\b0 \cf2 ]: print\cf5 (db.generate_donor_report())\ +Donor Name | Total Given | Num Gifts | Average Gift\ +------------------------------------------------------------------\ +Mr X $ 0.00 0 $ 0.00\ +War Machine $ 20.00 2 $ 10.00\ +Captain America $ 70.00 2 $ 35.00\ +Hawkeye $ 145.00 3 $ 48.33\ +Thor $ 175.00 3 $ 58.33\ +Winter Soldier $ 840.00 2 $ 420.00\ +Black Panther $ 1050.00 3 $ 350.00\ +Red Skull $ 6000.00 3 $ 2000.00\ +Nick Fury $ 101545.00 3 $ 33848.33\ +Ultron $ 140000.00 3 $ 46666.67\ +Iron Man $ 151000.00 3 $ 50333.33\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 \cb1 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\ +\ +\ +\ +\ +\ +\ +\ +\ +} \ No newline at end of file diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/mailroom.db b/Student/rdrovdahl/lesson07/mailroom_RDB/mailroom.db new file mode 100644 index 0000000000000000000000000000000000000000..d7fe13c52723671b885aa27e0bc2e760d30bef55 GIT binary patch literal 16384 zcmeI2O>7%Q6vt=1_Rg;3_@#AR*L6Y$S0S-dP)U16b(779nmAz{C#?hun|M>NV(*6a zT4^dF5e4-G65;|#2qDxHTzWvL2gHG1I3X%=LP9D+LOpPS103MM%&cRDhH~P7#2ab< z^PibFAMfYWj9h(w!3`a@S8Mj{K+pd_iro}2tE38smSYXT6{9@U<#;%yx&dK;_r(=Q9pv>y{ zDn|y_>vrfA*)-4b9Gh9P%=y`hSo|+(Fw2}VEweIZR=az)MV|bCrPBVYLUZ}NazGDL z^ngX6D%~ez?`LH8oeZ#xI;N^+5EJ7a{AMcgt?NHyw`bG12zc zmfLi@K#s)lg_{26BmEc8mrCMpo=UF~_#VE5ccBT>Fb0YA{q*hhE9vWe01Fa80!RP} zAOR$R1dsp{Kmter2_S*T6G*2tlFbsb7_h6YfZZ7E(@3E}NX6M@vzj}( zIU5B{oIjhHvv;?hJ*N>>b57v%EuTurGzt}$?>N&5_B>&>xUrnj7ZO`BJCgK{I zn8;?P?48hdJyvcxV)xB%lV9;gv%BciszyqsLUzsdLMLEVzgc&kU^i;DqgMBfwQAMM z#RTwdZl&P|A^*fGrp@iJqLJa@Y-XNk#_4&ks9Uzz-A3I1htfY2_!WMFAK+WK&))$) zhfm;R_z>QPH{bwn!pqQr7r}yAcn&VY1Qa0;z+VY|=M%9Y0VIF~kN^@u0!RP}AOR$R z1dsp{_%9OBhZ01Ik(BbLUXU)?cUM0XIr_DpkDU6Dp5{&=Mv~?Z%_(X0Nj)orboDhl z7r(g7K%4N{2ABuz)=ir&vnj3m^DdMa|UCyhStRFY6` zeL#~kE') + if response.lower() == 'n': + return + donor_list = [('Iron Man', [100000, 50000, 1000], 'Hero', 'USA'), + ('Thor', [50, 25, 100], 'Hero', 'Earth'), + ('Winter Soldier', [360, 480], 'Villian', 'USSR'), + ('Captain America', [30, 40], 'Hero', 'USA'), + ('Nick Fury', [100000, 545, 1000], 'Retired', 'Unknown'), + ('Hawkeye', [75, 50, 20], 'Hero', 'USA'), + ('Ultron', [50000, 40000, 50000], 'Villian', 'DarkWeb'), + ('Black Panther', [100, 900, 50], 'Unaffiliated', 'Africa'), + ('War Machine', [10, 10], 'Unaffiliated', 'USA'), + ('Red Skull', [1000, 2000, 3000], 'Villian', 'Europe'), + ] + database = SqliteDatabase('mailroom.db') + # populate Donor table + try: + database.connect() + database.execute_sql('PRAGMA foreign_keys = ON;') + for donor in donor_list: + with database.transaction(): + new_donor = Donors.create( + donor_name=donor[0], + donor_name_normalized=donor[0].lower(), + affiliation=donor[2], + location=donor[3]) + new_donor.save() + except Exception as e: + print(e) + # populate Donations table + try: + for donor in donor_list: + id = Donors.select().where(Donors.donor_name == donor[0]).get() + for i in range(len(donor[1])): + with database.transaction(): + new_donation = Donations.create( + donor=id, + donation=donor[1][i]) + new_donation.save() + except Exception as e: + print(e) + finally: + database.close() + + + +# Utility so we have data to test with, etc. +# def get_sample_data(): +# """ +# returns a list of donor objects to use as sample data +# """ +# return [Donor('Iron Man', [100000, 50000, 1000], 'Hero', 'USA'), +# Donor('Thor', [50, 25, 100], 'Hero', 'Earth'), +# Donor('Winter Soldier', [360, 480], 'Villian', 'USSR'), +# Donor('Captain America', [30, 40], 'Hero', 'USA'), +# Donor('Nick Fury', [100000, 545, 1000], 'Retired', 'Unknown'), +# Donor('Hawkeye', [75, 50, 20], 'Hero', 'USA'), +# Donor('Ultron', [50000, 40000, 50000], 'Villian', 'DarkWeb'), +# Donor('Black Panther', [100, 900, 50], 'Unaffiliated', 'Africa'), +# Donor('War Machine', [10, 10], 'Unaffiliated', 'USA'), +# Donor('Red Skull', [1000, 2000, 3000], 'Villian', 'Europe'), +# ] + + +class Donor(): + """ + class to hold the information about a single donor + """ + + def __init__(self, name, donations=None, affiliation='unknown', location='unknown'): + """ + create a new Donor object + :param name: the full name of the donor + :param donations=None: iterable of past donations + """ + + self.norm_name = self.normalize_name(name) + self.name = name.strip() + if donations is None: + self.donations = [] + else: + self.donations = list(donations) + self.affiliation = affiliation + self.location = location + + @staticmethod + def donations_rdb(name): + query = (Donors.select(Donors, Donations).join(Donations) + .where(Donors.donor_name_normalized == name.lower())) + donations = list(d.donations.donation for d in query) + return donations + + + @staticmethod + def normalize_name(name): + """ + return a normalized version of a name to use as a comparison key + simple enough to not be in a method now, but maybe you'd want to make it fancier later. + """ + return name.lower().strip().replace(" ", "") + + # @property + # def last_donation(self): + # """ + # The most recent donation made + # """ + # try: + # return self.donations[-1] + # except IndexError: + # return None + + @staticmethod + def last_donation_rdb(name): + """ + The most recent donation made + """ + query = (Donors.select(Donors, Donations).join(Donations) + .where(Donors.donor_name_normalized == name.lower())) + donations = list(d.donations.donation for d in query) + try: + return donations[-1] + except IndexError: + return 0 + + # @property + # def total_donations(self): + # return sum(self.donations) + + @staticmethod + def total_donations_rdb(name): + query = (Donors.select(Donors, Donations).join(Donations) + .where(Donors.donor_name_normalized == name.lower())) + donations = list(d.donations.donation for d in query) + return sum(donations) + + # @property + # def average_donation(self): + # try: + # return self.total_donations / len(self.donations) + # except ZeroDivisionError: + # return 0 + + @staticmethod + def average_donation_rdb(name): + query = (Donors.select(Donors, Donations).join(Donations) + .where(Donors.donor_name_normalized == name.lower())) + donations = list(d.donations.donation for d in query) + try: + return sum(donations) / len(query) + except ZeroDivisionError: + return 0 + + # def add_donation(self, amount): + # """ + # add a new donation + # """ + # amount = float(amount) + # if amount <= 0.0: + # raise ValueError("Donation must be greater than zero") + # self.donations.append(amount) + + @staticmethod + def add_donation_rdb(name, amount): + """ + add a new donation + """ + amount = float(amount) + if amount <= 0.0: + raise ValueError("Donation must be greater than zero") + id = Donors.select().where(Donors.donor_name_normalized == name.lower()).get() + new_donation = Donations.create( + donor=id, + donation=amount) + new_donation.save() + + +class DonorDB(): + """ + encapsulation of the entire database of donors and associated data + """ + + def __init__(self, donors=None): + """ + Initialize a new donor database + :param donors=None: iterable of Donor objects + """ + if donors is None: + self.donor_data = {} + else: + self.donor_data = {d.norm_name: d for d in donors} + + # def save_to_file(self, filename): + # with open(filename, 'w') as outfile: + # self.to_json(outfile) + + # @classmethod + # def load_from_file(cls, filename): + # with open(filename, 'r') as infile: + # obj = js.from_json(infile) + # return obj + + # @property + # def donors(self): + # """ + # an iterable of all the donors + # """ + # return self.donor_data.values() + + # def list_donors(self): + # """ + # creates a list of the donors as a string, so they can be printed + # Not calling print from here makes it more flexible and easier to + # test + # """ + # listing = ["Donor list:"] + # for donor in self.donors: + # listing.append(donor.name) + # return "\n".join(listing) + + @staticmethod + def list_donors_rdb(): + """ + creates a list of the donors as a string, so they can be printed + Not calling print from here makes it more flexible and easier to + test + """ + listing = ["Donor list:"] + for donor in Donors: + listing.append(donor.donor_name) + return "\n".join(listing) + + # def find_donor(self, name): + # """ + # find a donor in the donor db + # :param: the name of the donor + # :returns: The donor data structure -- None if not in the self.donor_data + # """ + # return self.donor_data.get(Donor.normalize_name(name)) + + # def add_donor(self, name): + # """ + # Add a new donor to the donor db + # :param: the name of the donor + # :returns: the new Donor data structure + # """ + # donor = Donor(name) + # self.donor_data[donor.norm_name] = donor + # return donor + + @staticmethod + def add_donor_rdb(name, affiliation=None, location=None): + """ + Add a new donor to the donor db + :param: the name of the donor + :returns: the new donor id + """ + # check to see if donor already exists + query = Donors.select().where(Donors.donor_name_normalized==name.lower()) + if query.exists(): + return None + # add new donor if doesn't already exist + else: + try: + new_donor = Donors.create( + donor_name=name, + donor_name_normalized=name.lower(), + affiliation=affiliation, + location=location) + new_donor.save() + except Exception as e: + print(e) + id = Donors.select().where(Donors.donor_name_normalized == name.lower()).get() + return id + + + # def gen_letter(self, donor): + # """ + # Generate a thank you letter for the donor + # :param: donor tuple + # :returns: string with letter + # note: This doesn't actually write to a file -- that's a separate + # function. This makes it more flexible and easier to test. + # """ + # k = (donor.last_donation/5 * 2) + # letter = (f'''Dear {donor.name}, + # We at the Avengers Fund-a-Kitten Initiative would like to thank you for + # your generous donation of ${donor.last_donation:,.2f}.\n + # Taking advantage of our kitten matching partner, with these added funds we + # will be able to provide {k:,.2f} kitten(s) to well deserving little girls + # all over the world including hard to reach places like Antarctica and + # Tacoma, WA!\n\n + # Sincerely, + # Your Friends at AFAK\n''') + # return letter + + @staticmethod + def gen_letter_rdb(name): + """ + Generate a thank you letter for the donor + :param: donor tuple + :returns: string with letter + note: This doesn't actually write to a file -- that's a separate + function. This makes it more flexible and easier to test. + """ + k = (Donor.last_donation_rdb(name)/5 * 2) + letter = (f'''Dear {name}, + We at the Avengers Fund-a-Kitten Initiative would like to thank you for + your generous donation of ${Donor.last_donation_rdb(name):,.2f}.\n + Taking advantage of our kitten matching partner, with these added funds we + will be able to provide {k:,.2f} kitten(s) to well deserving little girls + all over the world including hard to reach places like Antarctica and + Tacoma, WA!\n\n + Sincerely, + Your Friends at AFAK\n''') + return letter + + # def save_letters_to_disk(self): + # """ + # make a letter for each donor, and save it to disk. + # """ + # # create 'letters' directory if one does not exist + # pathlib.Path('letters').mkdir(exist_ok=True) + # # set the datetime format variable + # dt_format = '.%m-%d-%Y' + # for donor in self.donor_data.values(): + # print("Writing a letter to:", donor.name) + # letter = self.gen_letter(donor) + # # I don't like spaces in filenames... + # filename = donor.name.replace(" ", "_") + # # set the file path using pathlib + # p = pathlib.Path('letters/' + filename + + # datetime.datetime.now().strftime(dt_format) + '.txt') + # open(p, 'w').write(letter) + + def save_letters_to_disk_rdb(): + """ + make a letter for each donor, and save it to disk. + """ + # create 'letters' directory if one does not exist + pathlib.Path('letters').mkdir(exist_ok=True) + # set the datetime format variable + dt_format = '.%m-%d-%Y' + for donor in Donors: + print("Writing a letter to:", donor.donor_name) + letter = DonorDB.gen_letter_rdb(donor.donor_name) + # I don't like spaces in filenames... + filename = donor.donor_name.replace(" ", "_") + # set the file path using pathlib + p = pathlib.Path('letters/' + filename + + datetime.datetime.now().strftime(dt_format) + '.txt') + open(p, 'w').write(letter) + + # @staticmethod + # def sort_key(item): + # # used to sort on name in self.donor_data + # return item[1] + + # def generate_donor_report(self): + # """ + # Generate the report of the donors and amounts donated. + # :returns: the donor report as a string. + # """ + # # First, reduce the raw data into a summary list view + # report_rows = [] + # for donor in self.donor_data.values(): + # name = donor.name + # gifts = donor.donations + # total_gifts = donor.total_donations + # num_gifts = len(gifts) + # avg_gift = donor.average_donation + # report_rows.append((name, total_gifts, num_gifts, avg_gift)) + # + # # sort the report data + # report_rows.sort(key=self.sort_key, reverse=True) + # report = [] + # report.append("{:25s} | {:11s} | {:9s} | {:12s}".format("Donor Name", + # "Total Given", + # "Num Gifts", + # "Average Gift")) + # report.append("-" * 66) + # for row in report_rows: + # report.append("{:25s} ${:10.2f} {:9d} ${:11.2f}".format(*row)) + # return "\n".join(report) + + @staticmethod + def sort_key_rdb(item): + return item[1] + + @staticmethod + def generate_donor_report_rdb(): + """ + Generate the report of the donors and amounts donated. + :returns: the donor report as a string. + """ + # First, reduce the raw data into a summary list view + report_rows = [] + for donor in Donors: + name = donor.donor_name + gifts = Donor.donations_rdb(donor.donor_name) + total_gifts = Donor.total_donations_rdb(donor.donor_name) + num_gifts = len(gifts) + avg_gift = Donor.average_donation_rdb(donor.donor_name) + report_rows.append((name, total_gifts, num_gifts, avg_gift)) + + # sort the report data + report_rows.sort(key=DonorDB.sort_key_rdb, reverse=True) + report = [] + report.append("{:25s} | {:11s} | {:9s} | {:12s}".format("Donor Name", + "Total Given", + "Num Gifts", + "Average Gift")) + report.append("-" * 66) + for row in report_rows: + report.append("{:25s} ${:10.2f} {:9d} ${:11.2f}".format(*row)) + return "\n".join(report) + +# User-interaction code +# Above this is all the logic code +# The stuff you'd need if you had a totally different UI.different +# below is code only for the command line interface. + + +# db = DonorDB(get_sample_data()) + + +def main_menu_selection(): + """ + Print out the main application menu and then read the user input. + """ + action = input(dedent(''' + Choose an action: + 1 - Send a Thank You + 2 - Create a Report + 3 - Send letters to everyone + 4 - Quit + > ''')) + return action.strip() + + +def send_thank_you(): + """ + Record a donation and generate a thank you message. + """ + # Read a valid donor to send a thank you from, handling special commands to + # let the user navigate as defined. + os.system('clear') + print('''THANK YOU Menu + +Let's record that new donation and draft a THANK YOU message.\n\n''') + while True: + print('\nChoose an action:\n') + print('1 - Start working on a donor entry\n' + '2 - Enter "list" to see a list of existing donors\n' + '3 - Enter "quit" to return to the main menu\n') + response = input(' >> ') + if response == '1': + print('\nType the name of an existing or new donor.\n' + '(type "quit" at any time to return to the main menu)') + name = input(' >> ') + if name.lower() == 'quit': + return + amount = input('What is the donation amount? \n >> ') + # normallize the donation amount + amount = amount.replace('$', '').replace(',', '') + try: + amount = float(amount) + except ValueError: + print('\nNot a valid entry. Need to enter a numerical value for the ' + 'donation amount\n') + input(' press "Enter" to return to the THANK YOU Menu ') + return + + # If this is a new user, ensure that the database has the necessary + # data structure. + # donor = db.find_donor(name) + # if donor is None: + # donor = db.add_donor(name) + DonorDB.add_donor_rdb(name) + + # Record the donation + # donor.add_donation(amount) + Donor.add_donation_rdb(name, amount) + + # Print thank you letter to screen + # print(db.gen_letter(donor)) + print(DonorDB.gen_letter_rdb(name)) + input('\n press "Enter" to return to the THANK YOU Menu ') + os.system('clear') + return + + elif response == 'list' or response == '2': + os.system('clear') + print(db.list_donors()) + elif response == 'quit' or response == '3': + os.system('clear') + return + else: + os.system('clear') + print('not a valid response, try again\n') + + +def print_donor_report(): + os.system('clear') + # print(db.generate_donor_report()) + print(DonorDB.generate_donor_report_rdb()) + +def quit(): + sys.exit(0) + + +def main(): + '''main menu function''' + os.system('clear') + print('''Avengers: Fund-a-Kitten Initiative + + Because every little girl + Everywhere in the world + ...deserves a kitten + + +Welcome to Mailroom\n\n''') + + selection_dict = {"1": send_thank_you, + "2": print_donor_report, + "3": DonorDB.save_letters_to_disk_rdb, + "4": quit} + + while True: + selection = main_menu_selection() + try: + selection_dict[selection]() + except KeyError: + print("error: menu selection is invalid!") + +if __name__ == "__main__": + populate_sql_db() + main() diff --git a/Student/rdrovdahl/lesson07/mailroom_RDB/mailroom_db_model.py b/Student/rdrovdahl/lesson07/mailroom_RDB/mailroom_db_model.py new file mode 100644 index 0000000..b6fcabb --- /dev/null +++ b/Student/rdrovdahl/lesson07/mailroom_RDB/mailroom_db_model.py @@ -0,0 +1,41 @@ +""" + Mailroom database with Peewee ORM, sqlite and Python + Here we define the schema and create the database tables +""" + +from peewee import * + +database = SqliteDatabase('mailroom.db') +database.connect() +database.execute_sql('PRAGMA foreign_keys = ON;') + +class BaseModel(Model): + class Meta: + database = database + + +class Donors(BaseModel): + """ + This class defines Donor, which maintains details of someone + for who has donated to the Avengers Fund A Kitten initiative + """ + id = PrimaryKeyField() + donor_name = CharField(max_length=30) + donor_name_normalized = CharField(max_length=30) + affiliation = CharField(max_length=30, null=True) + location = CharField(max_length=40, null=True) + + +class Donations(BaseModel): + """ + This class contains the list of donations for each Donor + """ + id = PrimaryKeyField() + donor = ForeignKeyField(Donors, backref='donations') + donation = IntegerField() + donation_date = DateField(formats='MM-DD-YYYY', null=True) + +database.create_tables([ + Donors, + Donations, + ], safe=True) From 91ff94ee569e0b57046b2f282867d1b55f2046cf Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Thu, 28 Jun 2018 18:54:15 -0700 Subject: [PATCH 14/19] added lesson09 activity --- .../__pycache__/integrate.cpython-36.pyc | Bin 0 -> 1166 bytes .../lesson09/async/get_news_async.py | 93 + .../rdrovdahl/lesson09/async/get_news_sync.py | 86 + .../lesson09/async/just_coroutines.py | 121 + .../jupyter notebook activity/Archive.zip | Bin 0 -> 112006 bytes .../Concurrency and Async Programming.ipynb | 407 +++ .../async coroutines.ipynb | 444 +++ .../async task loop using class pt 2.ipynb | 2558 +++++++++++++++++ .../async task loop using class.ipynb | 326 +++ .../lesson09/lock_exercise/simple_locks.py | 14 + .../lesson09/lock_exercise/stdout_writer.py | 16 + .../lock_exercise/stdout_writer_semaphore.py | 19 + .../lock_exercise/stdout_writer_solution.py | 27 + .../lesson09/multi_thread&proc/integrate.py | 32 + .../multi_thread&proc/integrate_multiproc.py | 58 + .../integrate_multithreads.py | 55 + 16 files changed, 4256 insertions(+) create mode 100644 Student/rdrovdahl/lesson09/__pycache__/integrate.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson09/async/get_news_async.py create mode 100644 Student/rdrovdahl/lesson09/async/get_news_sync.py create mode 100644 Student/rdrovdahl/lesson09/async/just_coroutines.py create mode 100644 Student/rdrovdahl/lesson09/jupyter notebook activity/Archive.zip create mode 100644 Student/rdrovdahl/lesson09/jupyter notebook activity/Concurrency and Async Programming.ipynb create mode 100644 Student/rdrovdahl/lesson09/jupyter notebook activity/async coroutines.ipynb create mode 100644 Student/rdrovdahl/lesson09/jupyter notebook activity/async task loop using class pt 2.ipynb create mode 100644 Student/rdrovdahl/lesson09/jupyter notebook activity/async task loop using class.ipynb create mode 100644 Student/rdrovdahl/lesson09/lock_exercise/simple_locks.py create mode 100644 Student/rdrovdahl/lesson09/lock_exercise/stdout_writer.py create mode 100644 Student/rdrovdahl/lesson09/lock_exercise/stdout_writer_semaphore.py create mode 100644 Student/rdrovdahl/lesson09/lock_exercise/stdout_writer_solution.py create mode 100644 Student/rdrovdahl/lesson09/multi_thread&proc/integrate.py create mode 100644 Student/rdrovdahl/lesson09/multi_thread&proc/integrate_multiproc.py create mode 100644 Student/rdrovdahl/lesson09/multi_thread&proc/integrate_multithreads.py diff --git a/Student/rdrovdahl/lesson09/__pycache__/integrate.cpython-36.pyc b/Student/rdrovdahl/lesson09/__pycache__/integrate.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf6a7ffee2ce13f540bac509e4eda414200d7794 GIT binary patch literal 1166 zcmah|&1%~~5Z+lyw(RBy(liO_MK!q?8ryXOZ6TPJ_G|(nEp-V&@veW0EIF%nVh8!; zK+;F)E9u%(Um>T?tb$^C>B7v;u4ZSx`DS#mx>~;8tA9V`jQwUy3(xEWO8gp?U;=Jg zhY2n$+(FpF!JUhOCxBt+GU#to# zOcmKiJ)G4~W2xf05-Pe9{vfFLhgwCEuAdw?8*kq2AJ6n43Y*Qw{>N@t22%N2iu#G3 z2pQ_7XMv34C~Um14?`{c{2mRK*@ z+?noav=;E0o$bsEiJhk2hI~7=#LRlppqGwP^CC;HPkr zLOX>xdOX2Crt6a&hj@0l*Ry;kB-dIH!fgF|1i=H={#G2eIkB=jyLJ!fSl6fFSJREll zz8N{Sffyg>?q8Bjo2X*-j8y&yW+S-%M3%|4g+AsFX2lgK!xkvIsTMN+X(SC_9mja9 f7j!`$OL6m&NZq4RBqo7unSYUn#JA literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson09/async/get_news_async.py b/Student/rdrovdahl/lesson09/async/get_news_async.py new file mode 100644 index 0000000..8641e0a --- /dev/null +++ b/Student/rdrovdahl/lesson09/async/get_news_async.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python + +""" +An Asynchronous version of the script to see how much a given word is +mentioned in the news today + +Uses data from the NewsAPI: + +https://newsapi.org +""" + +import time +import asyncio +import aiohttp + +NEWS_API_KEY = "84d0483394c44f288965d7b366e54a74" + +WORD = "war" +base_url = 'https://newsapi.org/v1/' + + +# This has to run first, so doesn't really need async +# but why use two requests libraries ? +async def get_sources(sources): + """ + Get all the english language sources of news + + 'https://newsapi.org/v1/sources?language=en' + """ + url = base_url + "sources" + params = {"language": "en", "apiKey": NEWS_API_KEY} + async with aiohttp.ClientSession() as session: + async with session.get(url, ssl=False, params=params) as resp: + data = await resp.json() + print("Got the sources") + sources.extend([src['id'].strip() for src in data['sources']]) + + +async def get_articles(source): + """ + download the info for all the articles + """ + url = base_url + "articles" + params = {"source": source, + "apiKey": NEWS_API_KEY, + "sortBy": "top" + } + print("requesting:", source) + async with aiohttp.ClientSession() as session: + async with session.get(url, ssl=False, params=params) as resp: + if resp.status != 200: # aiohttpp has "status" + print(f'something went wrong with: {source}') + await asyncio.sleep(0) # releases control the the mainloop + return + # awaits response rather than waiting on response in the requests version of this + print("got the articles from {}".format(source)) + data = await resp.json() + # the url to the article itself is in data['articles'][i]['url'] + titles.extend([(str(art['title']) + str(art['description'])) + for art in data['articles']]) + + +def count_word(word, titles): + word = word.lower() + count = 0 + for title in titles: + if word in title.lower(): + count += 1 + return count + + +start = time.time() + +# start up a loop: +loop = asyncio.get_event_loop() + +# create the objects to hold the data +sources = [] +titles = [] + +# get the sources -- this is essentially synchronous +loop.run_until_complete(get_sources(sources)) + +# run the loop for the articles +jobs = asyncio.gather(*(get_articles(source) for source in sources)) +loop.run_until_complete(jobs) +loop.close() + +art_count = len(titles) +word_count = count_word(WORD, titles) + +print(f'found {WORD}, {word_count} times in {art_count} articles') +print(f'Process took {(time.time() - start):.0f} sec.') diff --git a/Student/rdrovdahl/lesson09/async/get_news_sync.py b/Student/rdrovdahl/lesson09/async/get_news_sync.py new file mode 100644 index 0000000..82a7b13 --- /dev/null +++ b/Student/rdrovdahl/lesson09/async/get_news_sync.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python + +""" +Regular synchronous script to see how much a given word is mentioned in the +news today + +Took about 21 seconds for me. + +Uses data from the NewsAPI: + +https://newsapi.org + +NOTE: you need to register with the web site to get a KEY. +""" +import time +import requests + +WORD = "trump" + +NEWS_API_KEY = "84d0483394c44f288965d7b366e54a74" + +base_url = 'https://newsapi.org/v1/' + + +def get_sources(): + """ + Get all the english language sources of news + + 'https://newsapi.org/v1/sources?language=en' + """ + url = base_url + "sources" + params = {"language": "en"} + resp = requests.get(url, params=params) + data = resp.json() + sources = [src['id'].strip() for src in data['sources']] + print("all the sources") + print(sources) + return sources + + +def get_articles(source): + """ + https://newsapi.org/v1/articles?source=associated-press&sortBy=top&apiKey=1fabc23bb9bc485ca59b3966cbd6ea26 + """ + url = base_url + "articles" + params = {"source": source, + "apiKey": NEWS_API_KEY, + # "sortBy": "latest", # some sources don't support latest + "sortBy": "top", + # "sortBy": "popular", + } + print("requesting:", source) + resp = requests.get(url, params=params) + if resp.status_code != 200: # aiohttpp has "status" + print("something went wrong with {}".format(source)) + print(resp) + print(resp.text) + return [] + data = resp.json() + # the url to the article itself is in data['articles'][i]['url'] + titles = [str(art['title']) + str(art['description']) + for art in data['articles']] + return titles + + +def count_word(word, titles): + word = word.lower() + count = 0 + for title in titles: + if word in title.lower(): + count += 1 + return count + + +start = time.time() +sources = get_sources() + +art_count = 0 +word_count = 0 +for source in sources: + titles = get_articles(source) + art_count += len(titles) + word_count += count_word('trump', titles) + +print(WORD, "found {} times in {} articles".format(word_count, art_count)) +print("Process took {:.0f} seconds".format(time.time() - start)) diff --git a/Student/rdrovdahl/lesson09/async/just_coroutines.py b/Student/rdrovdahl/lesson09/async/just_coroutines.py new file mode 100644 index 0000000..68d4723 --- /dev/null +++ b/Student/rdrovdahl/lesson09/async/just_coroutines.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 + +''' +Some experimental code working with coroutines by themselves, outside of an +async framework or event loop. +''' + + +# note - using the async keyword makes this function a coroutine +async def corout(): + print('running corout') + return 'something returned' + +# Note that the returned value gets tacked on to the StopIteration + +async def corout2(): + print('running corout2') + await corout() + + +# You can also create coroutines by using the coroutine decorator from the +# types module + +from types import coroutine + +''' +applying the coroutine decorator makes a generator a coroutine, and thus an async... +''' + +@coroutine +def do_nothing(): + ''' + Here is one that does absolutely nothing + but it can be awaited + ''' + yield 'something from do_nothing()' + + +# Another example of a coroutine that awaits on the first one + +async def do_a_few_things(num=3): + # a loop for multiple things + for i in range(num): + print(f'in the loop for the {i}th time') + res = await do_nothing() + print('res is:', res) + +daft = do_a_few_things() +# daft.send(None) + +while True: + try: + daft.send(None) + except StopIteration: + print('The awaitable is complete') + break + + +''' +now we have what we need to make something that might look a bit like a task +loop +''' +print('\n\n*************\n\n') + +@coroutine +def nothing(): + yield 'yielded from nothing' + return ('returned from nothing') + +@coroutine +def count(num): + for i in range(num): + yield f'count: {i} from the inner loop' + return 'returned from count' + +async def do_a_few_things(num=3, name='no_name'): + for i in range(num): + print(f'in the '{name}' middle loop for the {i}th time') + from_await = await count(i + 2) + print('value returned from await:', from_await) + +# we're going to create a class to make a task loop +class TaskLoop(): + def __init__(self): + # list to hold the tasks + self.tasks = [] + + def add_task(self, task): + # add a task to the loop task must be a coroutine + self.tasks.append(task) + + def run_all(self): + # this is where the task loop runs + # keep a loop going until all the tasks are gone + i = 0 + while self.tasks: + i += 1 + print(f'\nOuter loop count: {i}') + # pop a task off the end + task = self.tasks.pop() + # run that task + try: + res = task.send(None) + print('result of send:', res) + #put it back on the beginning of the task list + self.tasks.insert(0, task) + except StopIteration: + # this will be raised if it is done + # so we don't put it back on the task list + print('The awaitable is complete') + +print('\n\n*** Running the Loop class\n') + +# to use it we create a task loop object and add tasks to it +loop = TaskLoop() +loop.add_task(do_a_few_things(2, 'first task')) +loop.add_task(do_a_few_things(4, 'second task')) +loop.add_task(do_a_few_things(3, 'third task')) + +# and then call run_all +loop.run_all() diff --git a/Student/rdrovdahl/lesson09/jupyter notebook activity/Archive.zip b/Student/rdrovdahl/lesson09/jupyter notebook activity/Archive.zip new file mode 100644 index 0000000000000000000000000000000000000000..bf73dc6eef3b3d72062a036cdc99729f157cc8b8 GIT binary patch literal 112006 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

|f zVJgWID#&5HDZxL6qxcK~hSlY;t?46a?Xb+!wfj6Ui}?=M#>aa?Z@;cZ^2L@K)b^%% zB&nE^H#8j5%-bN|2U-5ceh=c#+>E)jH`qzJOfnI1l{O47Bx}` zw=PG^j-!-+bOwTbjc#eX+V>F=gTu+};5>iIzBlkaD(w>+TUUc)!{C)0DG^}W~+>LGw>EA3s+UO=GV z`tyLhir7~N71)~qC<~vMfW-!5B}H2ys?Lx&!@?@V!E?OP@TZ?Lg2u5W#pNf^gZ8DP zw!L`MBgz5DtFkS7rQaME)qk;QBTZ)Wsa*Fk;_mkZB(KOUirM$dZ5 zO*xsi-I69Z;OK-FB7)=BaP($$_~>N*TVfj{@RBdo%Mt7SmT9I&-Dmn9y17Lyln4*x z|IUP@Bjp~jwd(c>6Q1jk;>L`G(7I+__axcl?J~LDK+kWi+{Xrc#RPj@%flbZ0!85U z&>8giShG}@IrGN&$qq%#s3s%~Jb*`g!AEu0!eA%t5ayRBZrRd+Eh-Cw+|f8|Q`h{2 zV5rOADhj+=BSQsfn;B(a=5vUj(GB_sLVQ}vGPpIdyy;C6exZdss#${83jXCq0@sKW z!s7=RQ{(2c*i$!hiI)CJjD-WDgO@gRA6I6)!Kq2xG)Nw22y#5r{8d16llFeQ0;C=U z^DUy0K z{@kklvk%jco558kvNqnS9yN)zuOjy88n?ZnAa$|%)-dqCyHcWUDwCms0$9yxPlWQ= zC?GfFWi`%^9@khu1bN&Y5KdIhIX9t@dTE!uiDh~%%47OLF-fij?*s(kn~hux&O`|# zpY8sxVHxr}g!)`0KE-~7jKA1**hvQ9sTB1FD+rE*c3U80NA>TaglbRJs#ZTPv(-e~ z#Mcejv^AJ-Vpd?EVzeNgbV>=62}N5 zZ-nHYj2y$?$}${xll+eMmJ>0y{<#{lfNsl-XRz!2XA7eu&zidq`sl6Swp>-Gc6Rwl z@TPLfG|e-Z`SHUIz5dYC+8*CD=v1a*;oX==(*7;&lBF+e$aERaphDW-T+5NBqqwvP z{PM8dnZG%KmWs~qGNQKybL4yph-8jqwqFh#B@p0jxmS~*o6#|Ir&(jLsL@4py&p(I zY?HTLvPwfueNLId$yo2mhQ=@jDqRI&BdPq}L`@HbE})_EWiC>nAcK9enov$m3$^fM z@7g2|drFbuXS4r)1sh3l&+*rVeBDAb2J}Y5NwM86?ZY};i$$Yxk`A>0n1&Y&;Msp6~qkdV#jBT>|!xFd1Q6_;5?_4FvTT#>{yq6nqk1u_Ras15Xj`cD)y* zql9nZ+X0;e)=M4wgEMUI(1g+VJ<&Y4bEv1&9X$^L7aH?>8T+UzE4UGootAigSr1eBUzCob$EySYotHsyO!w%*p?Qx_norQT(Pf@-}lJ8^7Ok*YHoC7J4u5~F-b5Y^yi&>9+J7j(o z#lnAGnXhA$v$*Rfm#TDQh2*@Qhf2T+yr`_RWTj^Zl&Iu7ZU#D?mFU79RA+ZZ6p}$L z+doW4RF-w=v(oWJg$wFCWo^w$7Wig^cB#XZi}t5!rgF0Mi8^cpgtg;cgz*g2(XUSm zE3lsWiK)`rc9s#K^3wLDBwjTU$p|v0mvHYhBngXf3p`}8l6K>3l4Vx-7V&sg3!m$= z8{n;-RA}>90Zow42_z~T{yA0_eT<}lN-kn+_2cxj7?RZ`WGJvLi%Mk!%n#TIZRg&w zX==ZDgwBwKbECPeIv)`Tj#0>?Um%6HFs4JsxWWgN{Zu;@Oy{=)sJTGtzXzK#2rhcq zgdsa^(PPc-h>w4QYxn0ArH(2AgMS%P(IJWINDd6>=nS56VkFMogW(QDCP(}xNVT1f zG=5?v!c~jHA&nMujYIGcU{Z6#uXb{g2RF9ifIcSvBA zsjfQz5FinTHmCrKDDQRS-KO>*!&y%563gPq{A6?1a0+RWTw=B?7BcCWDY{S`+Hzx0*>)-OQ$dP+$C`c?|+uf0dKc`Uc%573u`1=15X*`vQbvgT}y7`iquH z6u1~4narqMf@&pq{FL}J0HQL{oOSB&MbQ4Wo>)JA?|<)4Kflgd+~$|JX#D=KI?+S+3CFAVvGKE;w@%s zR;!3})pHEylz8$A!uwJ5ZMf2G_*Lue@`N&W(V7`#O|Ml`+?L>4dL^xmNRf4`L2q@L zelkhw^+?iGtu85hCdSQ^*z0C9%(Yf22Fic|$Ek9uyOu09%Eh8xiY-rqRg2#eNDD-g z95V*}5`=3n(B^A1suR4$+HRH6FZp>lLFL*H743LHbyb7^cg^2C_tGcC=3KO4XB2Wd z9^#C(Lc_HWq2MzHw4!vW1}YL_^Is`R#jU-V&{bl#NZAnlMwp_Hpd*a0En%8C;exW$ zLIQLQ%=NrojQg`Z^8K!~_wT_4@@6{pv!_Xe;A-3jFRKE+uF0(Y_y(Z8`$3|n?c;P2 zmCRqu3t!gv8*d(50W#*AOdpR0*UQr5M&2|iMbblbID7-GB_T$Re{-7=m`NNsHu{S_ z<0>4k8*<-!=4!)2{v`Br_?K4~T@X~|l5hUoHIF;X_4m|kBON;m{ou^!I zTrDGKf^0R(X6ujpGX+YK+_=l4^V!n!@pw4?cb12rs|$au#d3Qb^oOnzp7cc7>#q;2 zUzAFWfnF1mvv}WIAF=~Qqds%aS_c_#E1@&ww#1u6kzq( zA0^|}OES97ogL!Czsc?`+b=22m`U@AJEp3CTg;FapTGRLDeKa2!}m$aXf31|YSWbC zblT!gxJ=HxO;M=4H&E1_O^*(EzBdmT3)wScT{UP=9kTa>jTQNQzf>)JDin&1a!g;p zy^7}^u*$k{(oc7fyZA@ha3p-X#|$8!Gz7D}DyuUxU08sg8SFo$3CL!T%@4}i`VCJD z)2=(h0oPn40>Kj5#0G~7?ub;>$>=z3Y^2Go4}}u z|JA5zJFUwu`)K$yu2m?5MRJ;>(c~p*FbFuXi#36_&3Mi$ZKOPb`U^^?f%KWzoACM6 zK<_$FF-8@FRMJBip2jBR2R^)1>75nD6(%VTG81Oxf8dSHt)-sM`@|)+oJ?0|#YGz+H!)Jk>+(^+F#2^fdO8XG#xig)M zn{k1+~GLwuOlKVQLX9#6y#Zz~uNkY8l;y(UQXGAb&s3OF< zX7JbX1nf7#=cilvV(?m=8SM@5a?m5Mu|c)%alS>-)!BwTaKDg6E84;*+d|}2$AYo2 z|6Qv2^Uq=g1cR#EqmmBLi^0#<#-4y-iI|9z8`bQQJ~%u zdT~4AP8m*KtSn7uVfsKGv{|M6i2hH?=&Nk{G(>#jV8YjqK<^i zDCFt5uBCeGHMZ!r2m|FIjV<&D#y$-%m9N#jVgGdOkX?7+_-?Nh@ND6~zWu%GWs_gX z!9@8NZ$#f|=gGm%hzOfyZ+6u1g9qLw=g!ayx^?m|emgChr}&U%RmM%b)AB8@#*9Im zChPL)oV1akizv!2sA12&BVOq+)w$vJky&eV-K5vbaT<+3*rlJIG*ZFDi0FG~AqJ=L zoEde31QjcqMSHy=y#*%}Jz^BPH;(q_sn!RYul5eP7w^ei3EvtC-+W#^WyR)&hicK$ zXzoI{CTTrAHHw?k)C!mg$c4W@m3PLwUv7KBALKorPwhT8&4LUDDARXp`#H2-HsFW2Rx!>owlT4eGv9g$_ zT@yObGuaM81YS>~@8!bIu>)eq8_%osgXG({936{P%@WFOEHawvXP=Iv{XCq;IMlE{ z`h3h98Vw>MNF}zbKNDd5HnE&m>06N%kLi^cli9}EIAz{kgWsV@TBUIK*({zSq1i{p zq`XU7j!EP#@iC1DBPk@nLvUr<`sEoL3bcgt2lWpQS#D^Hdt!Nl^Tif+parrPn8N{! zZ&N}WR^7*$_%0m1a(+s<&KOa+$iW#6Gt%yDM+A58r)whMWNU41H$CpHT*LHh&t~ev znh#5c=w$Pe8e1lN=(|-CUf+|g0;u@zM*JvB9G&l#GCg97&uD+pdh=-#f|W3swM<-= z@y2uD9kc^LQ*RRQNcu+4ZlA|$@sE^rOnvRKOTFvbklv#pH=R`e` z4XksahFn5VPQlGlCeSYg$$@^|Q!sq-<1lagltn4>)t2FxEo`kf*OEs*bNw*NC#LO! zELMCBY727lMA=pcBn+KzeCHAVWwoggF|jTg5ZKt;^nv&bh@O29=J5n_?Lydrko983 zr@@m-W{yx~5!>f~{Xp*~85FyUu30*Qf|8E%A@;4S!W8X_v+kxS4jqQE=YtjseQrF_ zp1)+prnJhk5ORVCC)2i6Cwr97c$#hZSdh4ZuqzF zuUzK455P#F073mq1^Z2cEo07Ejc#jkjIn@-A?vhph6NX{SI!R~W|4A@=f%D}8ErGei7k^qS!YP5Jg418HJ z0j}RLdUMexXh(AFd;^RwU!@VUAQL0N4VitnM;KICW!d6`uVpPK|zGsLj;P zLCyvqeg@}9xTmzzDGag7SW9r{KN-?lQNATe;Yk(a;@ zfO+E}6K`-pgv#H7oCbm|V|TS~n@edBK~gpW0TWcuo;Vx@oga-089oh0#uv5TC(icS_X9Ovgg;(12@VkF zxrf-}$bOe^y{%eS!n4)L`C4rAZXO={RW-Sn4Y!f(#EWRR!eg|DS$Nh%2QHMwoK6AU z+tJDb`{sd1A?~HDlP-a(2}Fu=jh>acKS<|Tq$8$VVD^pFe;)6LDg}1bPBQRvK3~36 z#zDSw|8oxsVX8^8a4B@juV;iTNL6*LRPlo;N?HYj`a&bQ3`1DVg4PgT_$T|)H!`19 zPlE>%70chYdI`;tG+jhnYNvh!WQHbe%VSHC@GG66=BrrQ>Pf$>LQV{2Fqfi(4u&FQ3CRW)PG9d@{XEo+c4{y5~`;!nw3UC~4hYZ`(hOLRuo zKW(EK#$IkGTl_Q1owajtIsqDxD?s9WwNw5voCixMM7PbPBCl4cc{oXZ_`F8V zo7jaRp)URr3jUmA|KCMXbO3XgvgrMn{s zSUQ1#rRwVooMMTEB#CY5i&8Dop^NwBDm}G9#+V~_6Nm6LVeDC|grIAVqq^s0$Cn5v zZy=)&(w^Gs_thKW<;w7X)P`xo$|v`(FYi3y8ljS53wgL{76 z*0z}u4n@hPekT}fsi6Wj+aZ@Bl1m2Xpfev=c(jin!?|a#5P?l^Rhwz`YkoJx-62rL z16_zdlgr@*BX+Hy?}(`MeoG$kKSFijiPoQ>p?d0(y>7QTF6&nM zq|L=#MIt38tCF3@AWhlh?cxkOsRRs+vV$G#rdZzZq?Q9__>lNbZA1hEQ}8 z$32GsWR6UH*tpK~8&e=lPW3MyxNRDn;nIB0@Ye>xzp8sGv#43w4x}t*Rtv8Wm6~Y# zbACaWky3PHxhhV~@X8tvftk&1ljl7~NzI)E=h|P0@$gdU73i&F>igjLl0|wR@EQZZ8+~Zm-j)guqa46v6-$2v?*_x3Cv^vn>H*m~YjKbDpuNI-AW!(11FuUBE6AJXw%E9K`97MCFX*Y!@_ z+zAh!T$OcOBG!5gt7|9|s)VIrVt5LO|gr0k-nN_WpdjG8L73DeLx6I%C0%GAI4 zHO*D5cvVW@D@|9rop`ZR2`?O6ns#UyXl25lWbv7#($y`Mz8522YX9vIPuk?cDcLwK zf>lkXAmiU%R-LZ$!-BaCBUb1j(^eHfvJ8KnGYr?Tb78Yb~I$sf#k~wtC_1-Frr57Y;8~g@vcN25T@U-4%ufKo9=XG zJZ&CD3yV0W=kji@Cd^FVzTLTUDNT1J)L@sH@1~`^f;RaNyXm4cz-Q=RbCgRW`O;<_ zrT^wYT^WE6ZK9Es~A_ucWpQQKimlNOoC zi`|?b`}a;sQvXsdUHMd*$OvJFhugy|9(T^`vzu! zAxpHfv_^$=;R`mnZTA32oX0C?(YYBS|chnAmt1_8p;*_f|_% z$>%UJiJ33U9PNi)F6d`&phvgDqgS9Ijr38gdLRh`#5p(;uL_RR%jrdn%Lgkqf7H0e z2^m|&QGhh2)(L5mh_g*@Rv((4=MkhNu+PVLKT93Y)<`|f%Vj%?41qs@w+_P)e!XMe zvDqO=xcG@ZNnlS{%JQdf(@){RCAK8;Nh2|rhnQ%)LE3=G)^nDR{Va}Vh7oHQ_imOl zgg(mm{{%xoyuaq<^+ME^z){p=at(R}&sjLZqt6liTenb=yoMJQnsARB;pUsop4`&d zw{0Qb2axch2M=VeeV_Sjwg^i*vkGb;k82UE0(Cv(~R*mBAm!bVJN>j?gpR^ z!BfmsLPr*_TvQ1#cX|_a@4$M}=3Piq--q+ucjAPImGP zhdcJq4<}`#1{~vbeul7bPkB#A$fBOcR7?eM{-=@^;FjNYnPqacAR#f#*_sVN_-&p3 z=0)L^bgBWMt_v@>wohPmNj6Sj?s zVg;LlTacj2jHNtRQ8%`azJI9z22|q=C70lX$dDaIW>NW`UDOOv3}-Ivjp;f4_0;oY zM`>GUHeE);BI2~-?$Aqu=Du*TI8|Q$M`Xzs8YEtmAzK@ax<7RklJH!QB|SI9JlGgg zbix_eFHJ$eWdao74D5H6J%j*6cBW9QhbTIy_N_|n^Nzo?H%Zl2f6X9y`ZZ zPQj;t*19;)4MXx5oIDdkzV>IEKCfeLCkh$IN50y-y3?8gQyS&tqo7zBIfH8qXX67* zfO+WmdLr>xWKQujL-F3DSzv1-`jKIh3!O-p-d{V_;0c0!S_4PQV|g!V4|0>CTppkP z32P&&f-2K%6-$0z1$~y|bdBoECkCycJkO=cF%(jex&rSQu(<+IbRXLv?aMo-Tc%iu zH8+{-mRHA*3mSN}*}kF^1;S4DF;{2)Bn(95XP%h(yq}j>eyg{)k0{!=K|9f#+Y)XD z+dlR4_fjN|g5)QAsaDdl*0d9wPr_$ec3>Uvs_gGhvG<}N!9jd9wgW>cz&(Gy%yKT2Y_=Sr~1!6OKvJZ-pi` zk;1&~7qSiDSEs-f45M4*e_Ct54i=0`t7+c`Zvyi>HCoHR?G#BO2TrFbD+RN|B)PV0V4azTi#?9@` zcAzX3rxm*tZc3k~ez>>46GYB<2XT$XtCU_koOT=t4#dZ*dsb2>vxD;4Yc5}iSqZ85 z8Nab8i1_vAS)Gfa?dO`))Ix?4#d$0-so?-4HR+61F%n+G?b{yU^(%huuDyVX@0xOh z>p=Z(=W4M45NsP!6cm?<5T2Xj>!S?U=O+4>F9x+VNV|eSm}Qm}SybQm%z;8UYl%|3 z&;s#MbaWPFy*=Ff9u?nu(W~g1t7!6_*}$YK_Z~Pby2IB(xkCY$&umo5*S+tZC>{>F z6W$1W(?c|g^Wm)froP5M|M2AqX3e$y76f^arwq|1*?^`h+5HBFvH^0eC;#L5qi}95j z8#M)aF5vOw5X%h08IozZfAM5RY9*r@Rm3r-N}&NEiXCQ8u=@CxJdB_izDJSP4moy) zMKF-wIrzl41rk@htZlK;0@6bCg(&5dWc)T)HKbI7fL5wEnta|d zVtUATq4EJ3e;0|o^KTF#R`CB~>pYeuRkk+!Kn&1ohzw+)MKD8at$F$;&$)lMb@v^m zRasU9IPTwGs{r3adxEoxXjm$ydFjJu*BwU1-7fy}TGtBFog-zB;enNPx8j+}po#0n zQSfC60Dn~QuLz}@Ia;0?U!6r2DDfp4Ab{Za!%S4}Ao3@ECO(S40rqnYv{=6q$b4Uw z>E85)x^TGy2h+CAm9(CM-8v5;zCBF68=8Kd4^e;d3ht2DX27}*nADta#v%(-{Au_& zAYU4WTA=hhRU!JhfrxF;fV&M&>1WF7Yq)Q|SxJ}WZm}+b) zcMX4;0Cvn*zAKA0z^i@&{mPAG!gsjwl}x71bsar*eSWAP<=4Zh02gT6)YNup%3chi zivyee%r2Fx+{<%e6dvcD{0U?92b5dyJir7YiMr3dg1gNP`Heo)g;x>b}A)ZNMKN9~@#7KqSIey6#j(kGb^n8>V z;X9Q!Ep*nRHB6*SZMfdj@CWdCxa=f zv2SAUj7i8a*L-M##IfJUDW~e6$L8NFbB2JddJg94V;6wN99^z9ur%R0s#sE@SN|k> z2bc071C0h}vD%Fj`c(4SOsDiV{7r;uQQ}oH$oEU>wjA-N-@Jg$THAZ+$n~t( zQxf)x_D}Ef05+z6mK#1BR1+2xY>|NAU4ZwwysJD2@E9&FUD`EGnr55RSY@`1QhM@H z{W3IcSz=$Z>*i1vr~ZB#TjU4>gSYj=J~&(3cu`^T(H|a^era*!eq^6Pf<+$sTP}&b zyZsQE8lu`i=4+5?2F|ZAAO2m%NJq3?l8fC8Q50cI6C*~^jRm4Cvgu->_ldEIigcSZ zkI*%a(vXtTa}I5eOhL0D+;g{Mrlx+|WGQ!l$m+1(LL~;XD~$F{>SN$Z%FlzaO{QXW zDDv;7-iEgWz=`FpN|zB_V1bAJwoi~Kz2+tcneM(uWz9x~{Q9|r5pjAb$N;!c$fOdP z?_1_~H9cno+w)%U=XdM**T4AXrcx zq?xS4U`Uym9dvGhgBfKjL|)-=Uhslr;ZH`QFLtF1PZii7@wIxg^SU{BO*1q7LqnWm zv%9uAZA75zU|1$z6!Wl8oW6bG1Ww7Ur}sB(gqHBhD1tj?%n`7Eh^6eQsWSpFN4Zi9wxJ#fJrR&Wg6SYBS+iw#BXdRz! zqaD*V&Yq_)vA%Xtwm?$bVZ3Xfm&~zUZ0JdWmRQGm-z6p?&6_R!iHvy%+HwTS! zpSTFf50ij0UTJB`Pjexq^49Q0ASJ{dmDs!|!wSzbzL?7jS%mVeQD4fmFh zuEQ*HNy`Kmu`TGtL!`=bEV{`6Aqda2fF+F>lkA&SA>$L-PFEx8;H*d; zO+_l5r18MK-qmKVb)S{yfD#@5JBP#u0X+k05oLda7#iQ6!aN})n`*Bx`1^!LQa^xc z)okO^O6*2;4w~&zd~^+r><&nx-xvjwj46Qwe>xEN)Kz4y1Bs-ys8WirRF2yq9fw5+ z1schm9Nu7xSOtLTz#_Gjf$8hq3wP%mRhgn0qFDr=>u31}N4g~3i9^2ZiudKo*w1X? zLw6M5*SY|CP#H<+Io;j#kCuRSy3bI$U(lu;nWHVJ zz{KXV#}Ntw9i{E#Qybm>bfnl#aTqerdcVj2+G{S8XQq4tKQ!Ionpp4Jk&6N>AlVJQBbZ3Wo4`GksOd$c0u{~ZYwSs!p_nCKWKcQgcY+2lfwxs% z@}GD6Q#zWYx_YyQ3x|eFyFkbt$?6g=lCIG51NYE_+q({A0st!k8zZ`x4SYo{i55>k zu8FdlAxLaHxXt5`0a+Q(bkhP<1;R;#7d(qL?w@-aoNxT|Zfy1WvHVDse%mo9aD)v4 znY<#DrBK**jt*rc@~2eouG++5y*wYGCim|+l#H#RFFu|GS3kQFO_`OiSvh&~vSnv< zvHKE^6=7yO%1aUJ$eW6f96ovme5GzhC5 zA#uJx`!-UqcuCF0r)v^vs`Gf_56V|pSyLd3F@~A%lH(br4BEVG!!&6%B>iTbyWo{X zO+|vApI65L+w6hvps)h`#4}c4(2y`MX}>G6B{LdFdKj7{F`IC(MW7$~Ws2r{h6Obp zWYXy96}bUPiVmhD!QUXIGdzHCeh_h1BHX}ydougdCyhR{!K)%6@`{m zh?nVMW4Qb1XnKkO=%Q|32OJ5O+{W^ivHBSfo(^{`Dl*yAJ5jK9exl)|^dtApm3n+G zy#PKE6Ba~ovhpZ|^Otk^Izlw5p$Uv6aRwwI2Gq)BQK?+}g`b4ZF>>9tZ-@B%?4k&v zo5753S5*<-?5mlwj6{olL_y?BNz9EMT{ho?%Wsbc&z{2Y0+Sg$^ed9S!n~9td|$>l^d&RNScad{>`+40K%SH+;xS0_eqG=LlVH!)Z503Z z(dCWk^()~+%2zdCNrNe$snD8GgM-2wDgHfPvH?mB187{Ikg1=H=uyf$_&vWdj61*p zDCO8Sbq7?KfHtIN8fh3mV2^% zFTY=(#}?=UJRqyIDOfHoa4ZLbjUfL*1V@7U5pg!1xjH9->q%KZ#piF812_Hk*3?%Z zQpbi5u_W?gRT<`mjwE4*fWMa$)5X|*($Xy+x!l0T$kZRzegAziU9zTB7uCpiYprFy zftZF!E(KPBa+FA|c--s+R0q0T%@Lg#){s-d6wS#8BeI zFq){J&cfV2uDKaDw7}YCx;Ww*DLLQ8s2$S69S~?rTl~yIon-Ao_Y_O|Jmu|F=YE++ zZbz=`nNRqT<)weL?)=G+s~>VkzeTF(HN*rll%3Ndqg|%zGjP;lR0zZmO z$@y4rSuUX6)+{0GirBTs7i`v$ELGlrs$RxsQ#SQwc}S(O4%Db&c%mBJPAe_aevOH! z`7q43EJ$(XG;W0-yjM_Qm!hN-w)y$|&hIz+LQx;NY6Mf=r1(sBs>qUUB)+a$PbNY- zAs>F}9rm{an;vaxV2@DFVRfC~C$8@*OOv9>9zVS0FX|{v9t^_lcm46308OoXYJNc>_2M zN0EE>U*WQG@`c5IrUo;emgJpu4|@+=s$RXTj4&#p?u>1bU}KfaUQcCw(!Du5n4Np8 zY+d4}c`mtJ)=1V7yldzFY*cU_H!MJZE4Z32h`h2x<0c3Hxo<3YP9(o;_gVUH z!G3KL^Az~S@EuK%2Bc^Ztmv0{b124PWLS!Vo= zX-7{rBE58WuTXSCUOnskV=)Telh+3Pc5)9`yaD}6`FktU<26SYqwmtK)8I>@Todup z3VkbpQs1H;{C1I5fgV1m_(s7(WI|pgeKHgPmj@C+FS{&?bK5F%3j;<@6Pms2-RMwx z^kXJlkE7w!P$G?B5T(vznnY?W(ZAuT3L`P>r`Zj@zw+uJb) zL>iU|a9ZJGy?;zXxHKX^JuW~I;JOMKZIstf-+H*b9 z7Bq@HQQjK%y=OX~gYHv8t4FDmu6dQO5&?y;PhJ%AK1&_&4j16+`uZ<4PK^b~HG>P9yNwE;058~cqA6zK{I(VEY3nDGpd z?CbGho?$aD<2vsS*l!WcyMvl3+WQpEkQBhyF3;~Df!Lzt2j8!v-v#zEOQ8XE@s zSr+D3pd?d|zmB_VUXyiWU}%__(S6lkHCsZRMLo=*&O7JC_7fKD3w4h4UexLDP5u)0 zZ5%#Sb=@vo5AKhu$fZ;CzHY4s949xWSm6~n7^)#QA@tI8f8wP;G!_}oD#cb)OY>se z);B>FvfyPd2$=ZNbHD~~KYI&fYw(G5QpKP!@T_78i)+keV}7*kOaN73oLgJ!UPyRN zJ}W)C6asR~m*URSa&*s5PSW5&TxAwF>;6*DG*L+6ukk_RADNZGn$e^O12%=&>>gP6 z8<^mmJK?0Ftz#jm$BbrNA8*rT`$i}Duat=|T|&zb&bFLuYL!4cD~sx)yMUpIm`$yh zJ1qRefkcpq!{UXFs*{Ky)5O5*I!vJH$Q(fV*^#{;*mAVw5BQrD;n{1%w?98ZV|G|= zAI(BPw1x?lc^#kJ8H2j`F=vd3lzO^af$>t0Y#+cDXBnC&WJGSD3h~dOgGMq`s-)1< zMzC1-8zm#n-R};y{<))`dQ_@>ID}mQoOi%y%4#}$lvUK7b@6m<;sc)iTzBjiSgpP5 z6eG-VSyxl19NalDn*lv9W^a9q;S4aTj!nlJ?R(^PqxeKN4%E58?B zEDWjMQSKYf2dD_b>~f;`720zooc{ZteLE;lBreZxKSrs1Q-INVLDm?Pe?LnVJe6xb z3vizk73c&R-1`F*g`a4f6#$())pc5lV{{TxG$JYVAZPHr0rGhfaa@O0uvL2he(9&g zPxVGXC48Q{q3-0MUw90-=LhNEuz*Qts%qeCzHE1bBu)tsR^(X=0|a0viK@IJ?|%FJ z6G-bN;qW`3xp6disEeLGD8mNNfN$M2;Cvf7h248Ct+RXC(V8U7!akU?yqu_YtT%nYyY#LIt-9IGaPJb&=?Ps? z^X2&r&2rF2-9j(lqjohdK>(8$iE_ z#|@CG>wETgCf$hfwyM`vN|%yppa3ud5fsu=;86n7RPjF6ve^qScwEaN9iR73`e_As zA*6WCNM0c;N;-^BoquU+$vz(f2SCGdmzmGU+Gq@B$I{$5`{Da(Pt{=k8UIb82JK|F zgZpjRUwcDkbz8UJ;xL|Q7ZKHY3z||%b~OfUdB-aAt9JBafO?woi990s@;7VFCn?h( zlJ6h0W9(5j3q2)h!+tjJq~3vR`o+GF=2I{%w3{sH1<`M#-H#@+|Efx2P3bBs$~Te4 zy?udknej^iK4 zMEDg$W5c`a-V3~!ZpG8c(@h;t?xKcfM*1qBTKXq?b`lQ_%;0A1@Nt_=~)7x_Gmrct6o16@Uah7gdZ0G z(+wQl(0+}_#+kPST1j@5F*!oAYkDUP))BtC8iiC*(OZ9<+;32@ByzkVpMt~E(@u^G zN9Rt^H9@lZ@R&ugmw{#L0{OVb3#seM38@GIX{*LWh_Fj-%lfsIg3*H{75|9BK~@5a zR?Ro7j>^h_+uK>zfOvgwS)BHi5-*OU>qC0#qvwsm4Dh|RME9cg)V0RXnOeZSQ>iq} zGMa8&kZhfBGrK97x6aSZc1G^^Nx=ye|I!^WW+ zzt&%mnqD9{p{{goTVIdxLACL$sYg;y*C}d)N5%Gf)KGA`DT2gUa>8PZAWuMg*aBnc zXeatLT}Px)*$qMz=QHk=oJ)8~Y*!d0h{>hJFbuR!OO3f~%AE@7gsJD4e7%oc;&04> zZh!!;UqmzHu%U2m^aMlq51iMJy9mXSt~llaOyEj}=5l*m(p=7b!RfJ9F;3E_SqG?{ zLeQH2c=p>D6PoF&=>!{hFdwD;_0@1nlHWhY{w2(_uRJQ<*W-uKB1(|J_M7?c!TY5~ zHbC9J3&*knMaiHbqNcDa(*3oOjn+znRj!c-`5Ebk;g>JJbq|TksO7pL8Vl#S-S&_DCNM|>xLO&aR{HgF9k*}Ki1Jiwg<(YXpZ@yD6ZUHu%|D2;1~ zo*2mjy@6A2P_RC@N2j&A%45nv{gGvmWJr_K+#&u9eD!uuW39Qg6lsjQdv{FtChqv> zb!}_huBNPe>!@-@$!0yJhN$&?4`I2%0|5O-mZE+E)K`}NQ~f%YEmHv$2!Gq|bHeN+ zb}l&BovRph6s1fQ1@N>)4CqH-$4TB&$_yl-DdQR&E7YsE_gnKa-4~Cu1|>OuFlpVi z2aWlFG+w}2oh)Q(SRZI?$$3b+40s~x>X0i$%6}VjlR=v2ro+M4G~9pDWS^%7eS304=PE+F4UdeFN*f zyCwTgAS}TxMP$a-Z$US8+e7T)mt&~CEu?pz6}Mfq{ zs407+IDPpTOEGBL(lQQX?Hn|*H>^>C<5a);vz6PEiA+cibXNDmMpuYdnEi~9O~gw> zeUs&bknpk1TXTnhcYq?4V6@%Wh63sb6izxY@^B*vJ>N>!dotG z+;@_1XVp$f6X;tcT?f1oFUkWGczND+V}%)4rn7%S`b3Xy-PjmO*{E?=T4EpO=kx}3 zQOd{eh^OQYi%mdNfdrOOko`>76)B9M%(g`r57oM`Ga3De{mt!E6m2;2V zi4E{HyBMu{A0kOsW0-zEJ5cb`{k@y=Y6Iq7j$!f@>cR&ne=f#9%u=H9 zD4*3vA$Ol-0aQN?E41Gn>{yHL59Q;7Uk0~^-w*6c;EQ@}TpE;28GoJH43G6e(iXZB zR)4^;TvrJAr8)=e!WG8felJmc53^ZS7`(AJ{wbs{^k(iOQU*9sO7wd~nKkY*-vX5w z!lTZr-h-H=XU?xSstz=abM4P2oN#h(knV~dw9^%`VB(l_i!z}xm98#4^o_)Uo7bDA z&wEz+&ijy)4L&H>-`|;%q-AtGudZ2}dW(LVWUXO!zS7zp`qMM9TV z^pNiOX5-OSi9K;%`XMAXz;7W-k;1tg08;tiuDxhls5q&0`q7pcltPSNyqLyLRx;1^ zhQ~pdG8V21USMDAlr95JU6tAm>UTI*@oJ%%wcE)&s``vg!|xV>MQ(&?@*}rB|y@I zZ%3_)^(Fmyt1!NbB7>4AR-+rpXOsQNs*iQ}atj|7gwTyOQJF+nGIa#Qg zv}U|#qlGWdA{^&Af?f`bb!mI7`ELTZ3dW+FKAA;}LCTGr_6m&Eg^clo;#~SYL&?`q z{cD~jebjTsD%hvKwF&Ud>(_85kefb>o=TiAEAaEfSup|_@$nJ9Rg3C6#90R(uG9rd zy)$A1!$pl6j8IH)^ME1Y=F`&d9I)SY1>b{$txucsfTS9CrMO{RSV)~TjKUu8isYbk zc*_pU6WgfCz)OtaF@~X_8vFABr zwh2@ws=lg7{K+3o4K5&<+jXc%)i5oI zakk?Xv7_#miZBk3<{x^oCDP^}SSHLOH7@bLGx!!b?W^VDHIqTTV2d%kB=u6qx=oNVd^tNoanz@FfUGm%_LR;EcC77jj=fX z%EZ10N6Gwz4o?9{5Gua}e_G3Ram$kwgTkek4lY5-f*sGjbp)_No>R+21{jRMJtf4cIa6F*2raH|lTzdF?O}wExp1;+^_zie;yRS!>3>N_nx^UjqsD zC)DM>G%ByKRZ+BA_QI5Lf01TyHqZ@)7g=i`9 z%%hmw^EAR4?l_kVr5B!)!+%PbNullGF)@XR?lz1MZdLaKuQu<;!d zq!7KwXnT{&aNi6giS{-=-#7GIPJ0JSM+Z(|r}FARbwoPrl=*>-d_|&lO9Wb%$ghog zArgOH(Vt6%E)2GFcZRJ?IF%8`1mqY(&9xzOO)#zMDOd7)n`)56_t~g(2Oy0Ml>(|) ziVo$SewPj}axG>Swe^A^%o?eD(moae$_ye#T0!=7zSX(a#7w-G_4}j0dg!?Cgfv?w zM(PjZ_{d94F@j+;+;ba?Bp3F;o8K<1)dT9>vM`rNu6_v>1_-HSmGdwl{LRyt%gDtC zp~?sS6p!y?KoJ30%AlAZ=ZgO6jaHzr(xGf%ec{X~Mc(8(xy7W*(-iJR>}0p$i3v>% z7#U`R$8}=PP*BrIdCO&y5d=?iN)i?hIy`yr=8P4`*L&PxtcX(dM zY5w}H9+(Bd`b+ZTyr%BRI{d|s0?zu!+!Qmjki>#>jfs!X-^&3rZ&8dEp9F5rj4=tJe1R_~ zIsSQ-<5^%L#2aq2W)r*oA{d_#PL*tH$ ze9@<;T8qfBC^k{iq8Ej-W?jHIO^#%cF8im>rB`Bp3N_kQH8xt5u|dvI5T$Lu_$^@c zEN=;}Js``^c;wztX^tK3=$Wp!0o6O9Ytt7nsZI`231ua{o%p}+UdFg5e3w(B2&7JH zX#YN6407fT6yo#@(x=47mT!y)nJN~$^4*&q5cPt#4$w#HTv}>^qnG^bxS=zB=)U3x zGY%R}#Def_jJ7_Yv3oWPg*v*!cex&49Y4LkIORZI&NF+Jr^)H1T;UbC0aFV1G+{eY zHg8M-%MQzVWa=Kphdn{A=yB32z4*D4DHt8xxB(ARrLc@r4(@j(&z3Cvko(UZZM}cy zsNPLp$g@4{jB5E^uE6W(q}SsEn)02MOE(oH=GWFCt_1Oh4=3OOZ!-ELe}09@fsnjY zu!4D<7rza*6aYIAe9Z0jH=)87`-De8>iRK!{Kg)qE@OA92D$MfOs{G1t+T`s;MX}dtN7!%O52ncB!99D*ebMpO zLtR9}Z>IoPvA2^je+~89W0g*$ZG};*q*g&OHNH>IgSy*dh^b$-i#lQ!Bvf=)fQTwt zkxYH`XybRFlfmJ5V=6EdRnGC6>P@Dm4~@O)??h?6DU3*ntuBY|AQ*o82|v_m%lm%!c91BKFZbeD{gM!qp0J4Jhn2m|IKC~0;^NgAOHm0bPyzV-Du{t(^*>B-vkv*2NO}KxMQG!^&u<;~O$e>5OW;EG zH)b%N@4Gbk#6qB-?iHA@jur#fNl#Hk?h6QRVlf4^rMpJQ;`iI$^z;ys2IzJcatO5f z#-a2bY5>5=^ccIaHheaVI@dej4~OzH7xy>{<%k6@>{dC1fsy`#6GhHVlZtmiOP&m$ z#@Nn1gG8HmJaZS|uU2;FRo%w6VJ#1N#I7Sls8$1L6ut)&fcEOcOg@SBL{wfZD22(V z&*frdiuY&@{kI|R;dX{!gbD>ffeL3!fuo7jM=zNhuf=K-G9=^!X5Z-<79fV8$c2v> z)_b!*Jw>9hgKef$umoy6XM8MhEL?=+t=E=op4xH032H9jbnurS_w!|&hW!Jae>-UM zJlnodTdQ$01Y&f$8exwQM02f*iB9A*f#>qq4kY|D>HR}y8J#>+{8=*Ja-;`kB>cxn z`R)K$#)Y63&hl{1%~pJ?P@W<#)8o~^iSPGTY~VjVa>Rdn%G-64k2p!w<-*4?7Z%OC@6=DD9Oy~Po)fxD5sYXE?=|7*- zR5r8z&cMQMhMebW3PbeplIme*SWNHL2U_IcE>bTVmW!8Zz^p^P>azd4gBW&*dZ|wK zPx-#I@9cu!^^#Tf{)3lmXzTy^HNs#fdK@WIVm$Qt=N$jj>&vyKa>y;yxot@_MDh+g z2TD>{jf^l_)^1_{?P28zONSF5Ul@u1421&9Oi&lMt^VknDPMQ{5IEdqhl4E&>eVD@ z$?8DLf7=ZRV%sVB$Bl?L;QrYs5%+p_=J~)6SMO2Z5Nt^Dm`O-=@PCgiW)L<~%qVyX zz{vimo!0;LvnC?OtH-17t;r((TdO*D<7%f{n@EHPQmlXd?%e?A@Y+H7AUu^HI z`~T1M{i#;pGPXT<{@WD~`!A#6VDbA=Q=!&Q^t=CSi|LghaO_q1xh*!&0!x9GJICZyFjV?fFxzO*u1wn05oM(SNa)Lu|()UZfN& zVQziCdY#R=@9_HYk7!y#j^Rq%ZF&Xz=a02C^8B1WHs@5MJT($f2QO4=mUS+}wQc7N z@**tC5}j)EM3YYHP!gP5bAD^8VjP4hu z2XtyJ&%u=$B1Aw`aSzAO=D2a?oHIFena|X=Q&%)}TdE6NHQ_bf$GrBcFJ;!(;03LRY$O;H_u*;%pwF7Up|ib#Lxrhx-d%{g5MA z=A-)t<*cU|*gENMW&Yp8qminxUnUt{D>|E@nI3Gev-bphE!)twcsRCND9EW@e{Wl- zp$gZME*EY9ew^zRkA67q+7|H2LVrZtV*1G~YYh7qbWdg#%jxvv^Am29E|^nP8$X&O zz5_@nGrI4*WD~Nk>c@56*6^~9s-qmJ%6i)JH=tj{#mD*eapC7~aIU5A`Hst%?`_uA z$$zfhGJXr{(J021Zwf{Q0$aKykXsM=WiR@t3?_bFL2&pM_)#Wz>9!C$CHi9c90=WK zfQ(xd1&Mv(>M~W5}Hrf_!*18&#<+ztQhhoS12@gwh_p|HamM z>_`f1Tl9k%;N1|Lct||Vu!;Bn>o3*!PM-8is#3Qq4H0q9-fNf0h_9Gdz@6fk)*R4f zU7x`G-9+2Y$oy3wnBtjGum$0h*DdZ+&I};=wM^R%P^@0iN?IYZdIM z8Cj=(ZXY{0ha>yRqxf-YqlW{@!(Ac^!~ESeIPT4YE2`>o4HxmvA0bnde}*`1(C;yGG!i z?RrpB3$8cQWtEl9Mm8yK9zlJG-kmo>xwss-_-()Nj4>=njP+fILI|{ThY4)z{BV5_ zNUM0=F?M$P-Y+XNu7Y{^5p&Itz0X6HJ_u%0Xjx6py3(=-?ZeqG_S@b~dV6Q+iTjU1 zhZ^$Hiiv88v9x)%qMl?KYrLKj3z2Ycf@GHTf(t45x-AcmcC6nuRK+g`NifL55A|j0wih)KrD|$w4k76j9|KMJJRtm)R3Va2FQZO)y#q>d z!Djh>nelbtuiOJpzifK>9;VBE4BsK0%5O({b-_< z%)BBuUBoZ7+uF@WQo(CKY&Z-yMYm*~#b)stn4#9D-1X}n(if0=jdx6#2@VWUJ8-ki z0dHZQ@#oPrVqnH-BYz`sE(+|H{aQaAWxx+}XTNXnJ}l4jyn*Y^K$IIbx*9=`>h4=S$sZKaFg8#)yTKZ#@S6-v!Hw?Bc5Gu=T-)a$0 zc%C)lH_I8dj?iM^MpW*f<=YU`AelA}!0m_9#ldiR>P>=Fsm_E4*`l&VxHZsFQViP# z3qNWC$}q{5rl6eZ+sXl#(n@`i7gA>JE~h03Nuc58$eyvi&}O1YI=0|iEr|!Y`BLl8 z#XA;nh6g?}y9EHmL>?%7-2)b|5=sOglq>H1eG~`-GDNP{NBJ7B!h?v*tl|DBJ1SF{aXa86losu{^$BC&#d2K5 z`{+%pmQJ!2B>G2CcxZ9=+~LKHGb_9DGkc=3jJOX^g#su7Pp<cm*drEQK z>9LDv&V`i%>Rx^8s){`q@p|rfY*l7Q2xgX#-$w&Nk@=3?F-pQ2yyJyJyonP1REcyj zI<%}ZmYZ7_k_Yh#UH@J_b}@dB@?hk=70+j;0vG%Bosg~f>pBsCgtz!N_~s7h z;s&qb6csn>HUlI!@&r?{l@|*yRmt!9OQ(PfsYyisc0ZB5ndSQz;x|gOU_%c-@GU!7 z>ot4e1L5>}4L0|bWMzC(46yKxZKoH>iRk>u+Jl77iwDn&#@CGJx?TK9;bzbC#qU^s z0r?yJV!xYa2aY#`EkF={fbp8@81bMX#ZDGq(B*#FYDpSBdBE1(w^xc`QV+{x*XeY- zYXb&wy4XgQ{W3Q;OP{kzJCT1g{NwWG=+iu6$pAM%$iEwCXflan0rEv9&x|gCcwl3I z=_pbCu5W8OhQ;pf`VbN7$xw24l*e09L~_1m!5X+ z@ls)#I3sUGR|kTrBly~7w)~l(a4~Vmj0XB#ywT}O_PPw0H6KNF8SHjYCBPJsc;pZc zi<7%^#u+ZY!xNK{+p;>TwNcdYrut^^^+T%})&Ddv?U-Tf#O(Ct2=~XXP^>mNMKh@8 zWxQ!=*liIs{c1mmV8;PE6rEP}$el3hI^(^l!)E#pKgg}he)?LBR*!Le0_@Ziy-8Q# z@9gK5Dxo`FAi!<=-M+fPJKi_iZ*^q+C-8pppegb`-(e)=BU_B#(mECORTHWdGhwnB zneCEK$n{zH!|>4jN$+EuFVU~FVA~6~OTZ5!?>;K(fuDkJM^o+VQ*UhNoj13A8`6|& z!2kxdg$>4NuqppoAD47qr6uosyDsnK2TPuVfM z;xLDJRVpq5PL$OAK+V~N|HdxH@HpMjR5RRHawcAvj1K!d1diZb+LJ_8awfS}-E;Cc zRI9iYJViW6)j90jOW*PIg|44Vw5JqL2eIU>k(%g%Y#dV1n6TpUv3jQQ*cyKtQR||S6z8xI z>=S&$aPA6`nvzYpFg1_2+3H6YubVo#$_ z7@#u%LfS}eLv(3qvyoH>8g9r&Ci&hDkx?mi7p4>?lIbCRa`Me^r|c6AK#FjSYt%0g z*ZR)PkD9^+>gjt6z)txhT)DiXR13HRz;D70A4}pZ@irJgiJKB(LK8~)K%XlR~+{vv#N(}_K z->XHCd2lBJw%0oi)_0i_y0{#Do)^LIV&oa7CP3U^xQQo#)=eL97OQJq#YFd*`ofgb z%u2+JKm!3I^BTF+4JQ9ijCSg+Gn_XMDvpwa7+;u?`;%+;G=709eVq)Azb)W&HIT-> zpBZhW;8z!|!)JAuiE7clp2Ux4Qk9mjD3W$M0p~~BX2J12G#{IA3hwOp-v>&jSs7?~ zf~FU}AljXax}5#}-C-(=z3L<&13?%DRqZ zH}$?>_LYRM?{+hz0?ykf{SOZ&tMgzLar^2sIM(7yI4}$l7UK!6sC$RpCVWW^pC)g# z;Vq!UL9luK*VMuJjwXoOzVA}SUM!V4Nc@a_nBPgiffw&cnxj`FUSNL)if*_elh4@m9mV;o2RabN4z z^gFP}FT8(q{jlc(usRXA^Nj}YvpgWgl@&sLD+NR>#A59Tcw_Sm<--Bwhg&|W(-Xmt zds4ik$p=Q!viR{fblpR&5@B=O5B=RoWB1%~s>)8q!mvCsI=yaO^!=na1vdBF=eCJ! z{culb-z#v!N~Cmp-BokYb{%q=Sumd9+ePXok{Fqh;})i{x%YKN=E2YUJdrLP>jRQ1 zOCu$?tyY=?dm3PVvZ?nHhNG$;F0h0M34(z0Y`4$q3huPalG-+m5hwzXc-4e{#l%42 zi`38F#AS+L{(|Ue%jMVppt_)w_648RAm0UQ!|XchqSP<)z4r3d$%=uzV{x0KmAGPm52H|fE}N(DkE z2Ryr-4I=~Mx@y)38;s*;{&yBkz*i#*J4G5a!Lhxigvb!W(NIe-8s8`on6{togUGsN zAv3ulz%_sm76P|jUBKnp#sT|Jzi>#{l}PAD;H)N0jx10hgZ!(74-fi}C442TNNC1}rIl>9&pgbsmzo-Se?K29} z(TX55sIgz3LTvcy-|nNV5B>7K6Z)X3K0xri;X>?=L%rhT>!hMiPObKncp@K>1-f}~F&EjMp8QRQ47lq5NDtzKe_ zE;Px*P{WtQo#^E!N7jbV;2Rr)=TT#$Tm$nyR6M2g;P0Hq>IgTO2KU`u0TV^%=DkE< zd_{U0_zsA|M?y<{C5qV10m6?`9r-wKeIbZKl8RP)Gqrao2@!4Gt)2 zy#7`u`w}d^QKDqo*dvmz9Q;OvADKOq0969#yC9~qX%MNpdV}26d6jr8w1G}YPQiOiU*W1hs=Sk+m6*z~!akI5vn*i0E2VYq$l?pKnAZux#P;Y&$l1v11ND zaClykj2gX{3#Q-YFKuHq@A?%a1p;p|oj(l)pvBr5c#7H&P38b{&H+HD9YTuZP)eZ2 zmelNR&-XHuuL6nvQXv6QH`fYSO|71}52vt@j*9O!M*m$dd3LW0lpXKX!(eXx=kruh z&q8FeUj1S9$rIv3bp%wjFz_PM z3$**njy2dmAwapP5o#Sgr0)Y)mjDX-AV`RYM8d!iOLgB=h9NkKO!WS>%9_=t`Hl0N zh>^|f-?-vN5_rKNFl<5N!W&M;c=X3*8;p_f{B4I$4h_VCScwj&E6Ov2?L7)P?DIe( zHuDnMI>BiPI`*T%)q@wGUQ-RcKF_6W>-vQfgO{rgqt7}mN^ON9R<$Lz-)cN2>=B@m z{BJJ+jah0037E0F>9)DX2Q^fP$TfZY^B5g~41|o~8BOtJi|*%SQlnQPI5@IP8POqV zUPjE(pGyz$wkExBv>DFmf3bQmmP$vRSZBW$X+LJWVpuy;^XpkXisxe-d_un@|56S2fsAMtm zJ4>Z;LWL&dzhskDI&Lf}NLE;=FSJY(?hc-}tAAKNtrY%KY1YXVfc5FYyGsfz0E)%o z{6a&dO!FyUvU$#tE}U)q=O z;SqimCSLW$PIF`XlVNE~;R4;j5VgP<^kJJ)#GkEfI1c`wh zsS?=P1vNFL;3I`nCYk%;WVGA1^ATDf#Lde#j`Uu9HFD|7)H&!-SivwHNTr!5`l1LN z%}e)9RvL-4P678bZq1iI`Zx0W>Bn4AfU$!OngqViqTDo1L8Typn!mi| zcepP{3z-`|9>v!ReM@kjasYB%)5KkB_=?(OKabOLy+#tN!-(Y@Lk+cTPr@>BBnCmeLlK(=kGQ&p&bqPF6Fesb>}H$i5vjFta;~@r=E`smY-qWn+kRwN z(f(W*-1fbr@pg+*pi01aP~L?2E;=}q`3$21PvhY9ghd(a4Eg+C?o|)O6u3|R_Ja5= zdH@!k@AE|i%N1nH@P!spN!KlmQBmNXR}|W^K$StudJ&&5L#J}nOs{%E$Bd+VyQQ9OmLo3ISpt^l0F<+hII=9f)_XD%6GoI7#^+HI0`(6Djp+jpJGA|R{ zgd}lX(F{1kGRkMe<8443B8!Xxf9n7vHaxwk#ed{z_XlMJFX$1y!wq$U1DE{ zlCZNI4USLTS`5iE7PKU`a=N;sVCM%Ib6aEG?^|)E3-ntA6e?l3`DylD%I7<*711+* z0T=^{f=r(rnmI#&*5E}D3Gt@wUY6I$!MIILbK`X|#{@%iQPZ!lI5A3^noF}FJmT%e zBg(*C%BB(<3}ZXukw!cBM6kofVdw>aud3;c`a$FZcJ&*O=gLK4iZKuzfYG1}ja*s# zaxgH`@O9?nqc8@MDoo{w5NxUyHgnJyItM$7Hyj--Zfbf9 zlW$?kMk>NQnZVksoZhTYuj{W+zvK^ZqxO)`^z!gdUquP{IN?Mp?8V4!}kKU{G<-&VYJ*$jYC#=f=ngRl$8YUBTDpo?kwAdkDo*GUNT_cwnv^>5Vexf9)R3VQ;QN}@C^g8A?K9aQz3dWd9BzL39!uV%NfB=XALrSF*Hs;_5qZ=}?*b?((C#7uqM^@Khp2<_FP~vim4_lCN3c+TcA%dAj|CnZ0dAx!r-0q(-HN&|BjM8lmi4^ zFff3>y{Fo+r{K0@4YN39i$0)B>jy+LEemi`U075A>m?O|A=q=TG=(8zOjDw?tc~7| zeN6$t1_8GZoJm8@FU4KXu`pope9w=7EJ31vO^@E%W{~U@QkR$@0?X`T^61rR)=txL zhmTecS8axzt7ka7QV(l8&+Xe^M#^&4D#3TiOU9j^Jo!m8Qoq(0?UcwbckrT%cvBp` zR(wwPsRNTfkaPpW?T7WzL9pm8*w1}ps(<#}8L-jV7e(5{2&?i!q%VzA12=ug-}-~h zy!*tr@*4jzn{WD4UBhrhr=mp-6!me7XL}@$ZJcTPL+O%yo`(+aSbfMkB|vvBDrL1!yL^;Q-0#Uwwa>D9TSZIiqd?p|Zu3bTFtcw9;LjfQ|ZLGdm%wo1mI z4JW+LD&QHbu=+|iY40GNT z%|P6}PW&`^oQ!@hYZq@m>cIo9Ch868$M_sqSTg3GlqXwQC$Buq`0VJ}A?bO98qMIw zZzC@Xc5};IVTWvVT8yVNDvC^kW-CEkp$WVwwKIN_Eo&o?ta`!vDO40eFY*j;YGzg7aOv?ww?P@(hC zLeYe^eoDc;u*BHfc>A-cF#9Y%fu6B<2iDWGqn0xYg8nR3Iczf2jjyo-g!P#y zVZ%}>xHbd{_pv#lJPe|?ud8o3th4gCn86nC{fXI5xigK>WsxY78!Hkqe&NxWVM>xp zPBPa`3O|HVM@VVxo4J7ykYoj28$jIl!#<=B+wJQyPpnN?FdQU+8tW!S2llU0`))^* zzYVLv6)Zt*$P(aoP>|NtD-Q@GAdo9M!ukSK&77UwTsu6Wa%i`*MPP{bxAhSfnUv_O zek@O*^Tc6FmJ8 z=fk@(@I49VQ`<_;VXDnf(6#n=F{|!f;6(^vt$TVusZ#`65tvnPN6GrQmIWpD7fmX+ zqg_x#(~i7uWu>eXzwJ;FkK<$|O`a;@BS=)s!v{a?o=5&5;g-7WXRZ}P>+ZUI!-~hz zX_$G3`_hU>#jqmy8Cd&;@W$)?u!DS+hjjnpawBnQ=p9tHvczoT?E-GZXPtdR>+5(M z9KX4^Gh%Lzig`(rIhzr%O)#pK&OK8rjZeT^mjNgt%85j~4sEjI3VsqJz(0mdzASzf zn5N?LBy1^xc6Q<$Y5zm>X2b(XkDkg>@+VLR+B^{EcHAaG->w+NY=gfk(e()nwQp7g zHXSX>4Mxi{+CYjt$_?TBq0R))22Z<%sB5tF3pEvrZ7DINh1aw|HYc3L6ET5Wg%&S6 zh=MK$I#3#PxL>wWb}Ru?9AGi)%4*3+<7g4u8?y7OIpWes-SNdu&<@6eEN!jBwlA@O zr0WRiwSr7!=EF`5eDe)|M!OP~XfnI*6GeD;W9QiG&U-*Xf-?4F3X zU;7ljIn8ms65U^}O9ybW?kI83e4pc{2dI8N}9M)-RB%9nZj*!uHAZP-iv4NVnW`1_-}LumY(?QWLY&DgALm3|@0(ac zZTs|lY05+q58@P=Y@u0@Cqp(drvfWSs}}k>ynS7%A!*X@EHivp(Cna}%LuWbUvzSx zuXl6(*CRyCON?+&<6PaZ`#DF9%4g#ERrVa%H~eWLZjEHep_hCHqcTNcf>oPUloOC3 zBo`~pE}LRvBUt9FQC6paFSSDfoUJqU?VM9<=LvM;^�e_Qdh!j%Z~w-q`Jv`>o&z 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

95+=3)Ee>NS+4GE|k0mvWukxK`mS0D} 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\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# run the code in the coroutine\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mcr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m: something returned" + ] + } + ], + "source": [ + "# run the code in the coroutine\n", + "cr.send(None)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "running corout2\n", + "running corout\n" + ] + }, + { + "ename": "StopIteration", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# run the second coroutine\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mcr2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcorout2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mcr2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m: " + ] + } + ], + "source": [ + "# run the second coroutine\n", + "cr2 = corout2()\n", + "cr2.send(None)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# another method to create coroutines is to use the coroutine decorator form the types module\n", + "\n", + "from types import coroutine\n", + "\n", + "@coroutine\n", + "def do_nothing():\n", + " '''\n", + " Here is one that does absolutely nothing\n", + " but it can be awaited\n", + " '''\n", + " yield\n", + " \n", + "dn = do_nothing()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# run the coroutine\n", + "dn.send(None)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "ename": "StopIteration", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# nothing appeared to happen above because the do_nothing coroutine doesn't rield anything\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;31m# run it again and you'll see the stop iteration is returned however\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mdn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m: " + ] + } + ], + "source": [ + "# nothing appeared to happen above because the do_nothing coroutine doesn't rield anything\n", + "# run it again and you'll see the stop iteration is returned however\n", + "dn.send(None)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "in the loop for the 0th time\n" + ] + }, + { + "data": { + "text/plain": [ + "'something from do_nothing()'" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# another example of a coroutine that awaits on the first one\n", + "from types import coroutine\n", + "\n", + "'''\n", + "applying the coroutine decorator makes a generator a coroutine, and thus an async...\n", + "'''\n", + "\n", + "@coroutine\n", + "def do_nothing():\n", + " '''\n", + " Here is one that does absolutely nothing\n", + " but it can be awaited\n", + " '''\n", + " yield 'something from do_nothing()'\n", + " return 'return from do_nothing'\n", + "\n", + "async def do_a_few_things(num=3):\n", + " # a loop for multiple things\n", + " for i in range(num):\n", + " print(f'in the loop for the {i}th time')\n", + " res = await do_nothing()\n", + " print('res is:', res)\n", + "\n", + "# create it \n", + "daft = do_a_few_things(5)\n", + "\n", + "# and run it\n", + "daft.send(None)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "res is: return from do_nothing\n", + "in the loop for the 1th time\n" + ] + }, + { + "data": { + "text/plain": [ + "'something from do_nothing()'" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# it's acting as a generator and we need to continue to call it to get to the StopIteration\n", + "daft.send(None)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "res is: return from do_nothing\n", + "in the loop for the 2th time\n" + ] + }, + { + "data": { + "text/plain": [ + "'something from do_nothing()'" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "daft.send(None)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "res is: return from do_nothing\n", + "in the loop for the 3th time\n" + ] + }, + { + "data": { + "text/plain": [ + "'something from do_nothing()'" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "daft.send(None)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "res is: return from do_nothing\n", + "in the loop for the 4th time\n" + ] + }, + { + "data": { + "text/plain": [ + "'something from do_nothing()'" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "daft.send(None)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "res is: return from do_nothing\n" + ] + }, + { + "ename": "StopIteration", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# this one will get the StopIteration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdaft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m: " + ] + } + ], + "source": [ + "# this one will get the StopIteration\n", + "daft.send(None)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "in the loop for the 0th time\n", + "res is: None\n", + "in the loop for the 1th time\n", + "res is: None\n", + "in the loop for the 2th time\n", + "res is: None\n", + "in the loop for the 3th time\n", + "res is: None\n", + "in the loop for the 4th time\n", + "res is: None\n", + "The awaitable is complete\n", + "passed out: do_a_few_things result\n" + ] + } + ], + "source": [ + "# now use a while loop to loop through the coroutine until you get the StopIteration\n", + "from types import coroutine\n", + "\n", + "'''\n", + "applying the coroutine decorator makes a generator a coroutine, and thus an async...\n", + "'''\n", + "\n", + "@coroutine\n", + "def do_nothing():\n", + " '''\n", + " Here is one that does absolutely nothing\n", + " but it can be awaited\n", + " '''\n", + " yield 'something from do_nothing()'\n", + "\n", + "async def do_a_few_things(num=3):\n", + " # a loop for multiple things\n", + " for i in range(num):\n", + " print(f'in the loop for the {i}th time')\n", + " res = await do_nothing()\n", + " print('res is:', res)\n", + " return 'do_a_few_things result'\n", + "\n", + "daft = do_a_few_things(5)\n", + "\n", + "while True:\n", + " try:\n", + " daft.send(None)\n", + " except StopIteration as si:\n", + " print('The awaitable is complete')\n", + " print('passed out: ', si)\n", + " break\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Student/rdrovdahl/lesson09/jupyter notebook activity/async task loop using class pt 2.ipynb b/Student/rdrovdahl/lesson09/jupyter notebook activity/async task loop using class pt 2.ipynb new file mode 100644 index 0000000..679063b --- /dev/null +++ b/Student/rdrovdahl/lesson09/jupyter notebook activity/async task loop using class pt 2.ipynb @@ -0,0 +1,2558 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "*** Running the Loop with fibbonacci numbers\n", + "\n", + "\n", + "Outer loop count: 1\n", + "returned from send: 0.0 seconds have passed\n", + "\n", + "Outer loop count: 2\n", + "returned from send: 1.1920928955078125e-06 seconds have passed\n", + "\n", + "Outer loop count: 3\n", + "returned from send: 0.0 seconds have passed\n", + "\n", + "Outer loop count: 4\n", + "returned from send: 0.0 seconds have passed\n", + "\n", + "Outer loop count: 5\n", + "returned from send: 1.1920928955078125e-06 seconds have passed\n", + "\n", + "Outer loop count: 6\n", + "returned from send: 9.5367431640625e-07 seconds have passed\n", + "\n", + "Outer loop count: 7\n", + "returned from send: 0.0 seconds have passed\n", + "\n", + "Outer loop count: 8\n", + "returned from send: 0.0 seconds have passed\n", + "\n", + "Outer loop count: 9\n", + "returned from send: 9.5367431640625e-07 seconds have passed\n", + "\n", + "Outer loop count: 10\n", + "returned from send: 9.5367431640625e-07 seconds have passed\n", + "\n", + "Outer loop count: 11\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 12\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 13\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 14\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 15\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 16\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 17\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 18\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 19\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 20\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 21\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 22\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 23\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 24\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 25\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 26\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 27\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 28\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 29\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 30\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 31\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 32\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 33\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 34\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 35\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 36\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 37\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 38\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 39\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 40\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 41\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 42\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 43\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 44\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 45\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 46\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 47\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 48\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 49\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 50\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 51\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 52\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 53\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 54\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 55\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 56\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 57\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 58\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 59\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 60\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 61\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 62\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 63\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 64\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 65\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 66\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 67\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 68\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 69\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 70\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 71\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 72\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 73\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 74\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 75\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 76\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 77\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 78\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 79\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 80\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 81\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 82\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 83\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 84\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 85\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 86\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 87\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 88\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 89\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 90\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 91\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 92\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 93\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 94\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 95\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 96\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 97\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 98\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 99\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 100\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 101\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 102\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 103\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 104\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 105\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 106\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 107\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 108\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 109\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 110\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 111\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 112\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 113\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 114\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 115\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 116\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 117\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 118\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 119\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 120\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 121\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 122\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 123\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 124\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 125\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 126\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 127\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 128\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 129\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 130\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 131\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 132\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 133\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 134\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 135\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 136\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 137\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 138\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 139\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 140\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 141\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 142\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 143\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 144\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 145\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 146\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 147\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 148\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 149\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 150\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 151\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 152\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 153\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 154\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 155\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 156\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 157\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 158\n", + "returned from send: yielding in sleep\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Outer loop count: 159\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 160\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 161\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 162\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 163\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 164\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 165\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 166\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 167\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 168\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 169\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 170\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 171\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 172\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 173\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 174\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 175\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 176\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 177\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 178\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 179\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 180\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 181\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 182\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 183\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 184\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 185\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 186\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 187\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 188\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 189\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 190\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 191\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 192\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 193\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 194\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 195\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 196\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 197\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 198\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 199\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 200\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 201\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 202\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 203\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 204\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 205\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 206\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 207\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 208\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 209\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 210\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 211\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 212\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 213\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 214\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 215\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 216\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 217\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 218\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 219\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 220\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 221\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 222\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 223\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 224\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 225\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 226\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 227\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 228\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 229\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 230\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 231\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 232\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 233\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 234\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 235\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 236\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 237\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 238\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 239\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 240\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 241\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 242\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 243\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 244\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 245\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 246\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 247\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 248\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 249\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 250\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 251\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 252\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 253\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 254\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 255\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 256\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 257\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 258\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 259\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 260\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 261\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 262\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 263\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 264\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 265\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 266\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 267\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 268\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 269\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 270\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 271\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 272\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 273\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 274\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 275\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 276\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 277\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 278\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 279\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 280\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 281\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 282\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 283\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 284\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 285\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 286\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 287\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 288\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 289\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 290\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 291\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 292\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 293\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 294\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 295\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 296\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 297\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 298\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 299\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 300\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 301\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 302\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 303\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 304\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 305\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 306\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 307\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 308\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 309\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 310\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 311\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 312\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 313\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 314\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 315\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 316\n", + "returned from send: yielding in sleep\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Outer loop count: 317\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 318\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 319\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 320\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 321\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 322\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 323\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 324\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 325\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 326\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 327\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 328\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 329\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 330\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 331\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 332\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 333\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 334\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 335\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 336\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 337\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 338\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 339\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 340\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 341\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 342\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 343\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 344\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 345\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 346\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 347\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 348\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 349\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 350\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 351\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 352\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 353\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 354\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 355\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 356\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 357\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 358\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 359\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 360\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 361\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 362\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 363\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 364\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 365\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 366\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 367\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 368\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 369\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 370\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 371\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 372\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 373\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 374\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 375\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 376\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 377\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 378\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 379\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 380\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 381\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 382\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 383\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 384\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 385\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 386\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 387\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 388\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 389\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 390\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 391\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 392\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 393\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 394\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 395\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 396\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 397\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 398\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 399\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 400\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 401\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 402\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 403\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 404\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 405\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 406\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 407\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 408\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 409\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 410\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 411\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 412\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 413\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 414\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 415\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 416\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 417\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 418\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 419\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 420\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 421\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 422\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 423\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 424\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 425\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 426\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 427\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 428\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 429\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 430\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 431\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 432\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 433\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 434\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 435\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 436\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 437\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 438\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 439\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 440\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 441\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 442\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 443\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 444\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 445\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 446\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 447\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 448\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 449\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 450\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 451\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 452\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 453\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 454\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 455\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 456\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 457\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 458\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 459\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 460\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 461\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 462\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 463\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 464\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 465\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 466\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 467\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 468\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 469\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 470\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 471\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 472\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 473\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 474\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 475\n", + "returned from send: yielding in sleep\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Outer loop count: 476\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 477\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 478\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 479\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 480\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 481\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 482\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 483\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 484\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 485\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 486\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 487\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 488\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 489\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 490\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 491\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 492\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 493\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 494\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 495\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 496\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 497\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 498\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 499\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 500\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 501\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 502\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 503\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 504\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 505\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 506\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 507\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 508\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 509\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 510\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 511\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 512\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 513\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 514\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 515\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 516\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 517\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 518\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 519\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 520\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 521\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 522\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 523\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 524\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 525\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 526\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 527\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 528\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 529\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 530\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 531\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 532\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 533\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 534\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 535\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 536\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 537\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 538\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 539\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 540\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 541\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 542\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 543\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 544\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 545\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 546\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 547\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 548\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 549\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 550\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 551\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 552\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 553\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 554\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 555\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 556\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 557\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 558\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 559\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 560\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 561\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 562\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 563\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 564\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 565\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 566\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 567\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 568\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 569\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 570\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 571\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 572\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 573\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 574\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 575\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 576\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 577\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 578\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 579\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 580\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 581\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 582\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 583\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 584\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 585\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 586\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 587\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 588\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 589\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 590\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 591\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 592\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 593\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 594\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 595\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 596\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 597\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 598\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 599\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 600\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 601\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 602\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 603\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 604\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 605\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 606\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 607\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 608\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 609\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 610\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 611\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 612\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 613\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 614\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 615\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 616\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 617\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 618\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 619\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 620\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 621\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 622\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 623\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 624\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 625\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 626\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 627\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 628\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 629\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 630\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 631\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 632\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 633\n", + "returned from send: yielding in sleep\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Outer loop count: 634\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 635\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 636\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 637\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 638\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 639\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 640\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 641\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 642\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 643\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 644\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 645\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 646\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 647\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 648\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 649\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 650\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 651\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 652\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 653\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 654\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 655\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 656\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 657\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 658\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 659\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 660\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 661\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 662\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 663\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 664\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 665\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 666\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 667\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 668\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 669\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 670\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 671\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 672\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 673\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 674\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 675\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 676\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 677\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 678\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 679\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 680\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 681\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 682\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 683\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 684\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 685\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 686\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 687\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 688\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 689\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 690\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 691\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 692\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 693\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 694\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 695\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 696\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 697\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 698\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 699\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 700\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 701\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 702\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 703\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 704\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 705\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 706\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 707\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 708\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 709\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 710\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 711\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 712\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 713\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 714\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 715\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 716\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 717\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 718\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 719\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 720\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 721\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 722\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 723\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 724\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 725\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 726\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 727\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 728\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 729\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 730\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 731\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 732\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 733\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 734\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 735\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 736\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 737\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 738\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 739\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 740\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 741\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 742\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 743\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 744\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 745\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 746\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 747\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 748\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 749\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 750\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 751\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 752\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 753\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 754\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 755\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 756\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 757\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 758\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 759\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 760\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 761\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 762\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 763\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 764\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 765\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 766\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 767\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 768\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 769\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 770\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 771\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 772\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 773\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 774\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 775\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 776\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 777\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 778\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 779\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 780\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 781\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 782\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 783\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 784\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 785\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 786\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 787\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 788\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 789\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 790\n", + "returned from send: yielding in sleep\n", + "\n", + "Outer loop count: 791\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Outer loop count: 792\n", + "\n", + "Outer loop count: 793\n", + "\n", + "Outer loop count: 794\n", + "\n", + "Outer loop count: 795\n", + "\n", + "Outer loop count: 796\n", + "\n", + "Outer loop count: 797\n", + "\n", + "Outer loop count: 798\n", + "\n", + "Outer loop count: 799\n", + "\n", + "Outer loop count: 800\n", + "total run time: 1.0152230262756348 seconds\n", + "the results are: [144, 13, 89, 34, 8, 3, 55, 13, 5, 2]\n" + ] + } + ], + "source": [ + "# let's add some tasks that actually take 'time' to complete simulating what would happen if a task were waiting\n", + "# on say a network request or some I/O function to take place/etc.\n", + "# note - we can't use the 'sleep' command because that is blocking instead we will create a sleep coroutine that runs\n", + "# an infinit generator...\n", + "\n", + "import time\n", + "from types import coroutine\n", + "\n", + "@coroutine\n", + "def sleep(secs=0):\n", + " start = time.time()\n", + " # now we need it to yield control\n", + " yield '{} seconds have passed'.format(time.time() - start)\n", + " # and keep yielding it until enough time has passed\n", + " while time.time() - start < secs:\n", + " # now we need it to yield control\n", + " yield 'yielding in sleep'\n", + " return '{} seconds have passed'.format(time.time() - start)\n", + "\n", + "# now we'll create a coroutine that calculates something\n", + "\n", + "async def fib(n):\n", + " # classic fibbonacci number, but with a delay\n", + " if n == 0:\n", + " return 0\n", + " a, b = 0, 1\n", + " for i in range(n - 1):\n", + " a, b = b, a + b\n", + " await sleep(1.0)\n", + " return b \n", + "\n", + "# we're going to create a class to make a task loop\n", + "class TaskLoop():\n", + " def __init__(self):\n", + " # list to hold the tasks\n", + " self.tasks = []\n", + "\n", + " def add_task(self, task):\n", + " # add a task to the loop task must be a coroutine\n", + " self.tasks.append(task)\n", + "\n", + " def run_all(self):\n", + " # this is where the task loop runs\n", + " # list to hold the results\n", + " results = []\n", + " # keep a loop going until all the tasks are gone\n", + " i = 0\n", + " while self.tasks:\n", + " i += 1\n", + " time.sleep(0.001)\n", + " print(f'\\nOuter loop count: {i}')\n", + " # pop a task off the end\n", + " task = self.tasks.pop()\n", + " # run that task\n", + " try:\n", + " res = task.send(None)\n", + " print('returned from send:', res)\n", + " #put it back on the beginning of the task list\n", + " self.tasks.insert(0, task)\n", + " except StopIteration as si:\n", + " # this will be raised if it is done\n", + " # so we don't put it back on the task list\n", + " # whatever is returned is in the exception's args\n", + " results.append(si.args[0])\n", + " return results\n", + " \n", + "print('\\n\\n*** Running the Loop with fibbonacci numbers\\n')\n", + "\n", + "# to use it we create a task loop object and add tasks to it\n", + "loop = TaskLoop()\n", + "loop.add_task(fib(3))\n", + "loop.add_task(fib(5))\n", + "loop.add_task(fib(7))\n", + "loop.add_task(fib(10))\n", + "loop.add_task(fib(4))\n", + "loop.add_task(fib(6))\n", + "loop.add_task(fib(9))\n", + "loop.add_task(fib(11))\n", + "loop.add_task(fib(7))\n", + "loop.add_task(fib(12))\n", + "\n", + "# let's see how long it takes\n", + "start = time.time()\n", + "results = loop.run_all()\n", + "print(f'total run time: {time.time() - start} seconds')\n", + "\n", + "print('the results are:', results)\n", + "\n", + "\n", + "# Note that when this is run with 10 tasks and having a 1.0 second sleep time per task, the result for all tasks\n", + "# to finish is just a little more than 1 second. This demonstrates how that the coroutines are all running in\n", + "# parallel\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Student/rdrovdahl/lesson09/jupyter notebook activity/async task loop using class.ipynb b/Student/rdrovdahl/lesson09/jupyter notebook activity/async task loop using class.ipynb new file mode 100644 index 0000000..23f83c7 --- /dev/null +++ b/Student/rdrovdahl/lesson09/jupyter notebook activity/async task loop using class.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "*** Running the Loop class\n", + "\n", + "\n", + "Outer loop count: 1\n", + "in the third task loop (middle loop) for the 0th time\n", + "result of send: from the inner loop - count: 0\n", + "\n", + "Outer loop count: 2\n", + "in the second task loop (middle loop) for the 0th time\n", + "result of send: from the inner loop - count: 0\n", + "\n", + "Outer loop count: 3\n", + "in the first task loop (middle loop) for the 0th time\n", + "result of send: from the inner loop - count: 0\n", + "\n", + "Outer loop count: 4\n", + "result of send: from the inner loop - count: 1\n", + "\n", + "Outer loop count: 5\n", + "result of send: from the inner loop - count: 1\n", + "\n", + "Outer loop count: 6\n", + "result of send: from the inner loop - count: 1\n", + "\n", + "Outer loop count: 7\n", + "value returned from await: returned from count\n", + "in the third task loop (middle loop) for the 1th time\n", + "result of send: from the inner loop - count: 0\n", + "\n", + "Outer loop count: 8\n", + "value returned from await: returned from count\n", + "in the second task loop (middle loop) for the 1th time\n", + "result of send: from the inner loop - count: 0\n", + "\n", + "Outer loop count: 9\n", + "value returned from await: returned from count\n", + "in the first task loop (middle loop) for the 1th time\n", + "result of send: from the inner loop - count: 0\n", + "\n", + "Outer loop count: 10\n", + "result of send: from the inner loop - count: 1\n", + "\n", + "Outer loop count: 11\n", + "result of send: from the inner loop - count: 1\n", + "\n", + "Outer loop count: 12\n", + "result of send: from the inner loop - count: 1\n", + "\n", + "Outer loop count: 13\n", + "result of send: from the inner loop - count: 2\n", + "\n", + "Outer loop count: 14\n", + "result of send: from the inner loop - count: 2\n", + "\n", + "Outer loop count: 15\n", + "result of send: from the inner loop - count: 2\n", + "\n", + "Outer loop count: 16\n", + "value returned from await: returned from count\n", + "in the third task loop (middle loop) for the 2th time\n", + "result of send: from the inner loop - count: 0\n", + "\n", + "Outer loop count: 17\n", + "value returned from await: returned from count\n", + "in the second task loop (middle loop) for the 2th time\n", + "result of send: from the inner loop - count: 0\n", + "\n", + "Outer loop count: 18\n", + "value returned from await: returned from count\n", + "The awaitable is complete\n", + "\n", + "Outer loop count: 19\n", + "result of send: from the inner loop - count: 1\n", + "\n", + "Outer loop count: 20\n", + "result of send: from the inner loop - count: 1\n", + "\n", + "Outer loop count: 21\n", + "result of send: from the inner loop - count: 2\n", + "\n", + "Outer loop count: 22\n", + "result of send: from the inner loop - count: 2\n", + "\n", + "Outer loop count: 23\n", + "result of send: from the inner loop - count: 3\n", + "\n", + "Outer loop count: 24\n", + "result of send: from the inner loop - count: 3\n", + "\n", + "Outer loop count: 25\n", + "value returned from await: returned from count\n", + "The awaitable is complete\n", + "\n", + "Outer loop count: 26\n", + "value returned from await: returned from count\n", + "in the second task loop (middle loop) for the 3th time\n", + "result of send: from the inner loop - count: 0\n", + "\n", + "Outer loop count: 27\n", + "result of send: from the inner loop - count: 1\n", + "\n", + "Outer loop count: 28\n", + "result of send: from the inner loop - count: 2\n", + "\n", + "Outer loop count: 29\n", + "result of send: from the inner loop - count: 3\n", + "\n", + "Outer loop count: 30\n", + "result of send: from the inner loop - count: 4\n", + "\n", + "Outer loop count: 31\n", + "value returned from await: returned from count\n", + "The awaitable is complete\n" + ] + } + ], + "source": [ + "# one way to create coroutines is by using the coroutine decorator from the\n", + "# types module\n", + "\n", + "from types import coroutine\n", + "\n", + "@coroutine\n", + "def nothing():\n", + " yield 'yielded from nothing'\n", + " return ('returned from nothing')\n", + "\n", + "@coroutine\n", + "def count(num):\n", + " for i in range(num):\n", + " yield f'from the inner loop - count: {i}'\n", + " return 'returned from count'\n", + "\n", + "async def do_a_few_things(num=3, name='no_name'):\n", + " for i in range(num):\n", + " print(f'in the {name} loop (middle loop) for the {i}th time')\n", + " from_await = await count(i + 2)\n", + " print('value returned from await:', from_await)\n", + "\n", + "# we're going to create a class to make a task loop\n", + "class TaskLoop():\n", + " def __init__(self):\n", + " # list to hold the tasks\n", + " self.tasks = []\n", + "\n", + " def add_task(self, task):\n", + " # add a task to the loop task must be a coroutine\n", + " self.tasks.append(task)\n", + "\n", + " def run_all(self):\n", + " # this is where the task loop runs\n", + " # keep a loop going until all the tasks are gone\n", + " i = 0\n", + " while self.tasks:\n", + " i += 1\n", + " print(f'\\nOuter loop count: {i}')\n", + " # pop a task off the end\n", + " task = self.tasks.pop()\n", + " # run that task\n", + " try:\n", + " res = task.send(None)\n", + " print('result of send:', res)\n", + " #put it back on the beginning of the task list\n", + " self.tasks.insert(0, task)\n", + " except StopIteration:\n", + " # this will be raised if it is done\n", + " # so we don't put it back on the task list\n", + " print('The awaitable is complete')\n", + "\n", + "print('\\n\\n*** Running the Loop class\\n')\n", + "\n", + "# to use it we create a task loop object and add tasks to it\n", + "loop = TaskLoop()\n", + "loop.add_task(do_a_few_things(2, 'first task'))\n", + "loop.add_task(do_a_few_things(4, 'second task'))\n", + "loop.add_task(do_a_few_things(3, 'third task'))\n", + "\n", + "# and then call run_all\n", + "loop.run_all()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "*** Running the Loop with fibbonacci numbers\n", + "\n", + "\n", + "Outer loop count: 1\n", + "total run time: 0.0014290809631347656 seconds\n", + "the results are: [5]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:69: RuntimeWarning: coroutine 'fib' was never awaited\n" + ] + } + ], + "source": [ + "# let's add some tasks that actually take 'time' to complete simulating what would happen if a task were waiting\n", + "# on say a network request or some I/O function to take place/etc.\n", + "# note - we can't use the 'sleep' command because that is blocking instead we will...\n", + "\n", + "import time\n", + "from types import coroutine\n", + "\n", + "@coroutine\n", + "def sleep(secs=0):\n", + " start = time.time()\n", + " # now we need it to yield control\n", + " yield '{} seconds have passed'.format(time.time() - start)\n", + " # and keep yielding it until enough time has passed\n", + " while time.time() - start < secs:\n", + " # now we need it to yield control\n", + " yield 'yielding in sleep'\n", + " return '{} seconds have passed'.format(time.time() - start)\n", + "\n", + "# now we'll create a coroutine that calculates something\n", + "\n", + "async def fib(n):\n", + " # classic fibbonacci number, but with a delay\n", + " if n == 0:\n", + " return 0\n", + " a, b = 0, 1\n", + " for i in range(n - 1):\n", + " a, b = b, a + b\n", + " # await sleep(0.0)\n", + " return b \n", + "\n", + "# we're going to create a class to make a task loop\n", + "class TaskLoop():\n", + " def __init__(self):\n", + " # list to hold the tasks\n", + " self.tasks = []\n", + "\n", + " def add_task(self, task):\n", + " # add a task to the loop task must be a coroutine\n", + " self.tasks.append(task)\n", + "\n", + " def run_all(self):\n", + " # this is where the task loop runs\n", + " # list to hold the results\n", + " results = []\n", + " # keep a loop going until all the tasks are gone\n", + " i = 0\n", + " while self.tasks:\n", + " i += 1\n", + " time.sleep(0.001)\n", + " print(f'\\nOuter loop count: {i}')\n", + " # pop a task off the end\n", + " task = self.tasks.pop()\n", + " # run that task\n", + " try:\n", + " res = task.send(None)\n", + " print('result of send:', res)\n", + " #put it back on the beginning of the task list\n", + " self.tasks.insert(0, task)\n", + " except StopIteration as si:\n", + " # this will be raised if it is done\n", + " # so we don't put it back on the task list\n", + " # whatever is returned is in the exception's args\n", + " results.append(si.args[0])\n", + " return results\n", + " \n", + "print('\\n\\n*** Running the Loop with fibbonacci numbers\\n')\n", + "\n", + "# to use it we create a task loop object and add tasks to it\n", + "loop = TaskLoop()\n", + "loop.add_task(fib(10))\n", + "loop.add_task(fib(5))\n", + "# loop.add_task(fib(7))\n", + "\n", + "# let's see how long it takes\n", + "start = time.time()\n", + "results = loop.run_all()\n", + "print(f'total run time: {time.time() - start} seconds')\n", + "\n", + "print('the results are:', results)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Student/rdrovdahl/lesson09/lock_exercise/simple_locks.py b/Student/rdrovdahl/lesson09/lock_exercise/simple_locks.py new file mode 100644 index 0000000..a4456a9 --- /dev/null +++ b/Student/rdrovdahl/lesson09/lock_exercise/simple_locks.py @@ -0,0 +1,14 @@ +import threading +import time + +lock = threading.Lock() + +def f(): + lock.acquire() + print("%s got lock" % threading.current_thread().name) + time.sleep(1) + lock.release() + +threading.Thread(target=f).start() +threading.Thread(target=f).start() +threading.Thread(target=f).start() diff --git a/Student/rdrovdahl/lesson09/lock_exercise/stdout_writer.py b/Student/rdrovdahl/lesson09/lock_exercise/stdout_writer.py new file mode 100644 index 0000000..715ae3f --- /dev/null +++ b/Student/rdrovdahl/lesson09/lock_exercise/stdout_writer.py @@ -0,0 +1,16 @@ +import random +import sys +import threading +import time + + +def write(): + sys.stdout.write("%s writing.." % threading.current_thread().name) + time.sleep(random.random()) + sys.stdout.write("..done\n") + +for i in range(100): + thread = threading.Thread(target=write) + thread.daemon = True # allow ctrl-c to end + thread.start() + time.sleep(.1) diff --git a/Student/rdrovdahl/lesson09/lock_exercise/stdout_writer_semaphore.py b/Student/rdrovdahl/lesson09/lock_exercise/stdout_writer_semaphore.py new file mode 100644 index 0000000..2bc21cd --- /dev/null +++ b/Student/rdrovdahl/lesson09/lock_exercise/stdout_writer_semaphore.py @@ -0,0 +1,19 @@ +import random +import sys +import threading +import time + +lock = threading.Semaphore(2) + +def write(): + lock.acquire() + sys.stdout.write( "%s writing.." % threading.current_thread().name) + time.sleep(random.random()) + sys.stdout.write( "..done\n") + lock.release() + + +while True: + thread = threading.Thread(target=write) + thread.start() + time.sleep(.1) diff --git a/Student/rdrovdahl/lesson09/lock_exercise/stdout_writer_solution.py b/Student/rdrovdahl/lesson09/lock_exercise/stdout_writer_solution.py new file mode 100644 index 0000000..01084a2 --- /dev/null +++ b/Student/rdrovdahl/lesson09/lock_exercise/stdout_writer_solution.py @@ -0,0 +1,27 @@ +import random +import sys +import threading +import time + +lock = threading.Lock() + + +def write(): + lock.acquire() + sys.stdout.write("%s writing.." % threading.current_thread().name) + time.sleep(random.random()) + sys.stdout.write("..done\n") + lock.release() + +threads = [] +for i in range(50): + thread = threading.Thread(target=write) + thread.daemon = True # allow ctrl-c to end + thread.start() + threads.append(thread) + time.sleep(.01) + +# Now join() them all so the program won't terminate early +# required because these are all daemon threads +for thread in threads: + thread.join() diff --git a/Student/rdrovdahl/lesson09/multi_thread&proc/integrate.py b/Student/rdrovdahl/lesson09/multi_thread&proc/integrate.py new file mode 100644 index 0000000..8d56daf --- /dev/null +++ b/Student/rdrovdahl/lesson09/multi_thread&proc/integrate.py @@ -0,0 +1,32 @@ +def f(x): + return x**2 + + +def integrate(f, a, b, N): + s = 0 + dx = (b - a) / N + for i in range(N): + s += f(a + i * dx) + return s * dx + + +def integrate_f_with_functional_tools(f, a, b, N): + dx = (b - a) / N + return sum(map(f, ((a + y * dx) for y in range(N)))) * dx + + +# imported here so the rest of the code can run without it +import numpy as np + + +def integrate_numpy(f, a, b, N): + """ + numpy can be used to "vectorize" the problem + + f must be "numpy comaptible" + + """ + dx = (b - a) / N + i = np.arange(N) + s = np.sum(f(a + (i * dx))) + return s * dx diff --git a/Student/rdrovdahl/lesson09/multi_thread&proc/integrate_multiproc.py b/Student/rdrovdahl/lesson09/multi_thread&proc/integrate_multiproc.py new file mode 100644 index 0000000..2d877ce --- /dev/null +++ b/Student/rdrovdahl/lesson09/multi_thread&proc/integrate_multiproc.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +''' +Program that calls the computation functions in integrate.py and allows +multiprocessing based on the proc_count variable in __main__ +''' + +# import threading +# import queue +import time +from multiprocessing import Queue +import multiprocessing + + +## comment out either integrate or integrate_numpy depending on which API you +## want to test + +from integrate import integrate, f +# from integrate import f, integrate_numpy as integrate + +# from decorators import timer ## this didn't work, ned to investigate. Added a timer to main instead + + + +# @timer +def multi_integrate(f, a, b, N, process_count=2): + """break work into N chunks""" + N_chunk = int(float(N) / process_count) + dx = float(b - a) / process_count + + results = Queue() + + def worker(*args): + results.put(integrate(*args)) + + for i in range(process_count): + x0 = dx * i + x1 = x0 + dx + process = multiprocessing.Process(target=worker, args=(f, x0, x1, N_chunk)) + process.start() + print("process %s started" % process.name) + + return sum((results.get() for i in range(process_count))) + + +if __name__ == "__main__": + + # parameters of the integration + a = 0.0 + b = 10.0 + N = 10**8 + process_count = 16 + + begin = time.time() + print("Numerical solution with N=%(N)d : %(x)f" % + {'N': N, 'x': multi_integrate(f, a, b, N, process_count=process_count)}) + end = time.time() + print('it took: ', end - begin, 'seconds') diff --git a/Student/rdrovdahl/lesson09/multi_thread&proc/integrate_multithreads.py b/Student/rdrovdahl/lesson09/multi_thread&proc/integrate_multithreads.py new file mode 100644 index 0000000..2e24eb8 --- /dev/null +++ b/Student/rdrovdahl/lesson09/multi_thread&proc/integrate_multithreads.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 + +''' +Program that calls the computation functions in integrate.py and allows +multithreading based on the thread_count variable in __main__ +''' + +import threading +import queue +import time + +## comment out either integrate or integrate_numpy depending on which API you +## want to test + +# from integrate import integrate, f +from integrate import f, integrate_numpy as integrate + +# from decorators import timer ## this didn't work, ned to investigate. Added a timer to main instead + + + +# @timer +def threading_integrate(f, a, b, N, thread_count=2): + """break work into N chunks""" + N_chunk = int(float(N) / thread_count) + dx = float(b - a) / thread_count + + results = queue.Queue() + + def worker(*args): + results.put(integrate(*args)) + + for i in range(thread_count): + x0 = dx * i + x1 = x0 + dx + thread = threading.Thread(target=worker, args=(f, x0, x1, N_chunk)) + thread.start() + print("Thread %s started" % thread.name) + + return sum((results.get() for i in range(thread_count))) + + +if __name__ == "__main__": + + # parameters of the integration + a = 0.0 + b = 10.0 + N = 10**8 + thread_count = 4 + + begin = time.time() + print("Numerical solution with N=%(N)d : %(x)f" % + {'N': N, 'x': threading_integrate(f, a, b, N, thread_count=thread_count)}) + end = time.time() + print('it took: ', end - begin, 'seconds') From ca7df01ada334e0846250520b1d5f1c833401b3b Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Fri, 29 Jun 2018 01:09:37 -0700 Subject: [PATCH 15/19] adding lesson09 assignment for news_scraper_multithread.py --- .../__pycache__/integrate.cpython-36.pyc | Bin 0 -> 1184 bytes .../integrate_multithreads.py | 2 +- .../news_scraper/news_scraper_multithread.py | 122 ++++++++++++++++++ 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 Student/rdrovdahl/lesson09/multi_thread&proc/__pycache__/integrate.cpython-36.pyc create mode 100644 Student/rdrovdahl/lesson09/news_scraper/news_scraper_multithread.py diff --git a/Student/rdrovdahl/lesson09/multi_thread&proc/__pycache__/integrate.cpython-36.pyc b/Student/rdrovdahl/lesson09/multi_thread&proc/__pycache__/integrate.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccfa7bbf9ceca40efbdcabac109d6fb11f37028a GIT binary patch literal 1184 zcmah|O>5gg5Zzfxw(KSiq-he;i)uo_(AcgMXbZu#v}Y3tX=zF@igx``WXV~r6FbN! z2a^7j{v};|>R-sIGwYz3Ub?Wev#Z(JH*cQyS69ndyY=rUoUz|*Y2coHz?r;8Bbb02 zcFF`77Oo&{;o!yl)E2HN;ocF&V^%E(fLCbHN_jrvOk6Z6=6S|2hPVIFhhMA; z8B7%U#@xsClSHbdu7rv&h2IbBy@6J7tn0@|&BmK|dq-2*O zH1J#K2$*tQeFk?} zDFtt_FWBV^E~q|e8{Ac%@meE;X_YH#x>_M)T1=VlONTuf$;n8y)^KZ>x7qbUUSg-) zxf> ')) + WORD = input('what is the keyword you want to search for? >> ') + sources = get_sources() + for a, b in enumerate(sources): + # get a thread 'key' value based on number of threads + x = a % tc + if x in d.keys(): + d[x].append(b) + else: + d.update({x: [b]}) + + start = time.time() + r = retrieve(d) + art_count = 0 + word_count = 0 + for source in sources: + titles = r.get() + # print(f'\n{source} titles: {titles}') + art_count += len(titles) + word_count += count_word(WORD, titles) + + print('\n\n' + WORD, "found {} times in {} articles".format(word_count, art_count)) + print("Process took {:.0f} seconds".format(time.time() - start)) + print('number of threads =', tc, '\n') From 763c52e3af08b27ef299613dfb4791bf56745f58 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Fri, 29 Jun 2018 19:34:41 -0700 Subject: [PATCH 16/19] added lesson 10 activity files --- .../rdrovdahl/lesson10/cPython vs PyPy.pdf | Bin 0 -> 114512 bytes .../lesson10/cPython vs PyPy.rtfd/TXT.rtf | 70 +++++++++++++++ Student/rdrovdahl/lesson10/series.py | 84 ++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 Student/rdrovdahl/lesson10/cPython vs PyPy.pdf create mode 100644 Student/rdrovdahl/lesson10/cPython vs PyPy.rtfd/TXT.rtf create mode 100644 Student/rdrovdahl/lesson10/series.py diff --git a/Student/rdrovdahl/lesson10/cPython vs PyPy.pdf b/Student/rdrovdahl/lesson10/cPython vs PyPy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dfbbcf254f8d24f86bc063deffb4ef6dbfd6f3fb GIT binary patch literal 114512 zcmV(}K+wM>P((&8F)lL-CB)_O4?5av(28Y+-a|L}g=dWMv>eJ_>Vma%Ev{3U~qCz00y?$B~{nKTokWXk)^f zJhkr^nQ5TXm2KT^lr`Ek5H(<>fFeWyRmub@@qzl0G}W{8_xYwf*Hq7p=@2VG@V zIQgFlUmhMF9_}6l`Rgw?yM2C}|NQFqx<79BhvUna-);Wt%P)7E-R8@$H~(St?tlLRYWvN*ufEv) zDnERD`r+@o$@l%=UA1_5w;fG4{hPmkB=%vn_<9hT$amvczx(2)zC7r^AHSJA4f;R) z@qv|Z9{&BeU%X@xqr>k8sY&yP(dAF$R|ELr&tGi*#xL zU8XEl&iz!*fBybG%$GDi{HO5~6DIWXjsey0{&xH@#PP#2^lI_=3uIHjXdQcbH(LDW z&%gQe_<4SEa`7Gwtd8GJ?VN1XS6|*uts87K$D4PP&g}Ec=5%~={rTUIl`#o^9L+w? zum5TO^kFvpb}%`b&owqj^rzW)vNE`xznNm4pXl$uECX46ethixZ~i<;O))Jf1ViL=J#id;kMZ6m2}xS{{by;G0ZhF#qr(Lg(-xwTBdUU z%@A=TFYo4(m~BRC_b6 zTvv1P4e@@Qsx_ti_d^qB_YdR4qu1AuyTpg_oA0KW-+$=-FYkUe`cJF&h837RvPJ(q zg??Lrf5E(b*1p^Z@w3{#WrcRfvKLR&{V#_u&na5XUU_Rnu5+fwG>l(Nfv>uj+xl@d znLFG7X45$%gX+|~`J1QB@a5egGaIihRoTC3^(Nm#p~jbb$S?0cPJNoY+@v=euXp}Q z@o9T~`G*Wo8|OiFurw)79iQICl++ySpQg!P{IA7s&52xO)YfhQbF}lTbJ+76bIA`* z|7$7A%D4FNhhIK;N56jfclX&WUc@B(?O6YV{v76in>J!Lo_sDVdUUI4DMkI$$Jd2{ z&tKh7&c=50tKF&0ZUN3SQ zXYj)m-<eAbr=^+NFoyNac=dT%aw;F@#4Pq@5T0WCF!z)Btyb4nkTk_T zyA3uz%q2SoIDc5N*lPbI+c^<~-duun!1Dt=#VfD$nVX3$`u1Vj1($8DKKC-0#{9@+ z{{4{D9L3~lwi!(S(0V#sj9(1h+pKhNerkMR@;sP&63XHz%!!y(9(u3V|C4PVA6%KE z2fO~SdjZZd&t*03=^Xsz^8NeSe2jYuN=yszXN3E>Bm4dB^>Vn~dUD2hH~h~p ze({S>eeA{j^pEFB-yGxd__{rvu6G}MA*S|oU;h4^kDIUm`2G7IzWKZFH~;mUZ@=BJ zE$yzPOn&&I*<*kFe)GfczuNrb`(OO<`^}$z_w66Q+I&;c5Yp!3S0BFlYAX0&Ca5=g zKV4rBm))f|iWb!5{j1H#AAa}Yhi|_B+s#+se)Zi~-~aG&uvQ#xem6$5+5U2~dquZi z$T|NbGI-g)p0AhlJ%bVLkIdxfXS|mzk!o|jyl%IL)7?zgJbv@_=KIY*`)8Z&8>;&9 zxtXcAX5g^hy&iVA`OTMcl%e+cKSRK4b=meB{>$Y2R=|5;p`H&XSE{qOUNK|nyMOed zvr2EL-C=z5vxd%bO?;z&#G$i(_h$~9o`?R`w;#WHW7L(3{0q&+fhBjk9+>8pq=&iq z)PxU1fVKS9?zdlT{@1nr{MG)qUreL^`CNULQEy%OthTM*pVjtF9lRZ1Z@b%&%o0TY z!&~ZbLFTsk93{>jaJHGdj7w6}@r}*>b-DG1BoLtONOtDSA*mdp#$`--PJ4CSC?N;YhgX;3-KTIm) zcTYq3W{h%vc~01L#h$qvWG4Ng9Hh_2@1A>2%D;RV)35vA|9#AJ3uYCyi~+o53Hiu(c&~D z%jQ}c(I=)x({h`Tm4fZl+ewmaPvc#`wUrRkO{|o+SyioR3bu9Np)-eEQ8a zTBGTH40evX>mfGpF7>O$TKpfg_xrz|0-itoVUYaIIAhqnyO+U2>EE|D&*`2jGS~YY z`5^l+8*j|uuuF3;=J0#Wc5b zyi+fRPEDK{0Do6Bo1xcS5XGFp%BPs7^0`yU_1 zVcuJsHaZSo=e*3>7{9r1`SNbIoGWo^{ZCs~y_%jx@l1EM3C~~7ZoLsMCSx)|ZliY9Lef;eguYZ9N`>YV*t!Vj3Lcc=<>&%uAVSU^<&BIiy zi3|bE-?YN5JkL40`NLE1k5g`QKBiR|A;i?q@ySKqKP*n?6Y0s=GM$StUM%2n<;fil zqcP@md~dQgTMX7l%Q=eq(Yfa5uci>@c*be!I*&P+-7F_<<0G@*0OrS547SmjZKpjR zgLzson|ISyUL2wC$N)b^0{Qp99YUJJSvIQiiTUyItHt&V)}N&^I*&e^cT4TY9K_fq ze_HDG=SI`V%bjnq)X2`_(Km}LOMvLi=Nr_gg?hZa9uAl5ZS$+a#Qj0kyUMBj6f5vq zZU4VaR-7+)JH{g3MXLVv`BHp}yU30mPN(CAO1}GVwblD6Qv9DRna`S?zd)h?|4jET z^L)8YZMxsr{`oY?f1dVoZp6d-yq~sfW$SeqaD%7Cn?F2;BcHZzi&Yz2$28uPt@-J} z%-qsec6m0cZ>>&%-#>MmpTMp9j5>qfI+i$P5L|ii5ApomtEWi%hm}h`sC-&Dk1ZzE zo~M_G=y!?S*S^Z^HAOTfJ45s9$b3A0a*Aqk2WIc#lrD6K?B}RgVO)8abAOwi9`xy< zPPAn|74xa}U}CoT)F)RO;Rrt8YCi2f9OGQK`#6dBn+}Is(~Fqn`^Ea&SPDOu;24e9>+D&z|MVky-9h1#d`u%Z7yIZk2RIk! zATn7PP2ap&(5f~SYBZjL|8IldL}uGXD3h)EyFq91Pv>fwKTL7YWifjF&5--l_`$_! zG5$SAIoX>zm2nedb){qq>FESv@-jX!1v`K9fs|vptMhl0-V-~J`TRxq=0ZB$`O{12 zxg4U*Ow-_brrIW7Q|*@}@m4#y)j%e02)wY4R7Tw3^LH8hw{7 ze^HcGAXEFqT&Mk|rQT_fSw7Tz?-ao7JDN-uW*U69o&3*O@6mUeO$W8XKx@P*r8qTr z4(Ca5b8;q63%SR=ZZ46j@T2Wyb~1;lX)*MOUY6)}^jaIMImzRfljS+J^M|)lWzrtR{7ib&h_DYRGQdhAA@bMk(^# z0;X2ZM(`%9d4V;;q`nw zY>%6RwbR!#$m#WR-JNz5d3nD%5e0HNc0!wP--Hgk*Yjz2TAH1>k$E^CMe2Jm3o^Ka z`e?Q1(&Fv5ze@hcvD52qdptm`zqltOx8G63F*u#T`(;2ALj+@x1A74*q8ONh+MnuE z^>eca&6Rk+-TZs1a{lT!UwwH0)!+Z{$KQSX^5Gk1;CQB_#<6?H_;!2UdcC;FG_Txt z{i|Ppx7+;7zhlaJ(ssA&>-loJ)TE7n$sN3GDGNIvxsN37TF);+P>uJ)V z;E*h4-IkfR{W5PS#&u-z*y_mTw#)8#*qqOY*WLcS+kE({6l7dEf4%K*#~l@SgvPra z6MDgYfJc5jZMcfQqY~)0J2P)g;C9Oo-+{ph)C$|(0_-kM+HLoGyPg7EZYC%z4cP8Wx!zPsQowO2wdUZdwRwow4HwXR$G9F&n2S4T`}+jH)4{Fu~w! z!nS9%0fC;jC1hq`1!0UN#Q&A7Zu>2HM?SYbBBK%(E9O(eIv!fJ8RQMy!6lB{rDh9r zNjGXiV~vpA@pwMBT<$ShATfFF6>&PD_&c`w?J4thcs(AlytcU=GhfHo;}%4@JYq!) zQ7MKKg{a3PY~g0JL4q)@%eLnJb`63&Pt=Fis<_9b#roRalpr!bUM|o&zaDrd0)&OF zPK&^xbINLBUH5$5W70amp4dldcVH3h_7T@{pBY564$Q!(~fFZxz9syjr%A?*M*o${t^@3{M)8(=exExB3q*0G2ifL0- zOWE*dr}*|dP;AARei1fL2nAsQ?D4X8eC2?GfE`|OZIB?%w-;0g5AAi!QO2GNz!Z63 z1Ke(i;XT;ZxjFEw3yf~|JI&Sg1dm7r9zZl5*dt`g=0w#ey(ro^Uv=~7e!g4~=)TR| zVS5A7D(qS2*xZ-HZi^zG^0mERlkwf|m4g+S#0f*=&menBSeadvUGtBRv_p~je}2z0 zKv;zqmSu;;cszyeWsgvHO!HQYeWc793Lp%#c8fix=CEU?_GJ)}@CSDcNmCs#2iIy2>S;8K+ZSz%md26ejQC=L7|aIMC^QHOL2*@ z>?RRXuC+iHSg{*Jsqx-UZnYvUrJD{5GXR8|Fu4kaxez!UuY2YZ;OgdK z6YPlq$B7ytpLfx-M0*^&{HQ0NBj2SskfeiT{qY#J)>sSNfNEjAH z*baLn_=QE=O*&JH38_YI(jqt(jo^WGH?SrJR&$cMl{knKfU@_LU}o3IB7oT_Q08_* zEFfHR`mt_GYuI#MZIdIGyU4;3Tox8eZmn$vx+n6+Fwtt#p2)(}J=B!CU$$h&GHK88 zPOcg$u2?eKp}~Q-X`32?})xAs`$TfXub}Hj!l@4^Wws z?iazj0+4KxR&2Ebul4x?daBn@OZJ?_HM$|93yw@nR>~7uIC_9uwAHUh!qg&KNUsK~ z)ShMJPFn(rNu&|p#z0zU_xnSy|G5IMV58M}*aRHdCe@fl7a0A=yw?}@%Y&o+o+!fCutR9e`FHO4V*~LChCVt zB4?G{!I2su&zl@Wv?q%*V*hqK8FG7=;(K#a7LDkO`z$L7%7u2>wuhyEVu2rbhtQYU!MbEzU^ugNl@y#!v>Z-2z4vY%NzEjq0_r$qS6$_piC zv$9jjl1Zcu(O{+4jL4HBV>zGLgiUl2BTLBzPDa#J8|gQBvJDf>_rQ*~q>R80%#a9r zh9cX_B$#Qnx6-8q-Z+1@BJ)fuHiyb}iJ*x=P}k;@Rp$3tCL;-sJ7~6<#|BWV8lTCQ zRYKo17G}?W=y@gi8#CR<%$x6z9Bjv_0?XoDBQ*U#0Ggn$h)hb=W+XTV8Jxl7Mab97S9p&Jn#6^JKqSwHf=i9?YhIu@4 z)}lz+vWgbT;5)2DkFl$EEJqdrB4f97IVmYgk@6(T0)TIlwe)~UhK#2>yK*rUh&T;G z1?zk?BkV{OqS6_Ry*W2D$k(uiZ}n$IgIaY4?eaBYJrt<^=c@eV5?vk&gV)q&lPo>(igi9H%f zD0VZT%J|6SM=%diQQ|z(^-Zq&+B}f^QtkT0Eu%9hC=!^B;WR&-$Vd)0OI(7rXYu9V0+QE!@x)EohoqAnf9Z;HEman~VCa}eU z@E&bs&NGYMEpdP5=klP2d35gJaNo|6E>2I*T6Hf@ad2>aJx=m#ITrA1)T1c+AZ53SDDXlVE^V-e z)dv4~^t&{5TqM+&R*XrZ*e~KWsLSc0rys2D`rdULgMg-yKTkhg2UP`k&2kwjT}s2~ zhilku4h}Hu;pu!bi1lj{wAa;WHgwSE?uIQW&hd_wINEnMS>S0C;V_gy@CSn+)tWl} zlWe_sa^=9;&&;F!^jzr1K}vNyQWQj7S{@yri+jqPrBzNm^k7*=P74+vG1~+M(-{wx zqXsa-2xUnll8`wQ!>m-dqet2jB9tnjU{Wc2c(^G8>K!; z2vtoR<4Z~BBrTs$EWj#0Cr%7YC)RC7!Z~h@maqW?_w&pQrVSoq+UyQJ1$<2p%zn6a z&643nzDN2flsK1`l4mq*=_Qmp+mXwhhs!sEv=L!RNr`G4Wr=OkO4bx`LgGAuVcx>j z=@d3O+QEehayF4+o2w}_AKeZ{iOaWc|{UrVcY?oAG{X20b~RB-^5%2tkLM%0m}&a?`=rA+A#>XiqGg;p|QkuQ6GW6qQaYG8F?V zjA3BxJd55fXf>Qhmf@5@ZPg++=dHD1ib3Ot<#U*t8XWdg)ei$T z#}{imf}B0mfRbVN933_)th0Qp6@@T`FcXCkOxT1pTe%xjFzF12SueNuoSdkw3=sX? z>1GxYgqUGC!enfV78{FOo6S8T#zx?WQz`{Q_M!IVi!7-=U`Fn?Vv}^u*h)f}mh#^P z+PA38bVykmVIwH^*Vt|AYZgWMd5e+KgaBfE%vB=B*y>xBb5PF@u)r!ef1}IFig$o7?5aJ`LG9fg$Q6e7XO7UAo z1~m0+*!sBWZq4Vj6T4juR4{*zG?Vp-CNh?(QH3NcV176AyW zxdS+>vG^PqrJohUU5pP!>Yrzf2&ph)J95-~i%hY>t(^$sDa8p!VI~R>f?pwz2A=#N zLejE6M$S5Gz(hiol9Gb*$RpVs7pj4-8#&2`1YZe!J6(krN7g${PMp`J5q@@MQrOy& zY$Zud2ADU=`HC43gj^WarnWMC!$R5$4^g(0zj6YSzbc6s!-ggEa>hzzR|s(w3aJry z(EyQ&nZ`1erd>H6ft1;EGYuk#BsM^f&Ljwqjtr30InRFg7&|68UCgI!5vcCNI<|G^ zQ41-NBZcB=!=4~5&SlKEIWO3cJ4{;m`s^^!V%@TpgXpzqfY=>Qqd*=L!6QLz8X^Oy z_U+7~wL0DO@=Zk(O9qZ`V3$<6NVLJELkZG5d1;x{WV{Ow3M6I#!AX;4a&4JWkm_9R-~vyYa%PY z9g_pA}Y7mjODuTii0x|0{vTKcxL3f1v!-AW=Y4n%`+rlhr_ANJMVoK|<3el9Yk z+^VE%I}of&j^&l}O`mx|YCNGeTlE;FH8CWisb5h?TI{bNlZQg?`RZ2EA}Kgiwbc`w zaExu9)F-my>jBFcCpJeksh4!teBH^5v-Xyu5whGf8H@C@Tk7ZF8#vK&r zExiap7^-KWNgL9{q>Nu<<2@u%EEXj&KU=+aNYfU$i_NoXby834=v3V|ZEKB0YMmkK zC@Ps)lK_65TGinh;9Qx=6pQ)9S0Ejpv2s+bT*+~gO0G6l3M@vpv?nbY4-m5HvlZXR zrD2iPCPKohB7LX5^}%v|8*!L5kanQh!g_7GBoPU%@QU3l!zN6Da3yATvOrO58kZ^lK!jM)|C`enb-8N=4RVtScYP$u<#@VMxwB zou&3YSyz^khdRrVeryaTYzuM2(rG>q9q=lVeBuh!IkdD6riBR`^zEx(#~;YBImcvn zKaPe5rb9-?2a7!svzsht&e8{^biCjjHLg4-8G$5Ihf8h9VAD5($uA&1>`DD93&G*n6P^D*LS28-Kb zdOI9>BpT$JgIC)yyUv{X$QD2y#c1D#KAT6d39+<3Bi#(HsvEbGn$0>4Vuv+yOsm)m z`f(;XcA6F??k-+#(JBSwWB}8cei$Sp3Ea*qt6=@P0r)+g(?l0wK3*(xq+aS}&mWwa zXAC&$sGJDN%kIZ@Blr|c;9$;(Q4~_?WRJnP2Vxs89;Ta)wh|V?QC(53sG?)EZeDJFw4r>j`cZgM{jkv2%qE*2=Y+H(piXE^ztmC& z;eJghp^aHUwBp3IzDJ5pu1pH_@Gx%7N)W>gDN(WMjN6ZRt!Nok7vip1t*ToNVF9>a zl&PZ|#-Lb7`HJ`v1DS3dnz51ixm00D$iQfPPM1W?B3)bI5)>t@0xFk&9Xam1BV0OMS4a|R! z##qi)l({s*?VV5}JE*ea)>tf3d~(~gXkq?JoMeJrW~|ACG*F@vu$0piM<}sPy1UYZ z87mRwd^CvLo}XuI^)YTVWwnA~i%OX6)HM`t2)WAnn5oE+HX{^Dj#4JsgUuiNcQ|lS z6dijo22KEzDc1m&lLo=jt6rQ_DmYA#m-uXyyX|RY0cFuK_?M8?tNk@!2@u1xBkc0~ z*`;k|Oc+YpNu=F%b+j_=U^l$KBA$a15jLVmoYWv*jjGQP9u}J?&J{x(F%<)-y}~4x zVowWg@_j=n*cY5*sN=HK@F+A$BTkeXz=#%N-B5jwym@~vWd#yXL9A?&WMaHr0izl; z{jj*DC=@?1KYoqVR7GGyLj`B6V3+~uT}>$SV{nliDWIAtmQV3?A;w6*Y$JT0GUH}@ z7!?>`wexGL?0;jkA=RBAC6 zZo^ZZhtFr_vney33DQOx+yf*b^)ia$Hl()-!qIXqdh-6nC!dg$Nr5ae_dy#`C#wut z&}w?RB`cM9fx zcH@&P9tlwA@Rd?m!M=&Jmvr$XX8g-HA;owQ9|eHc)gS z_JO1;-Uk4ADC`oXP|DOMs!>^acygY{xE3CuZ<#=RNRAQ00&Ak=nTk)x!q(vYksZ-^ z>6sXoJ|QLDOO*=Ye&lq^S=UfSy0w`Tk64=E4D|h92Xc=|3(aF&jXz9)UIqeBsx|=P zrLul+35wI(Qgn9lngzDkay^OF%i7`rs*5-<=4Z=9++)Q84)DJzwTW+N;q0WF9c;cjI$rlxSw=nDas=nF%O8 zXK5-0kocO&y|xaPjH=>-X+r`bjv#|kW!{rc2`Iy5(z%%tGH;nOy4APCen%R?5DfU#Bf-F(i_P(su?vZ$bBSwQt;$=B!Np4$p@Ae*?3^LV*YyY)Zxmq~>uoYgV`V4I@WmG?)P~zOJX?v%m zKF7Xa7<%p8acWVunx6i)A?2B@8VFn5rOhp8>RKDzXYX#LQHg-HXMNRGe}zRs1lVF>QkR1t5^fhL9VurUuO!e*Y#s~BK0JU zZg5N%h))?whr3rAWDF1Q0~Nwr>u$_JD4}S@60UxYmipD|MlL~yaLlQIOF#T7`4z*D zFUyLrUuR4t-ph%?({xs7QyD1?GCQV%3*_glE=Ym`#M8szt%j?|=&FfDV~!3A$-=VFvPMx0fT(wToB9|hW8I6|mhMHBtaC{#D_N`CKsezG zLLlYN;uek6-k`mtvFnhZ@m__aQj`T zX3i=giQt7RF^*@oS2&_NPC>ZwpM(X8Cpf4#J97 zPPpb8f20Y9Z==@XnqqT7aMW(`1LCZjgd;Ig1=0FHeFn~UTyHUfC03;sSsxby`tPwR z0A7eJ0a$^9{|Uybsn2nGj1WM$x9V!q$v0y_wh80Vh?Tpt*)gK6Nan-pP7cHRZVy0s*94v1CDKGv~4AiGwBVGcgsLJ zH7-)-vJ>b<%KAb3b&}myDwp9w`~d+(>eo>8O4o}SO_KQUlztEoC|Hh__!nV0+K;7O z#{+34bqq-zA&AJgb}P0b023EdeHtOA9F$2ZrJVpd<^cbfOZ2)rfb#<^Kl;u^2KRuO>)zl^vAHB5{LW#_C zB)hpvP13i%X9oxHIBIB8)2 z`nV0GEBnDPJFRdgT>$#j&PKZK%h?`CSFwX-Qxj1qmlHw|535D`98si10#=8OKslQL z=<`UBtqTyO4lPk~kFL>?x!%6EhAm$-hu%an<^nd^OTlMqERu@`3^Lc)^v^r5CD< zz|7?}#2gA_64D531du!V)ug<)M@-Im$&*cDP^TT$X~woJOm1JNC}o8ZV3~$RVoR&S zLTmOU_BC6&qK^LN@OR;%5ot|c3kxkWRRrU3F?*sCDV+mp>JwS<^?-%e#O8=5b!D1S zPaYZ>d|^H!L!5~hIpz7x0&o)iH}?rq1jNow!;;J+R#GMzg|2ryDB+(awWgGFIJ6+E z(actjNo!)JIJxt!l$$!Ac5hhNDxk*FoE9V@)_pw_IJ)@}3VcZ`hcZnHf$tShkC>z; zHb+y$q1BREF?A;^5(_PtOfF*~!B8^i3D(jf790DLl=`YBt;9;6VkH-zDnNlpyF7eb zx*a3Hy!jL^2((t?DQp>|v?himIA;K12Po%~E+*A7AxDbdC^bCm+p!($1?39hZ! zZd+wP$5zJn`)@+6GPhm=v_sHxYJmy6JWv-5NwpCBi0NF1Jfvk!);uNg%RmAdCicRLTepYrN?zf}&NG zghz;B6U?s=GV*SN=BnOlpIL*Q}Ux+vvZXZ zI*^Rf@!@$IPIiho(<3W5o}TL23bk^Wc-b+uB3>Tmd;FMsZT?FZMqY@OPJr~*b0t-oB6ijfrN~Uil^OQ}wT6qBO@yy_Mh(DJBuXb~&zX&10ZT;&Syvw1 zadaRt#^i&jIqEhB18_;$x7QD_6-OB;FJ;GMjvOXG_+ALLImE#xDn4vM`N(TCsr47~ zLYL3SV0)?&mmHwO%Qm}|%qw0NAMe8WNKW42bq>V#JjqFJpyq&?CZy*PAdb{!oB8s} z5B+%3h6@a(hAcYbUjD2NPZg9BP%?n4%0oD$7d0O$p^mg;7o{P**0(m&5inz&EUdQ#h9x^#97~wIvqNU=oTBsi5E`9Qa}X9G9I#&ZB~2txz=Z$lqeb}Z ze$QYKTE44F<%V2&bHX!W)+<|{^NTw0V3flnp~Cw2dpL?XoIHudHG|aEfN)2aerBFL z^#b5ttqTZEV-4!PfT1NYMHcU1(oO`$XFknr@+%}~x|=MO{g@CU4O$sQqVK*6#WIx= ziFvF~5S#-A%*e}4_61gsiqs93py@oHUropc;9*M;yjj`whyi~69HTpC*Fd*&bPIB^ zw9HnRLLw9&@hSU|U^7YvMkNJI@k7!cw#p+D{MYh@ys<_0vYL4P*T+x!i1)1Qbus7> zL2sF1kaHdY0U>|Px&vW9icpjfw@nJe7D5TBQeYK?7?JTR)iQ&y7KMI5d}$8_i5CWK z(=R9}ugp6EFy`|;17Y-hz?VOeQMXz!DOFD}R4o~ark!N~v&egX-^L=+8e9%cS_buI z>ISAPv9)efgL)$i56)e+S}2leFl?a#Uam@-Z>6COa zSg4#IVAZ&yY_-Pl^pr5qhAr(tSm$PwBV)?+)=0@Xv}UW8d&#(ay3#d(lR8B60@=bt zBX@j_RwZMWTH7RzlafO5D%rPz)GOiJ^phBHrDIGX{kWKT26IF6%JlI8A z)tLhp)1s^Z7O^U3B$p*>qcuj@q#(!u7pb&U%sjkYHUVc5d$S;Ss@$!5h$ZI65Jbw@ zCv`~Vios-|ftvi{sv%$2L<*@_8r>9>cZDM2P+pLQrzZ?j3x@XAXa;e9)gyk8OE0hN z6OkY48iBIGNBc45u5h~f2Ncr83tT;zJFG=a>Sk#dfpQQPYe6QitOXCt=_4$|Vet1@ zi@4e$;ynAIh@l>9fe~&_!-LWjX}-$G6LW`>d-XzF;gg1ipdLjjDU&qvD9bkN#?>a8 zCz3bJp;K!YBrB=cvo){Tw{zLeVZ}1oDwnuG%F2RFo5oJ%4b|8$R5RbxUPFo4$2-F6 zMyjlXw4)-HgBx1mfon0@s;mLERjzD{pbYY)moT;-+9-67dE9;3OcDYKq*7fS@qMW@ z(Z^+U>}wo;RIFMj^dN9s7JywJF4;4=cjp%E^ss5$&xD`3I5F-3g5V_(2ZyIhPlIr_ z+-+Rh_R|yfh|zwyfFL+#aZLd%5y@NYwl30WgWWKooL>wUWGaVmHC|3)957qF#|QSy z6ZrJ=Fe;UoU}U052YNQ-JHxi3n2zt^-f%iz2)7HuCQcAXF+F+y%>`e4WH9Bd;ZEuB zptTqY3I1+ldF8QwhCs&Z6Ox zHzA11-=&B@sPX1=c+A|xkOfYPtcujDX17pwW=}jb$M+@|CrbpQb>&$P zo%@oiD;g2ImA4}eMnPaco<5~G8bwaCJmBMV#sePXieW+-i+>%#`V0}G7Y@yNjgqS! z)sOE+H;q1Y?QF$6>rgjBNfJ{81p_g$mepw#z}s7VFVPMp(l73p7j&&rYlIIQH(A{i zq@RH_y2{~es8dp!2#if5tvJs?V#aCpPXbQ{hc}CJn`OpOl4>yAOFqMxQVlgEq)s$q zqaw1px!~iABNIMAXvwf!MjnDB0JYLb4q2v20`Mb;q^@!>?*OSVRESk8vNUB}IEHj8 zog`#ryo(=dAzrZLgs={0Yv3}yRi^2>Pkikq21Z0bqi|m7qMw2{%rsKZ-CGe00S)Jw za9wi{9=x?5%QZLXgIU;G2e+94TKV39*#n<>)xdU6R9{`~%5D78=sLLyV)71Q<_N&iDf?`l!K&X_Ep_TnlRovZNi31w?lEdBwa0N> zL*6Aw`T)nNKFC#Y=5s+hmFj?JtHS!6pnGc0)Z~S_YGZ)0@X*L|N<)>H5PfS9bj^hnmr;xRgoQUsBx^hFcB%;Ou3GBO85Nlb+nsM9OX~p( zt%;G)$s24;e^Y0tww`LmLnC*56&6}nH0Z%%2)ZY>Fv0#LK7bWh50Dc%pgEdJd5-vP zS)~d+^2^CQ66IYwmLn2n(brf~C@+8?+9JM#Os-q5lD(eqC0*gdBuxS(BIIPrK*|8) zeqb4E={#c6q8_KV0d{ojjzq{s#60I+#H=`MTLed*WF*}4D1^ccRylvpOPyu}tmCPq z@&LEH4wnnibdlOv%$OzV@{CCfUAJW40eL}J{jO&$6pdL~=lxDFHSPH4azG=^qHSu| z1c>6X{PRd&B+Nls^}54yM1u{(x`vV^TalA~oeXhM?oc>8NLrd;03#ks_fQDodu#C& zL2~tomt|Daq}*F3v4ma%RBr6nxta2ag%mbEB$RJ0afBbcp^ujW7{rvfZ1p<1dYvb( zAF1lZ?9Riu0L8bm&S}Fq{a5 zj;~>fmeYsBT%#lRt3ojk{0X|WNy9`2#;>^0|=TDP%zXji(=- z7rZ?G5TLBRbyyrr&^J1}*y8RG7I*jH?(P!Y-903@yK9ie-Q6Wf0zrb4;3PzVAOS+c z-Q=8;_kF&*a#dAa#{G|o4)=u2KSe)RH#xos<6<&B!^l166Bw;OXT|+q2URy=@@&=jmToNV z(@X2$HjVKq_k%%NSXX`UMfnhf`$kWz6l0~naqnqDDvg-9i&Hg}`1+M>coCRieQdqwHg&W6#O` z#}$D`$dMPuo#Cl8yL#697`bs(diMc~@-7i`1?f}y&z}x#-cfY@I9RY4A5I36T7twA z+iVxQAw39;a}G>Bh}_ByPt2#*e=O0!>f-SP=k6cXMR+x8S}Caa1JP7ST6bDx=F2^n z%<#?~n9XOa3lQbkFB`YRv6q}tRpLL{ckmgSS+JVW4e0s-OQDnF?BT=ASO_F%tVO^( z!q95-G8!fDmt)E|K~fW(`FUGNn5HBizEi?&iqjf4Lryhfm?jL+dgXZ6$3ELKLd2aS z$Yuylj(zJ-Q}}@giAJ~u|C}=-9%qMH=ykp&9)!V+I`DJ+lZH?j%JL)L&~zA~Uh5Tq zx;VygEX6!~re^%zquhD6HSF(^q~(M^?9MZJEV~>Z9A8WI%<`4qsi%1i=lvj~S^pp< zG;cr$%^qHl&X{BKXz8}KQo;%I_@dgmPIK?Ad`%mq?>)tnYCgN8s^G_({N0I3R7i^= z)!v1Up6>D@<#l(GOak#>uO1OhQQgt?a0M8S)WiS9b3SG2af?SQM_Z;u!ECJeRG>!t zq1N=|sdJ9?`_Cq9bW$D~A1b=4TCNmxUn${SOGJT3x3TSjl+B?+>I_+-17L~8p9z>! z7ueyaD0m}nwAg8`iNDX_27O4ZND>M%@Q7wiCW}P4kaqe3lnPbg;Mq*z=0itujA#5c%o87% zK+zNE}^2x3urBTHcZzAqIR?)=DaAOl*Icj9hMOZ{PPc9*wHq}k<#x}~%mY#(l|eM_NxAF!nN-apuzLJT}+E>X*P8o;zG9dkkNI+GPsGo$wgEPibR=(-sdvNtJ|6pW#Ei(27Ot z*lzkYsUv0==S0#X8Hq05Fl(2qqfaIK(6z!MbF)~7*HK=e)JW7{C1&~5(C8x@?)A=( z?FhNW=;JuL~F zu#Vfy!!tvrSYz9HA9 z<|8x@v|@?<^CS3IqQmd4YFrA@q7{U*mm*Tv7oiozHRl)Bvgrfer_G)CYZSf&E0``> zkFl{4p!=C&QM#t=2YV*P?E4hb%&hOvU!yob;4DzJnwK4?9~T~@DLYJDkZXn7d@(en zyMolsR#v8Hzu549{_Qx^C6h%t7XR9(OZRDlX2>+%c;VZ3O~=Kq>O(X%$khGw$5Szc z`#-OdTzkE+j0<{XZa$Pwd^6nWu^)e?kr6p_5EV680ygnV4cs~VoJxo7O^ zn)XT|9Jr)r6yO^bAVlacVkuG#PLEr$#ZM#=geh(alklsATC!Lo0e$7)7=V7gCUn=(z;IxRLcBRi`u#+WRdA| zf}W<^GZ`O6e9W@9`$@L0V5_vH;gxhs9^I~5KdV-eWseb9v56?XTwG0$a=!81t4XYG z_?f3qH#7f8oN=L-Xa@9H?s3XD{cRMq;XxngJd!DoQjO(aW^dzy+ ze^xazp*V?868)%EeYyXzY|ev?=&fm$qyB^wg6!6PGyY~Sj2pL9Q#xXqo*@BmC>*w2 zZ8N6R*h71f2}5akqjT}}I3GxIankqeMx8;awZMhwbAp^RMkULtQRS+1- znBD`?meMdE)jhJ2w`NGk3>WBeDimO|CQivEnsAF?498xHXMUsXLSpZ{D67aROH=JY znGjat5tCa~Xn(ao@4P@U{;9)HrXpTt1%r`zWGd(!Au0BR61@)=XACOrfmzf@GvBt| zx2C%43f4+~TSb?GIK08SyR8Dj#v&m5&PSFq@g?Ph^1G6lIXWDw7~3~LnE8e7Uoi19 z945t_Xt9ubJU4D3U_lZL})Tq^UYDi-b{jxf&fUriv5O&Wc%{M zgJA<9I|R7_vYr)Yna@oRi4&v;!rga|*XHYu@M%z4b3V(*9m;w&4Hw$nd*HlRs|#UN zcfdsIJEUliX=aU1#kN5#g_a>JJoR~9R3L>||8UG8i$^3VS1h>)dA?(!IE_!DpY0Ol zb&L^KI`|3)B2w$cb93z`2!R!erc5fztj*_Y`BNs|SBLP_!WbmKJuiVA^EqKt9UUI2 z7LT5uruj64=GK+XiG22YzIekJ`9%RyE2OM)1&Fi!rKR0=5_c`fqNkv2rQ67eME|0` zOIOQdFXB_FTR#1C3&X8Fnpp|##c8D~IbZofoMo+yd2_1~Nz>=n_A;LZ)CrQ5-T-x~ zPo@6oSWlSRXUM&aO>k<7u0+QmsW~w3spCgT1&`bg)~R|)TaF=-JQ$3~ppp@ZzK={hA#X4*rQ#kXrj-z-KOcqaP)@c5c)z8BVSo0`Tq?u9`sq(e z_C~&*DGv8>;4fq6%FVd5)?hUZf3?hISyR=gLgw(90IbH_8FH!Q0J^VBC{|ZK%H--4 zlk~9up`#gl;z^jk%kFs8WRx4a$P@3Dt6(-ZWLern*wWo0J4^e$;+JuKF~? zY7|yf9hBV@pH1I38THRb#u&NEw@$Pe{`|S?wJqr$-(}HmFWMEmYiLEXJS^*;lc{;@ zX~uQcvB(SRdlQg0_@+M#0^#7@y63IKfIvF}AkohMS_W!(6JJh5aYV zV429MqaLtjMIa?u$uUmd`^($TVtGK96>HiCZS08&ODV6G(9g9~9T19Ry!;HMrO8wt zF9|tw|IVrBGY!uZhYzU{x&oAu3wjb5K3J5)sd+zh#ecuckHAGyeO_cujFV1yc+vXW zD>PrDjy%Uct_GZ2fdN-bHXCYPL(pdZmYX*8&xWOTSnO53-FNG zjf~rA+%yZZM)B!zMsK8<4!E!Ov5*xKh6ZKNUz5+nd7ME_-MBBPpTm3G=|}|f;0z8@0$BDu2hT8p2B}nnxIAWAaA!#U3I;C7u{yG<|)MJux$n|9J(UO4n&+2ktpY{>$<>PLp zIpbI%PS^L@jR{ zwHs@A)%1)k<}fS=Pqwq@j4`BVpobl#rBb?UuPlpN(OaqJ&5kT`9g~xK&tiZA<+elx zVN6d5hJA9S>ehQ-Dvytkb<*PFaE@ga>6OI3jPvgfCqS-|eHHmZ61#eQba|Q2dP;eG zP1bm%vP#_pDXOKpT7-o%XdE_C#eStzb|ZK~%k9;GtEN<}8%&^@)cih_dQPQMTA1rG zqVk8bq+x? z&QasuKAi^s=~dMCBP>dvOPFz}iZ$-u*YI8to2>oAnTXWcTkZHH4_ptEEdFJMZ=#CY zI+83Y)KGjMT<~Q%bh^h+fM;C^A*UgDSXw2i3qdtafFtQ8FKdq`i_s@$7|zX&HFk&x zCci?HHFnN(&AB6%n@Ct~BjHD_U$Y^T5t(?syXJARFaiSLohc^6<~uOv zZS4n^fRIN_E#8^1?#ilH+u9vp6j?~ijm5s_wtKAZ!xrWQ70X%((DXIT-89EP!$;|n zbN^bore$FME^9BWKrR=Du$fK}=fsb_+Suw7OVTBP{}4-Puw_(J43Y6y7*H3DL{0vL zf>+U-L&&PbT@vW&?z+@TIIq@|`zF0aE#!NPk70dpTvj5vH%uLqNW#4x%0xqqi71Zy z@{29EES(++tTzjm8+Oxzprd`T@^c4jHY{e)rsZu+)0m90Arae4)A&`-_N9e0)VULx zp@F+340By}HUDmNaqo)c3SltXzETPUrwNT30m@epaM}>brY}RlO6@PA??QM#tt-Gq z^eA+1KsJJHEbbtpBNLyI`tWNFP~^?-r}bhgp0kCQx~8A#J5B8dk7U{_V%O+JA>U-< zpR*T?b1d^*1QibEL~$!KQA>7MX4=`wG;_SZ0WIC5A6K2BA!dyytwwzxi=zhTBDbOI)T@Si=Y2-YdS%R?|&T_sNFF{-W z){|_T^@BoQFtv?^6I*$6mj1HO+m$_;!`*m`PWgx?_;k@{(;G5z-|mg8*yaxqU|-Ff zr@w25vxi$#D*KANOJK{s75yP6xTw(wT+!vZWPMW$R32%8@NT9Fin}C5-x2&cpGADz zE-mQ9y02eSCm(tHJ-A&tt(Jrn)#jIn-J}bBuGDDFi{_-DcR$m42~~u!>60szPfQK< zv_CjoDR1Bur`+yWvU7M5{fUmA~WU _9HrFrEP_7TnAwmudZa@x^@M`)7W=hXCq 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 TfHN@AU8csyT&k+B{%%|V=Diij literal 0 HcmV?d00001 diff --git a/Student/rdrovdahl/lesson10/cPython vs PyPy.rtfd/TXT.rtf b/Student/rdrovdahl/lesson10/cPython vs PyPy.rtfd/TXT.rtf new file mode 100644 index 0000000..ec7e32f --- /dev/null +++ b/Student/rdrovdahl/lesson10/cPython vs PyPy.rtfd/TXT.rtf @@ -0,0 +1,70 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf400 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Tahoma;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}} +\margl1440\margr1440\vieww12600\viewh7800\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\b\fs24 \cf0 Lesson10 performance tuning activity\ + +\b0 \ + +\b PyPy vs cPython +\b0 \ +\ +According to the PyPy documentation, PyPy has several advantages over cPython including:\ +\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 +\ls1\ilvl0\cf0 {\listtext \uc0\u8226 }Increased speed\ +{\listtext \uc0\u8226 }Less memory usage\ +{\listtext \uc0\u8226 }cPython compatibility\ +{\listtext \uc0\u8226 }Stackless mode support for micro-threads\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\ +Due to the stated advantages of using PyPy over cPython for heavy computational work, I will explore PyPy vs. cPython on some of our earlier code and document the performance differences. In particular, I\'92ll be comparing the two interpreters while running a double recursive function to compute a value in the Fibonacci series.\ +\ +The code is as follows:\ +\ + +\f1 def fibonacci(n):\ + '''\ + This function will return the 'n'th value in the fibonacci series.\ + The starting elements in the series are 0, 1.\ + '''\ + if n == 0:\ + return 0\ + if n == 1:\ + return 1\ + else:\ + return fibonacci(n-1) + fibonacci(n-2) +\f0 \ +\ +The time will be measured using the GNU Time module from the command line. To make things interesting, I\'92ll be computing the series to the 50th value. Tests were ran on a 2017 MacBook Pro. While the function was running, a single processor thread was observed consistently between 99-100% confirming that this function is making heavy use of the processor to compute the value(s).\ +\ +PyPy did indeed show a marked improvement on this heavy computational program. Here are the results:\ +\ + +\b cPython +\b0 :\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 {{\NeXTGraphic Pasted Graphic 2.tiff \width12200 \height2620 \appleattachmentpadding0 \appleembedtype0 \appleaqc +}}\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\ + +\b PyPy +\b0 :\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 {{\NeXTGraphic Pasted Graphic 1.tiff \width11220 \height1720 \appleattachmentpadding0 \appleembedtype0 \appleaqc +}}\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +As you can see, there is a dramatic difference between the two. PyPy was 28 times faster than cPython for this particular function.\ +\ +There are some drawbacks to using PyPy having to do with Python extension support but they claim to work with most libraries. Based on the results of this testing, it would be worth giving PyPy a look anytime heavy computational work is occurring.\ +} \ No newline at end of file diff --git a/Student/rdrovdahl/lesson10/series.py b/Student/rdrovdahl/lesson10/series.py new file mode 100644 index 0000000..bde0b11 --- /dev/null +++ b/Student/rdrovdahl/lesson10/series.py @@ -0,0 +1,84 @@ +#! /usr/local/bin/python3 + + +def fibonacci(n): + ''' + This function will return the 'n'th value in the fibonacci series. + The starting elements in the series are 0, 1. + ''' + if n == 0: + return 0 + if n == 1: + return 1 + else: + return fibonacci(n-1) + fibonacci(n-2) + + +def lucas(n): + ''' + This function returns the 'n'th value in the lucas series + The starting elements in the series are 2, 1. + ''' + if n == 0: + return 2 + if n == 1: + return 1 + else: + return lucas(n-1) + lucas(n-2) + + +def sum_series(n, a=0, b=1): + ''' + This function returns the 'n'th value in a fibonacci type sequence that can + have customizable values for the first two series positions. + By default, the starting elements in the series are 0, 1. + By supplying the optional arguments to the function, the first two values + can be defined as desired. + ''' + if n == 0: + return a + if n == 1: + return b + else: + return sum_series(n-1, a, b) + sum_series(n-2, a, b) + + +# There are 3 variables that are used as the functions are called which can be +# modified as desired. +# 'x' is the series element that the function will return the value for +# 'a' = value of the first element in the series for the sum_series function +# 'b' = value of the second element in the series for the sum_series function + +x = 50 +a = 0 +b = 1 + +print('Function: fibonacci\nSeries Element:', x, '\nValue:', fibonacci(x), '\n') +# print('Function: lucas\nSeries Element:', x, '\nValue:', lucas(x), '\n') +# print('Function: sum_series\nSeries Element:', x, '\nFirst Two Values:', a, b, '\nValue:', sum_series(x), '\n') + + +# All assertion testing will be accomplished by comparig the 10th element of +# the series functions. +# +# The first assertion test shows that the fibronacci function is returning +# correct values. The 10th element of a fibronacci series = 55. If the +# fibonacci fucntion is returning anything other than 55, an Assertion error +# will be generaged below. +# assert (fibonacci(10) == 55) + +# The second assertion test shows that the lucas function is returning +# correct values. The 10th element of a lucas series = 123. If the +# lucas fucntion is returning anything other than 123, an Assertion error +# will be generaged below. +# assert (lucas(10) == 123) + +# The third assertion tests shows that the sum_series function is returning +# correct values. The 10th element of a sum_series series with default values +# for the first two elements (0, 1) = 55 which matches the fibronacci function. +# If we set the optional arguments for the first to elements to '1,2', we'll +# match the output of the lucas function which is 123. +# If the sum_series fucntion is returning anything other than the expected +# results, an Assertion error will be generaged below. +# assert (sum_series(10) == 55) +# assert (sum_series(10, 2, 1) == 123 == lucas(10)) From 978103dccd0242f6af80e159fdb4c226b86d90e3 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Tue, 10 Jul 2018 13:12:59 -0700 Subject: [PATCH 17/19] adding lesson 08 activity --- Student/rdrovdahl/lesson08/no_sql/nosql | 1 + 1 file changed, 1 insertion(+) create mode 160000 Student/rdrovdahl/lesson08/no_sql/nosql diff --git a/Student/rdrovdahl/lesson08/no_sql/nosql b/Student/rdrovdahl/lesson08/no_sql/nosql new file mode 160000 index 0000000..47bcf7f --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/nosql @@ -0,0 +1 @@ +Subproject commit 47bcf7f208f28533b037fb6207fbdf58f9fb8c35 From 6b6102bd15fce4c4965a2f791a95b3d637798470 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Tue, 10 Jul 2018 13:18:21 -0700 Subject: [PATCH 18/19] adding lesson08 activity --- Student/rdrovdahl/lesson08/no_sql/.gitignore | 116 ++++++++++++++++++ Student/rdrovdahl/lesson08/no_sql/README.md | 8 ++ Student/rdrovdahl/lesson08/no_sql/config.ini | 13 ++ .../lesson08/no_sql/config.ini.sample | 13 ++ .../rdrovdahl/lesson08/no_sql/src/__init__.py | 0 .../lesson08/no_sql/src/learn_data.py | 69 +++++++++++ .../lesson08/no_sql/src/learnnosql.py | 39 ++++++ .../lesson08/no_sql/src/login_database.py | 90 ++++++++++++++ .../lesson08/no_sql/src/mongodb_script.py | 102 +++++++++++++++ .../lesson08/no_sql/src/neo4j_script.py | 97 +++++++++++++++ .../lesson08/no_sql/src/redis_script.py | 58 +++++++++ .../lesson08/no_sql/src/simple_script.py | 113 +++++++++++++++++ .../lesson08/no_sql/src/utilities.py | 43 +++++++ 13 files changed, 761 insertions(+) create mode 100644 Student/rdrovdahl/lesson08/no_sql/.gitignore create mode 100644 Student/rdrovdahl/lesson08/no_sql/README.md create mode 100644 Student/rdrovdahl/lesson08/no_sql/config.ini create mode 100644 Student/rdrovdahl/lesson08/no_sql/config.ini.sample create mode 100644 Student/rdrovdahl/lesson08/no_sql/src/__init__.py create mode 100644 Student/rdrovdahl/lesson08/no_sql/src/learn_data.py create mode 100644 Student/rdrovdahl/lesson08/no_sql/src/learnnosql.py create mode 100644 Student/rdrovdahl/lesson08/no_sql/src/login_database.py create mode 100644 Student/rdrovdahl/lesson08/no_sql/src/mongodb_script.py create mode 100644 Student/rdrovdahl/lesson08/no_sql/src/neo4j_script.py create mode 100644 Student/rdrovdahl/lesson08/no_sql/src/redis_script.py create mode 100644 Student/rdrovdahl/lesson08/no_sql/src/simple_script.py create mode 100644 Student/rdrovdahl/lesson08/no_sql/src/utilities.py diff --git a/Student/rdrovdahl/lesson08/no_sql/.gitignore b/Student/rdrovdahl/lesson08/no_sql/.gitignore new file mode 100644 index 0000000..3e3b980 --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/.gitignore @@ -0,0 +1,116 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +.DS_Store + +#secrets +.config/ + +prof/ +.pytest_cache/ +.idea/ + +test_results/ +logs/ + +data/ + diff --git a/Student/rdrovdahl/lesson08/no_sql/README.md b/Student/rdrovdahl/lesson08/no_sql/README.md new file mode 100644 index 0000000..3068ecc --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/README.md @@ -0,0 +1,8 @@ + +[On GitLab now (no more updates here)](https://gitlab.com/uw-pyclass/nosql) + +# nosql + +python certificate nosql example + +All of the Python code is in the src directory. diff --git a/Student/rdrovdahl/lesson08/no_sql/config.ini b/Student/rdrovdahl/lesson08/no_sql/config.ini new file mode 100644 index 0000000..dd8cde7 --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/config.ini @@ -0,0 +1,13 @@ +[mongodb_cloud] +user = admin +pw = mongodbpass +connection = mongodb://{user}:{pw}@cluster0-shard-00-00-rdssm.mongodb.net:27017,cluster0-shard-00-01-rdssm.mongodb.net:27017,cluster0-shard-00-02-rdssm.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true + +[redis_cloud] +host = redis-19008.c1.us-west-2-2.ec2.cloud.redislabs.com +port = 19008 +pw = GPazOwRDLCP7dKDoAWpiIL0rcdedhx6I + +[neo4j_cloud] +user = admin +pw = b.aVcDmambd2Z1.lcIBrO9nMpx7Mmxp diff --git a/Student/rdrovdahl/lesson08/no_sql/config.ini.sample b/Student/rdrovdahl/lesson08/no_sql/config.ini.sample new file mode 100644 index 0000000..b069126 --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/config.ini.sample @@ -0,0 +1,13 @@ +[mongodb_cloud] +user = xxxxxxx +pw = xxxxxxxx +connection = + +[redis_cloud] +host = redis-xxxxx.c9.us-east-1-2.ec2.cloud.redislabs.com +port = 18815 +pw = xxxxxxxx + +[neo4j_cloud] +user = xxxx +pw = xxxxxxxxxxxxx diff --git a/Student/rdrovdahl/lesson08/no_sql/src/__init__.py b/Student/rdrovdahl/lesson08/no_sql/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Student/rdrovdahl/lesson08/no_sql/src/learn_data.py b/Student/rdrovdahl/lesson08/no_sql/src/learn_data.py new file mode 100644 index 0000000..b2d37f3 --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/src/learn_data.py @@ -0,0 +1,69 @@ +""" + Data for database demonstrations +""" + + +def get_furniture_data(): + """ + demonstration data + """ + + furniture_data = [ + { + 'product_type': 'couch', + 'product_color': 'red', + 'description': 'Leather low back', + 'monthly_rental_cost': 12.99, + 'in_stock_quantity': 10 + }, + { + 'product_type': 'couch', + 'product_color': 'blue', + 'description': 'Cloth high back', + 'monthly_rental_cost': 9.99, + 'in_stock_quantity': 3 + }, + { + 'product_type': 'coffee table', + 'product_color': 'white', + 'description': 'Plastic', + 'monthly_rental_cost': 2.50, + 'in_stock_quantity': 25 + }, + { + 'product_type': 'couch', + 'product_color': 'red', + 'description': 'Leather high back', + 'monthly_rental_cost': 15.99, + 'in_stock_quantity': 17 + }, + { + 'product_type': 'recliner', + 'product_color': 'blue', + 'description': 'Leather high back', + 'monthly_rental_cost': 19.99, + 'in_stock_quantity': 6 + }, + { + 'product_type': 'chair', + 'product_color': 'black', + 'description': 'Plastic', + 'monthly_rental_cost': 1.00, + 'in_stock_quantity': 45 + }, + { + 'product_type': 'bunk bed', + 'product_color': 'white', + 'description': 'Boys twin size bunk bed', + 'monthly_rental_cost': 5.00, + 'in_stock_quantity': 25 + }, + { + 'product_type': 'rocking chair', + 'product_color': 'red', + 'description': 'Grandmas favorite!', + 'monthly_rental_cost': 2.50, + 'in_stock_quantity': 19 + } + ] + return furniture_data diff --git a/Student/rdrovdahl/lesson08/no_sql/src/learnnosql.py b/Student/rdrovdahl/lesson08/no_sql/src/learnnosql.py new file mode 100644 index 0000000..2cbaa5b --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/src/learnnosql.py @@ -0,0 +1,39 @@ +""" + +Integrated example for nosql databases + +""" + +import learn_data +import mongodb_script +import redis_script +import neo4j_script +import simple_script +import utilities + + +def showoff_databases(): + """ + Here we illustrate basic interaction with nosql databases + """ + + log = utilities.configure_logger('default', '../logs/nosql_dev.log') + + log.info("Mongodb example to use data from Furniture module, so get it") + furniture = learn_data.get_furniture_data() + + mongodb_script.run_example(furniture) + + log.info("Other databases use data embedded in the modules") + + redis_script.run_example() + neo4j_script.run_example() + simple_script.run_example(furniture) + + +if __name__ == '__main__': + """ + orchestrate nosql examples + """ + + showoff_databases() diff --git a/Student/rdrovdahl/lesson08/no_sql/src/login_database.py b/Student/rdrovdahl/lesson08/no_sql/src/login_database.py new file mode 100644 index 0000000..88694ad --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/src/login_database.py @@ -0,0 +1,90 @@ +""" + module that will login to the various demonstration databases consistently +""" + +import configparser +from pathlib import Path +import pymongo +import redis +from neo4j.v1 import GraphDatabase, basic_auth + +import utilities + +log = utilities.configure_logger('default', '../logs/login_databases_dev.log') +config_file = Path(__file__).parent.parent / '.config/config.ini' +config = configparser.ConfigParser() + + +def login_mongodb_cloud(): + """ + connect to mongodb and login + """ + + log.info('Here is where we use the connect to mongodb.') + log.info('Note use of f string to embed the user & password (from the tuple).') + try: + config.read(config_file) + user = config["mongodb_cloud"]["user"] + pw = config["mongodb_cloud"]["pw"] + connection = config["mongodb_cloud"]["connection"] + + except Exception as e: + print(f'error: {e}') + + + # client = pymongo.MongoClient(f'mongodb://{user}:{pw}' + # '@cluster0-shard-00-00-wphqo.mongodb.net:27017,' + # 'cluster0-shard-00-01-wphqo.mongodb.net:27017,' + # 'cluster0-shard-00-02-wphqo.mongodb.net:27017/test' + # '?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin') + + client = pymongo.MongoClient(connection.format(user=user, pw=pw)) + + + + return client + + +def login_redis_cloud(): + """ + connect to redis and login + """ + try: + config.read(config_file) + host = config["redis_cloud"]["host"] + port = config["redis_cloud"]["port"] + pw = config["redis_cloud"]["pw"] + + + except Exception as e: + print(f'error: {e}') + + log.info('Here is where we use the connect to redis.') + + try: + r = redis.StrictRedis(host=host, port=port, password=pw, decode_responses=True) + + except Exception as e: + print(f'error: {e}') + + return r + + +def login_neo4j_cloud(): + """ + connect to neo4j and login + + """ + + log.info('Here is where we use the connect to neo4j.') + log.info('') + + config.read(config_file) + + graphenedb_user = config["neo4j_cloud"]["user"] + graphenedb_pass = config["neo4j_cloud"]["pw"] + graphenedb_url = 'bolt://hobby-opmhmhgpkdehgbkejbochpal.dbs.graphenedb.com:24786' + driver = GraphDatabase.driver(graphenedb_url, + auth=basic_auth(graphenedb_user, graphenedb_pass)) + + return driver diff --git a/Student/rdrovdahl/lesson08/no_sql/src/mongodb_script.py b/Student/rdrovdahl/lesson08/no_sql/src/mongodb_script.py new file mode 100644 index 0000000..a206a12 --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/src/mongodb_script.py @@ -0,0 +1,102 @@ +""" + mongodb example +""" + +import pprint +import login_database +import utilities + +log = utilities.configure_logger('default', '../logs/mongodb_script.log') + + +def run_example(furniture_items): + """ + mongodb data manipulation + """ + + with login_database.login_mongodb_cloud() as client: + log.info('Step 1: We are going to use a database called dev') + log.info('But if it doesnt exist mongodb creates it') + db = client['dev'] + + log.info('And in that database use a collection called furniture') + log.info('If it doesnt exist mongodb creates it') + + furniture = db['furniture'] + + log.info('Step 2: Now we add data from the dictionary above') + furniture.insert_many(furniture_items) + + log.info('Step 3: Find the products that are described as plastic') + query = {'description': 'Plastic'} + results = furniture.find_one(query) + + log.info('Step 4: Print the plastic products') + print('Plastic products') + pprint.pprint(results) + + log.info('Step 4a-1: Print all the couches') + print('All the couches:') + cursor = furniture.find({'product_type': 'couch'}) + for doc in cursor: + pprint.pprint(doc) + + log.info('Step 4a-2: Print all the red items') + print('All the red items:') + cursor = furniture.find({'product_color': 'red'}) + for doc in cursor: + pprint.pprint(doc) + + + log.info('Step 4b: Check for couches that are blue') + query = {"$and": [{"product_type": "couch"}, {"product_color": "blue"}]} + results = furniture.find_one(query) + pprint.pprint(results) + + + log.info('Step 5: Delete all blue couches') + furniture.remove(query) + + log.info('Step 6: Check it is deleted with a query and print') + results = furniture.find_one(query) + print('The blue couch is deleted, print should show none:') + pprint.pprint(results) + + log.info( + 'Step 7: Find multiple documents, iterate though the results and print') + + cursor = furniture.find({'monthly_rental_cost': {'$gte': 15.00}}).sort('monthly_rental_cost', 1) + print('Results of search') + log.info('Notice how we parse out the data from the document') + + for doc in cursor: + print(f"Cost: {doc['monthly_rental_cost']} product name: {doc['product_type']} Stock: {doc['in_stock_quantity']}") + + + log.info('Step 7a: add new documents to the database') + new_furniture_items = [{'product_type': 'dresser', + 'product_color': 'black', + 'description': 'rustic dresser', + 'monthly_rental_cost': 10.00, + 'in_stock_quantity': 2, + 'number_of_drawers': 6}, + {'product_type': 'bed', + 'product_color': 'black', + 'description': 'modern bed', + 'monthly_rental_cost': 25.00, + 'in_stock_quantity': 5, + 'size': 'king'}] + furniture.insert_many(new_furniture_items) + + log.info('Step 7b: Validate new documents made it into the database') + print('query and print new items from database') + query = {"$and": [{"product_type": "dresser"}, {"product_color": "black"}]} + results = furniture.find_one(query) + pprint.pprint(results) + + query = {"$and": [{"product_type": "bed"}, {"product_color": "black"}]} + results = furniture.find_one(query) + pprint.pprint(results) + + log.info('Step 8: Delete the collection so we can start over') + db.drop_collection('furniture') diff --git a/Student/rdrovdahl/lesson08/no_sql/src/neo4j_script.py b/Student/rdrovdahl/lesson08/no_sql/src/neo4j_script.py new file mode 100644 index 0000000..99f21ed --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/src/neo4j_script.py @@ -0,0 +1,97 @@ +""" + neo4j example +""" + + +import utilities +import login_database +import utilities + +log = utilities.configure_logger('default', '../logs/neo4j_script.log') + + +def run_example(): + + log.info('Step 1: First, clear the entire database, so we can start over') + log.info("Running clear_all") + + driver = login_database.login_neo4j_cloud() + with driver.session() as session: + session.run("MATCH (n) DETACH DELETE n") + + log.info("Step 2: Add a few people") + + with driver.session() as session: + + log.info('Adding a few Person nodes') + log.info('The cyph language is analagous to sql for neo4j') + for first, last in [('Bob', 'Jones'), + ('Nancy', 'Cooper'), + ('Alice', 'Cooper'), + ('Fred', 'Barnes'), + ('Mary', 'Evans'), + ('Marie', 'Curie'), + ]: + cyph = "CREATE (n:Person {first_name:'%s', last_name: '%s'})" % ( + first, last) + session.run(cyph) + + log.info("Step 3: Get all of people in the DB:") + cyph = """MATCH (p:Person) + RETURN p.first_name as first_name, p.last_name as last_name + """ + result = session.run(cyph) + print("People in database:") + for record in result: + print(record['first_name'], record['last_name']) + + log.info('Step 4: Create some relationships') + log.info("Bob Jones likes Alice Cooper, Fred Barnes and Marie Curie") + + for first, last in [("Alice", "Cooper"), + ("Fred", "Barnes"), + ("Marie", "Curie")]: + cypher = """ + MATCH (p1:Person {first_name:'Bob', last_name:'Jones'}) + CREATE (p1)-[friend:FRIEND]->(p2:Person {first_name:'%s', last_name:'%s'}) + RETURN p1 + """ % (first, last) + session.run(cypher) + + log.info("Step 5: Find all of Bob's friends") + cyph = """ + MATCH (bob {first_name:'Bob', last_name:'Jones'}) + -[:FRIEND]->(bobFriends) + RETURN bobFriends + """ + result = session.run(cyph) + print("Bob's friends are:") + for rec in result: + for friend in rec.values(): + print(friend['first_name'], friend['last_name']) + + log.info("Setting up Marie's friends") + + for first, last in [("Mary", "Evans"), + ("Alice", "Cooper"), + ('Fred', 'Barnes'), + ]: + cypher = """ + MATCH (p1:Person {first_name:'Marie', last_name:'Curie'}) + CREATE (p1)-[friend:FRIEND]->(p2:Person {first_name:'%s', last_name:'%s'}) + RETURN p1 + """ % (first, last) + + session.run(cypher) + + print("Step 6: Find all of Marie's friends?") + cyph = """ + MATCH (marie {first_name:'Marie', last_name:'Curie'}) + -[:FRIEND]->(friends) + RETURN friends + """ + result = session.run(cyph) + print("\nMarie's friends are:") + for rec in result: + for friend in rec.values(): + print(friend['first_name'], friend['last_name']) diff --git a/Student/rdrovdahl/lesson08/no_sql/src/redis_script.py b/Student/rdrovdahl/lesson08/no_sql/src/redis_script.py new file mode 100644 index 0000000..e32e2ef --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/src/redis_script.py @@ -0,0 +1,58 @@ +""" + demonstrate use of Redis +""" + + +import login_database +import utilities + + +def run_example(): + """ + uses non-presistent Redis only (as a cache) + + """ + + log = utilities.configure_logger('default', '../logs/redis_script.log') + + try: + log.info('Step 1: connect to Redis') + r = login_database.login_redis_cloud() + log.info('Step 2: cache some data in Redis') + r.set('andy', 'andy@somewhere.com') + + log.info('Step 2: now I can read it') + email = r.get('andy') + log.info('But I must know the key') + log.info(f'The results of r.get: {email}') + + log.info('Step 3: cache more data in Redis') + r.set('pam', 'pam@anywhere.com') + r.set('fred', 'fred@fearless.com') + + log.info('Step 4: delete from cache') + r.delete('andy') + log.info(f'r.delete means andy is now: {email}') + + log.info( + 'Step 6: Redis can maintain a unique ID or count very efficiently') + r.set('user_count', 21) + r.incr('user_count') + r.incr('user_count') + r.decr('user_count') + result = r.get('user_count') + log.info('I could use this to generate unique ids') + log.info(f'Redis says 21+1+1-1={result}') + + log.info('Step 7: richer data for a SKU') + r.rpush('186675', 'chair') + r.rpush('186675', 'red') + r.rpush('186675', 'leather') + r.rpush('186675', '5.99') + + log.info('Step 8: pull some data from the structure') + cover_type = r.lindex('186675', 2) + log.info(f'Type of cover = {cover_type}') + + except Exception as e: + print(f'Redis error: {e}') diff --git a/Student/rdrovdahl/lesson08/no_sql/src/simple_script.py b/Student/rdrovdahl/lesson08/no_sql/src/simple_script.py new file mode 100644 index 0000000..163f679 --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/src/simple_script.py @@ -0,0 +1,113 @@ +""" +pickle etc +""" + +import pickle +import shelve +import csv +import json + +import pprint +import utilities + +log = utilities.configure_logger('default', '../logs/mongodb_script.log') + + +def run_example(furniture_items): + """ + various persistence and serialization scenarios + + """ + + def run_pickle(): + """ + Write and read with pickle + """ + log.info("\n\n====") + log.info('Step 1: Demonstrate persistence with pickle') + log.info('Write a pickle file with the furniture data') + + pickle.dump(furniture_items, open('../data/data.pkl', 'wb')) + + log.info('Step 2: Now read it back from the pickle file') + read_data = pickle.load(open('../data/data.pkl', 'rb')) + log.info('Step 3: Show that the write and read were successful') + assert read_data == furniture_items + log.info("and print the data") + pprint.pprint(read_data) + + def run_shelve(): + """ + write and read with shelve + + """ + log.info("\n\n====") + log.info("Step 4: Demonstrate working with shelve") + shelf_file = shelve.open('../data/shelve.dat') + log.info("Step 5: store data at key") + shelf_file['key'] = furniture_items + + log.info("Step 6: Now retrieve a COPY of data at key") + read_items = shelf_file['key'] + + log.info("Check it worked") + assert read_items == furniture_items + + log.info("And now print the copy") + pprint.pprint(read_items) + + log.info("Step 7: delete data stored at key to cleanup and close") + del shelf_file['key'] + shelf_file.close() + + def run_csv(): + """ + write and read a csv + """ + log.info("\n\n====") + peopledata = [ + ('John', 'second guitar', 117.45), + ('Paul', 'bass', 22.01), + ('George', 'lead guitar', 45.99), + ('Ringo', 'drume', 77.0), + ('Roger', 'vocals', 12.5), + ('Keith', 'drums', 6.25), + ('Pete', 'guitar', 0.1), + ('John', 'bass', 89.71) + ] + log.info("Step 8: Write csv file") + with open('../data/rockstars.csv', 'w') as people: + peoplewriter = csv.writer(people) + peoplewriter.writerow(peopledata) + + log.info("Step 9: Read csv file back") + with open('../data/rockstars.csv', 'r') as people: + people_reader = csv.reader(people, delimiter=',', quotechar='"') + for row in people_reader: + pprint.pprint(row) + + def run_json(): + log.info("\n\n====") + log.info("Step 10: Look at working with json data") + furniture = [{'product': 'Red couch','description': 'Leather low back'}, + {'product': 'Blue couch','description': 'Cloth high back'}, + {'product': 'Coffee table','description': 'Plastic'}, + {'product': 'Red couch','description': 'Leather high back'}] + + log.info("Step 11: Return json string from an object") + furniture_string = json.dumps(furniture) + + log.info("Step 12: Print the json") + pprint.pprint(furniture_string) + + log.info("Step 13: Returns an object from a json string representation") + furniture_object = json.loads(furniture_string) + log.info("Step 14: print the string") + pprint.pprint(furniture_object) + + run_pickle() + run_shelve() + run_csv() + run_json() + + return diff --git a/Student/rdrovdahl/lesson08/no_sql/src/utilities.py b/Student/rdrovdahl/lesson08/no_sql/src/utilities.py new file mode 100644 index 0000000..15b1079 --- /dev/null +++ b/Student/rdrovdahl/lesson08/no_sql/src/utilities.py @@ -0,0 +1,43 @@ +""" +enable easy and controllable logging +""" + +import logging +import logging.config + + +def configure_logger(name, log_path): + """ + generic logger + """ + logging.config.dictConfig({ + 'version': 1, + 'formatters': { + 'default': {'format': '%(asctime)s - %(levelname)s - %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S'} + }, + 'handlers': { + 'console': { + 'level': 'DEBUG', + 'class': 'logging.StreamHandler', + 'formatter': 'default', + 'stream': 'ext://sys.stdout' + }, + 'file': { + 'level': 'DEBUG', + 'class': 'logging.handlers.RotatingFileHandler', + 'formatter': 'default', + 'filename': log_path, + 'maxBytes': 1024, + 'backupCount': 3 + } + }, + 'loggers': { + 'default': { + 'level': 'DEBUG', + 'handlers': ['console', 'file'] + } + }, + 'disable_existing_loggers': False + }) + return logging.getLogger(name) + From accf28f877c26eb6c63f1c40d5c8bad014804bb9 Mon Sep 17 00:00:00 2001 From: Ryan Drovdahl Date: Tue, 10 Jul 2018 13:20:00 -0700 Subject: [PATCH 19/19] deleted old repo --- Student/rdrovdahl/lesson08/no_sql/nosql | 1 - 1 file changed, 1 deletion(-) delete mode 160000 Student/rdrovdahl/lesson08/no_sql/nosql diff --git a/Student/rdrovdahl/lesson08/no_sql/nosql b/Student/rdrovdahl/lesson08/no_sql/nosql deleted file mode 160000 index 47bcf7f..0000000 --- a/Student/rdrovdahl/lesson08/no_sql/nosql +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 47bcf7f208f28533b037fb6207fbdf58f9fb8c35