{"id":9996,"date":"2017-05-18T02:10:38","date_gmt":"2017-05-18T06:10:38","guid":{"rendered":"https:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=9996"},"modified":"2017-08-03T09:02:32","modified_gmt":"2017-08-03T13:02:32","slug":"15c-pl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/15c-pl\/","title":{"rendered":"15C: Cezara TFLSFUOZ QSAFQJT OB CJHPT"},"content":{"rendered":"<!-- Please retain this notice and add more notes if you create a new version.<br \/>\nOriginal lesson author: David Pritchard, daveagp@gmail.com, http:\/\/cscircles.ca<br \/>\nPolish translator: Marzanna Mi\u0105sko, miasko.marzanna@gmail.com<br \/>\nLicense: http:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/-->\n<p><em>\u0106wiczenia 15A, 15B i 15C mog\u0105 by\u0107 wykonane w dowolnej kolejno\u015bci.<\/em><\/p>\n<p>Kryptografia to sztuka i nauka ukrywania znaczenia informacji w taki spos\u00f3b, aby tylko niekt\u00f3rzy ludzie j\u0105 widzieli. W tej lekcji wprowadzimy jedn\u0105 z najprostszych metod kryptograficznych, <strong><a href=\"https:\/\/pl.wikipedia.org\/wiki\/Szyfr_Cezara\">Szyfr Cezara<\/a> <\/strong> (znany r\u00f3wnie\u017c jako <strong>szyfr podstawieniowy<\/strong>), a tak\u017ce napiszemy program, kt\u00f3ry go z\u0142amie. Zaprojektujesz ka\u017cdy aspekt swojego rozwi\u0105zania (w przeciwie\u0144stwie do lekcji 15A, w kt\u00f3rej podzielili\u015bmy rozwi\u0105zywanie problemu na podzadania).<\/p>\n<p>Szyfr Cezara zast\u0119puje ka\u017cd\u0105 liter\u0119 alfabetu inn\u0105 liter\u0105. Dzia\u0142a tak, gdy chcesz zakodowa\u0107 jaki\u015b tekst, musisz wybra\u0107 <strong>warto\u015b\u0107 przesuni\u0119cia<\/strong> <em>S<\/em>, kt\u00f3re mo\u017ce wynosi\u0107 od 0 do 25. Nast\u0119pnie zamieni\u0107 ka\u017cd\u0105 liter\u0119 w tek\u015bcie na liter\u0119, kt\u00f3ra jest o <em>S<\/em> liter dalej w alfabecie, a po osi\u0105gni\u0119ciu Z na ko\u0144cu alfabetu wraca na pocz\u0105tek.<\/p>\n<h2>Przyk\u0142ad<\/h2>\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcemy zakodowa\u0107 sekretn\u0105 wiadomo\u015b\u0107<\/p>\n<p style=\"text-align: center;\"><code>JOIN ME AT EIGHT BY THE ZOO<\/code><\/p>\n<p>u\u017cywaj\u0105c przesuni\u0119cia <em>S<\/em>=2. <\/p>\n<p>Regu\u0142a szyfrowania m\u00f3wi, \u017ce ka\u017cda litera jest zast\u0105piona liter\u0105, kt\u00f3ra wyst\u0119puje w dalszej cz\u0119\u015bci alfabetu. Na przyk\u0142ad, poniewa\u017c alfabet ma posta\u0107 ABCDEFGHI<strong>J<\/strong>K<strong>L<\/strong> ..., pierwsza litera <code>J<\/code> zostanie zast\u0105piona liter\u0105 <code>L<\/code>. Kontynuuj\u0105c, <code>O<\/code> zast\u0119puje si\u0119 liter\u0105 <code>Q<\/code>, <code>I<\/code> zast\u0119puje si\u0119 liter\u0105 <code>K<\/code>, itd. Aby zakodowa\u0107 liter\u0119 <code>Y<\/code>, musimy na pocz\u0105tek alfabetu: po Y pochodzi Z, a nast\u0119pnie A, wi\u0119c <code>Y<\/code> jest zast\u0119powane przez <code>A<\/code>. Podobnie <code>Z<\/code> zast\u0105pione jest przez <code>B<\/code>. Wi\u0119c zakodowana wersja naszego tajnego komunikatu to:<\/p>\n<p style=\"text-align: center;\"><code>LQKP OG CV GKIJV DA VJG BQQ<\/code><\/p>\n<p>Gdyby jaki\u015b szpieg zobaczy\u0142 t\u0119 wiadomo\u015b\u0107, nie by\u0142by dla niego oczywiste, jaka jest jej tre\u015b\u0107.<\/p>\n<div class='pybox modeNeutral' id='pybox0'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Short Answer Exercise: <\/span><span class='title'>Szpiegowski Szyfrator<\/span><\/div>Jaki b\u0119dzie rezultat rozkodowania <code>SPY CODER<\/code> przy warto\u015bci przesuni\u0119cia  <em>S<\/em>=5? (U\u017cywaj du\u017cych liter.) Je\u015bli chcesz, napisz program w <a href=\"\/console\/\">konsoli<\/a>, kt\u00f3ry to obliczy \u2014 mo\u017ce si\u0119 on przyda\u0107 p\u00f3\u017aniej.<br><label for=\"pyShortAnswer0\">Your answer: <\/label><input type=\"text\" onkeypress=\"{if (event.keyCode==13) pbShortCheck(0)}\" id=\"pyShortAnswer0\"><div class=\"pyboxbuttons\"><input type=\"hidden\" name=\"type\" value=\"trimmableString\"\/><input type=\"hidden\" name=\"correct\" value=\"XUD HTIJW\"\/><input type=\"hidden\" name=\"slug\" value=\"15c.encode\"\/><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick = 'pbShortCheck(0)'\/><\/div><div class=\"pbresults\" id=\"pyShortResults0\"><\/div><div class=\"epilogue\">Correct!<\/div><\/div>\n<h2>Deszyfracja<\/h2>\n<p>Gdy Tw\u00f3j przyjaciel dostanie wiadomo\u015b\u0107, to je\u015bli zna warto\u015b\u0107 tajnego przesuni\u0119cia <em>S<\/em>, to \u0142atwo odszyfruje wiadomo\u015b\u0107: ka\u017cda litera jest zast\u0119powana przez liter\u0119  umieszczon\u0105 w alfabecie o <em>S<\/em> pozycji <em>wcze\u015bniej<\/em>. Na przyk\u0142ad, popatrzy na <code>L<\/code>, cofnie si\u0119 o dwie pozycje w alfabecie i znajdzie liter\u0119 <code>J<\/code>, o kt\u00f3rej teraz wie, \u017ce jest pierwsz\u0105 liter\u0105 twojej tajnej wiadomo\u015bci. Znowu nale\u017cy traktowa\u0107 alfabet w spos\u00f3b cykliczny, zak\u0142adaj\u0105c, \u017ce <code>Z<\/code> przechodzi na <code>A<\/code>.<\/p>\n<p><div class='pybox modeNeutral' id='pybox1'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Short Answer Exercise: <\/span><span class='title'>Szpiegowski Deszyfrator<\/span><\/div>Je\u015bli zaszyfrowana wiadomo\u015b\u0107 to <code>HUD<\/code>, a warto\u015b\u0107 przesuni\u0119cia wynosi <em>S<\/em>=6, to jaka by\u0142a pierwotna wiadomo\u015b\u0107? (U\u017cyj wielkich liter.)<br><label for=\"pyShortAnswer1\">Your answer: <\/label><input type=\"text\" onkeypress=\"{if (event.keyCode==13) pbShortCheck(1)}\" id=\"pyShortAnswer1\"><div class=\"pyboxbuttons\"><input type=\"hidden\" name=\"type\" value=\"trimmableString\"\/><input type=\"hidden\" name=\"correct\" value=\"BOX\"\/><input type=\"hidden\" name=\"slug\" value=\"15c.decode\"\/><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick = 'pbShortCheck(1)'\/><\/div><div class=\"pbresults\" id=\"pyShortResults1\"><\/div><div class=\"epilogue\">Correct!<\/div><\/div>\n<h2>Pracuj\u0119 dla Z\u0142ych Facet\u00f3w<\/h2>\n<p>Zosta\u0142e\u015b zatrudniony przez szpiega, aby pom\u00f3c odszyfrowa\u0107 wiadomo\u015b\u0107 zaszyfrowan\u0105 przy u\u017cyciu szyfru podstawieniowego. Niestety, szpieg nie zna warto\u015bci <em>S<\/em>. Do napisania programu b\u0119dziesz musia\u0142 u\u017cywa\u0107 statystyk, kt\u00f3re daj\u0105 du\u017ce szanse na automatyczne znalezienie odpowiedniej warto\u015bci <em>S<\/em>.<\/p>\n<p>Nasza metoda polega na <strong>analizie cz\u0119stotliwo\u015bci literowej<\/strong>. W j\u0119zyku angielskim niekt\u00f3re litery s\u0105 bardzo powszechne (np. E), a niekt\u00f3re wyst\u0119puj\u0105 rzadko (np. J). Oto tabela cz\u0119stotliwo\u015bci, oparta na liczeniu cz\u0119stotliwo\u015bci wyst\u0105pie\u0144 w du\u017cym obszarze tekstu.<\/p>\n<table class=\"minyspace\" style=\"text-align: center;\">\n<tbody>\n<tr>\n<th>A<\/th>\n<th>B<\/th>\n<th>C<\/th>\n<th>D<\/th>\n<th>E<\/th>\n<th>F<\/th>\n<th>G<\/th>\n<th>H<\/th>\n<th>I<\/th>\n<\/tr>\n<tr>\n<td>.0817<\/td>\n<td>.0149<\/td>\n<td>.0278<\/td>\n<td>.0425<\/td>\n<td>.1270<\/td>\n<td>.0223<\/td>\n<td>.0202<\/td>\n<td>.0609<\/td>\n<td>.0697<\/td>\n<\/tr>\n<tr>\n<th>J<\/th>\n<th>K<\/th>\n<th>L<\/th>\n<th>M<\/th>\n<th>N<\/th>\n<th>O<\/th>\n<th>P<\/th>\n<th>Q<\/th>\n<th>R<\/th>\n<\/tr>\n<tr>\n<td>.0015<\/td>\n<td>.0077<\/td>\n<td>.0402<\/td>\n<td>.0241<\/td>\n<td>.0675<\/td>\n<td>.0751<\/td>\n<td>.0193<\/td>\n<td>.0009<\/td>\n<td>.0599<\/td>\n<\/tr>\n<tr>\n<th>S<\/th>\n<th>T<\/th>\n<th>U<\/th>\n<th>V<\/th>\n<th>W<\/th>\n<th>X<\/th>\n<th>Y<\/th>\n<th>Z<\/th>\n<th><\/th>\n<\/tr>\n<tr>\n<td>.0633<\/td>\n<td>.0906<\/td>\n<td>.0276<\/td>\n<td>.0098<\/td>\n<td>.0236<\/td>\n<td>.0015<\/td>\n<td>.0197<\/td>\n<td>.0007<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Na przyk\u0142ad, cz\u0119stotliwo\u015b\u0107 L wynosi  0,0402=4,02%, co oznacza, \u017ce tekst angielski \u015brednio zawiera 4,02% L liter.<\/p>\n<p>Wywo\u0142anie <strong>goodness<\/strong>   dla litery daje  warto\u015b\u0107 zawart\u0105 w powy\u017cszej tabeli. Teraz, dla naszej metody statystycznej,  okre\u015blamy <strong>goodness<\/strong>  dla  zdania jako sum\u0119 <strong>goodness<\/strong>  ka\u017cdej z jej liter. Na przyk\u0142ad, <strong>goodness<\/strong>  \u0142a\u0144cucha <code>GOOD<\/code> wynosi<\/p>\n<p style=\"text-align: center;\">goodness(\"<code>GOOD<\/code>\") = .0202 + .0751 + .0751 + .0425 = .2129<\/p>\n<p>Idea analizy cz\u0119stotliwo\u015bci polega na tym, \u017ce  \u0142a\u0144cuchy o wy\u017cszej cz\u0119stotliwo\u015bci goodness z wi\u0119kszym prawdopodobie\u0144stwem reprezentuj\u0105 tekst w j\u0119zyku angielskim. Na przyk\u0142ad, je\u015bli szpieg widzi zaszyfrowan\u0105 wiadomo\u015b\u0107 \"<code>JRRG<\/code>\", to oryginalny tekst mo\u017ce by\u0107 \"<code>GOOD<\/code> z przesuni\u0119ciem <em>S<\/em> = 3 lub \"<code>IQQF<\/code>\" z <em>S<\/em> = 1. Ale goodness \"<code>IQQF<\/code>\" jest<\/p>\n<p style=\"text-align: center;\">goodness(\"<code>IQQF<\/code>\") = .0697 + .0009 + .0009 + .0223 = .0938<\/p>\n<p>i skoro 0,0938 &lt; 0,2129, to tw\u00f3j program powinien wywnioskowa\u0107, \u017ce <code>GOOD<\/code> jest bardziej prawdopodobn\u0105 prawid\u0142ow\u0105 wiadomo\u015bci\u0105 ni\u017c <code>IQQF<\/code>.<\/p>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Ocenianie \u0142a\u0144cuch\u00f3w poprzez <em>goodness<\/em> nie jest doskona\u0142e. Dajmy na to, \u017ce sekretna wiadomo\u015b\u0107 to <code>JAZZ<\/code>, a warto\u015b\u0107 tajnego przesuni\u0119cia to <em>S<\/em> = 10, wi\u0119c rozszyfrowany tekst to <code>TKJJ<\/code>. Kiedy wprowadzisz TKJJ do swojego programu  i sprawdzisz dla S = 10, wtedy <em>goodness<\/em> dla <code>JAZZ<\/code> wyniesie 0,0846, ale lepsz\u0105 warto\u015b\u0107 uzyskasz dla S = 5 i otrzymanej wiadomo\u015bci <code>OFEE<\/code> z <em>goodness<\/em> 0,3514 jako najlepszego proponowanego wyniku tego programu. Tw\u00f3j program powinien i\u015b\u0107 dalej i wy\u015bwietli\u0107 to nieangielskie s\u0142owo OFEE. (Analiza cz\u0119stotliwo\u015bci tego typu dzia\u0142a lepiej, je\u015bli zakodowana wiadomo\u015b\u0107 jest d\u0142u\u017csza). <\/span><\/td><\/table><\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox2'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Automatyczna deszyfracja<\/span><\/div>\n<div>Napisz program, kt\u00f3ry wykonuje nast\u0119puj\u0105ce czynno\u015bci: Najpierw czyta na wej\u015bciu jedn\u0105 lini\u0119, kt\u00f3ra jest zakodowan\u0105 wiadomo\u015bci\u0105 sk\u0142adaj\u0105c\u0105 si\u0119 z du\u017cych liter i spacji. Tw\u00f3j program ma pr\u00f3bowa\u0107 dekodowa\u0107 wiadomo\u015b\u0107 u\u017cywaj\u0105c wszystkich 26 mo\u017cliwych warto\u015bci przesuni\u0119cia <em>S<\/em>; z tych 26 mo\u017cliwych oryginalnych wiadomo\u015bci, program ma wydrukowa\u0107 t\u0119, kt\u00f3ra ma najwi\u0119ksz\u0105 goodness.<\/div>\n<p> Dla Twojej wygody, zdefiniowali\u015bmy dla ciebie zmienn\u0105 <code>letterGoodness<\/code>, jest to lista d\u0142ugo\u015bci 26, kt\u00f3rej elementy s\u0105 r\u00f3wne warto\u015bciom z powy\u017cszej tabeli cz\u0119stotliwo\u015bci, <\/p>\n<pre>letterGoodness = [.0817,.0149,.0278,.0425,.1270,.0223,.0202,...<\/pre> <\/p>\n<div><a class=\"hintlink\"  id=\"hintlink3\">Kliknij tutaj, aby uzyska\u0107 og\u00f3lne porady.<\/a><div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=20   class='pyboxCode RW'>\nprint(letterGoodness) #testing... it's predefined\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory2' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput2\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<input type='hidden' id='defaultCode2' value='print(letterGoodness) #testing... it\\u0027s predefined\\n'><\/input>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit2' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch2\" value=\"Input Switch\" onclick=\"pbInputSwitch(2,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(2)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(2,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect2' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(2,'15c.autodecrypt')\" >History<\/option>\n<option name='default' data-pbonclick=\"pbSetText(2,descape($('#defaultCode2').val()))\" >Reset code to default<\/option>\n<option name='help' data-pbonclick=\"helpClick(2);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse2\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"2\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"02cb74051685f89209249f240356e134\"\/>\n<div id='pbresults2' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(2);});pbInputSwitch(2,\"Y\");<\/script>\n<\/div>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Takie rozwi\u0105zanie  nazywa si\u0119 rozwi\u0105zaniem   <em>brute force<\/em>, poniewa\u017c pr\u00f3bowa\u0142e\u015b wszystkich 26 mo\u017cliwo\u015bci. Mo\u017cna nawet zrobi\u0107 to r\u0119cznie, je\u015bli trzeba. Z drugiej strony nowoczesne protoko\u0142y kryptograficzne s\u0105 tak zaprojektowane, \u017ce <em>brute force<\/em> nie zapewnia rozwi\u0105zania, nawet je\u015bli u\u017cywasz bardzo szybkich komputer\u00f3w, aby spr\u00f3bowa\u0107 wszystkich mo\u017cliwo\u015bci. <\/span><\/td><\/table><\/p>\n<p>Je\u015bli chcesz, aby ten system automatycznego dekodowania by\u0142 dok\u0142adniejszy, mo\u017cesz zwr\u00f3ci\u0107 uwag\u0119 na inne statystyki w j\u0119zyku angielskim, takie jak \"jakie litery mog\u0105 wyst\u0119powa\u0107 w parach obok siebie?\", od jakich liter mog\u0105 zaczyna\u0107 si\u0119 s\u0142owa?\" Jest to r\u00f3wnie\u017c u\u017cyteczne dla bardziej og\u00f3lnych <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Szyfr_podstawieniowy\">szyfr\u00f3w podstawieniowych<\/a>, gdzie litery zast\u0119puj\u0105 litery, ale nie w spos\u00f3b cykliczny. Dla takich szyfr\u00f3w brute force nie dzia\u0142a, poniewa\u017c istniej\u0105 26 * 25 * ... * 1 mo\u017cliwe szyfry podstawieniowe, co odpowiada oko\u0142o 4 * 10<sup>26<\/sup> (czterysta septylion\u00f3w).<\/p>\n<p>Uko\u0144czy\u0142e\u015b t\u0119 lekcj\u0119! Aby to \u015bwi\u0119towa\u0107, zach\u0119cam do wysy\u0142ania twoim znajomym zaszyfrowanej wiadomo\u015bci.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0106wiczenia 15A, 15B i 15C mog\u0105 by\u0107 wykonane w dowolnej kolejno\u015bci. Kryptografia to sztuka i nauka ukrywania znaczenia informacji w taki spos\u00f3b, aby tylko niekt\u00f3rzy ludzie j\u0105 widzieli. W tej lekcji wprowadzimy jedn\u0105 z najprostszych metod kryptograficznych, Szyfr Cezara (znany &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/15c-pl\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-9996","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/9996","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=9996"}],"version-history":[{"count":26,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/9996\/revisions"}],"predecessor-version":[{"id":10436,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/9996\/revisions\/10436"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=9996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}