diff options
author | Calvin Morrison <calvin@pobox.com> | 2023-05-18 12:49:44 -0400 |
---|---|---|
committer | Calvin Morrison <calvin@pobox.com> | 2023-05-18 12:49:44 -0400 |
commit | 04bbaf006a3a9187e59c614bf096a66ea3194ee0 (patch) | |
tree | ef70de6dc8b4ca155a975f84fa55d81733e981ca /histo.php |
Diffstat (limited to 'histo.php')
-rw-r--r-- | histo.php | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/histo.php b/histo.php new file mode 100644 index 0000000..f3bf446 --- /dev/null +++ b/histo.php @@ -0,0 +1,78 @@ +<?php + +function getImageHistogram(IMagick $imagick, int $top) { + + $backgroundColor = 'black'; + + //Resize the image to be small, otherwise PHP tends to run out of memory + //This might lead to bad results for images that are pathologically 'pixelly' + $pixels = $imagick->getImageHistogram(); + + $arr = []; + foreach($pixels as $p){ + $color = $p->getColor(); + $hex = sprintf('#%s%s%s', + dechex($color['r']), + dechex($color['g']), + dechex($color['b']) + ); + + $arr[$hex] = $p->getColorCount(); + } + + asort($arr); + $top = (array_slice($arr,-$top,$top,true)); + arsort($top); + return $top; +} + +function err(string $error, $code = 400) { + + http_response_code($code); + print json_encode(["error" => $error]); + exit; +} + + +header('Content-Type: application/json;'); + +$data = file_get_contents('php://input'); + +if(empty($data)) { + err('no POST data. Send something like {"image": "data:image/png;base64,PCFET0NUWVBFIGh0bWw+PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPjxoZWFkPjx0aXRsZT5TbWlsZSBQTkcsIFNtaWxlIFRyYW5zcGFyZW50IEJhY2tncm91bmQgLSBGcmVlSWNvbnNQTkc8L3RpdGxlPjxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJEb3dubG9hZCBzbWlsZSBwbmcgZnJlZSBpY29ucyBhbmQgUE5HIGltYWdlcy4gMjYrIFNtaWxlIFBuZyBpbWFnZXMgZm9yIHlvdXIgZ3JhcGhpYyBkZXNpZ24sIHByZXNlbnRhdGlvbnMsIHdlYiBkZXNpZ24gYW5kIG90aGVyIHByb2plY3RzLiIgLz48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz48bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIG1heGltdW0tc2NhbGU9MSwgdXNlci1zY2FsYWJsZT1ubyIgLz48bWV0YSBuYW1lPSJsYW5nIiBjb250ZW50PSJlbiIgLz48bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9ImluZGV4LCBmb2xsb3ciIC8+PGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9faW1nL2ZpY29uLmljbyIgLz48bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9fY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL19jc3Mvc2l0ZS5taW4uY3NzIiAvPjxsaW5rIHJlbD0iZG5zLXByZWZldGNoIiBocmVmPSJodHRwczovL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tIj48bGluayByZWw9ImRucy1wcmVmZXRjaCIgaHJlZj0iaHR0cHM6Ly9hamF4Lmdvb2dsZWFwaXMuY29tIj48bGluayByZWw9ImRucy1wcmVmZXRjaCIgaHJlZj0iaHR0cHM6Ly9odG1sNXNoaW0uZ29vZ2xlY29kZS5jb20iPjxsaW5rIHJlbD0iZG5zLXByZWZldGNoIiBocmVmPSJodHRwczovL3M3LmFkZHRoaXMuY29tIj48bGluayByZWw9ImRucy1wcmVmZXRjaCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbSI+PGxpbmsgcmVsPSJkbnMtcHJlZmV0Y2giIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20iPjxsaW5rIHJlbD0iY2Fub25pY2FsIiBocmVmPSJodHRwczovL3d3dy5mcmVlaWNvbnNwbmcuY29tL2ltYWdlcy9zbWlsZS1wbmciIC8+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uZ3JpZC1pdGVtIHt3aWR0aDogMzMwcHg7IGZsb2F0OiBsZWZ0OyBib3JkZXItYm94OiBib3gtc2l6aW5nOyBwYWRkaW5nOiAxMHB4OyBvdmVyZmxvdzogaGlkZGVuOyBjb2xvcjogIzMzM30gLmdyaWQtaXRlbSAuaW1nY292ZXIgeyBiYWNrZ3JvdW5kOiNlZWUgdXJsKCcvX2ltZy90cmFuc3BhcmVudC5wbmcnKSByZXBlYXQ7IH0gLmdyaWQtaXRlbSAuaW1nY292ZXI6aG92ZXIgeyBvcGFjaXR5OiAwLjc7IH08L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2IGNsYXNzPSJib2R5LXdyYXBwZXIiPjxoZWFkZXIgY2xhc3M9ImhlYWRlci1saW1pdGVkIj48ZGl2IGNsYXNzPSJ3cmFwcGVyIj48ZGl2IGNsYXNzPSJsb2dvIj48YSBocmVmPSJodHRwczovL3d3dy5mcmVlaWNvbnNwbmcuY29tLyIgdGl0bGU9IkZyZWUgSWNvbnMgUE5HIj48aW1nIHNyYz0iL19pbWcvbG9nby5wbmciIGFsdD0iRnJlZSBJY29ucyBQTkciIC8+PC9hPjwvZGl2PjxkaXYgY2xhc3M9ImJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+PGRpdiBjbGFzcz0idXBsb2FkIj48YSBocmVmPSIjIj5VcGxvYWQ8L2E+PC9kaXY+PGRpdiBjbGFzcz0ibG9naW4tcmVnaXN0ZXItZ3JvdXAiPjxkaXYgY2xhc3M9ImxvZ2luLXJlZ2lzdGVyIj48ZGl2IGNsYXNzPSJsb2dpbiI+PGEgaHJlZj0iIyI+TG9naW48L2E+PC9kaXY+PGRpdiBjbGFzcz0icmVnaXN0ZXIiPjxhIGhyZWY9IiMiPlJlZ2lzdGVyPC9hPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlYXJjaCIgc3R5bGU9Im1hcmdpbjogMDsiPjxkaXYgY2xhc3M9ImJhciI+PGZvcm0gbWV0aG9kPSJnZXQiIGFjdGlvbj0iL3NlYXJjaC5odG1sIiBpZD0idG9wc2VhcmNoIj48ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+PGlucHV0IHZhbHVlPSIiIHR5cGU9InRleHQiIGF1dG9jb21wbGV0ZT0ib2ZmIiBtYXhsZW5ndGg9IjQwIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGZyZWUgaWNvbnMgYW5kIHBuZyBpbWFnZXMhIiBjbGFzcz0ic2VhcmNoLXRleHQgZm9ybS1jb250cm9sIHVpLWF1dG9jb21wbGV0ZS1pbnB1dCIgaWQ9InNlYXJjaEJhcklucHV0IiBzdHlsZT0id2lkdGg6ODglIiBuYW1lPSJxIiAvPjxzZWxlY3QgaWQ9InNlYXJjaFR5cGUiIG5hbWU9InRpcCIgY2xhc3M9InNlYXJjaC10ZXh0IGZvcm0tY29udHJvbCB1aS1hdXRvY29tcGxldGUtaW5wdXQiIHN0eWxlPSJ3aWR0aDoxMiUiPjxvcHRpb24gdmFsdWU9Imljb24iPklDT048L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwbmciPlBORzwvb3B0aW9uPjwvc2VsZWN0PjxkaXYgY2xhc3M9ImlucHV0LWdyb3VwLWJ0biI+PGRpdiBjbGFzcz0iYnRuLWdyb3VwIj48YnV0dG9uIGNsYXNzPSJzZWFyY2gtc3VibWl0IiB0eXBlPSJidXR0b24iIGlkPSJzZWFyY2hCYXJCdXR0b24iIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3BzZWFyY2gnKS5zdWJtaXQoKTsiPlNFQVJDSDwvYnV0dG9uPjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9ybT48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ibmF2LWJhciI+PGRpdiBjbGFzcz0id3JhcHBlciI+PG5hdj48dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQiPjxsaSBjbGFzcz0ibGluay1maXJzdCI+PGEgY2xhc3M9ImNvbnRlbnQiIGhyZWY9Ii9sYXRlc3QtcG5nLWltYWdlcy5odG1sIiB0aXRsZT0iRnJlZSBQTkcgSW1hZ2VzIj5GcmVlIFBORyBJbWFnZXM8L2E+PC9saT48bGkgY2xhc3M9ImxpbmstZmlyc3QiPjxhIGNsYXNzPSJjb250ZW50IiBocmVmPSIvbGF0ZXN0LWljb25zLmh0bWwiIHRpdGxlPSJGcmVlIEljb25zIj5GcmVlIEljb25zPC9hPjwvbGk+PGxpIGNsYXNzPSJsaW5rLWZpcnN0Ij48YSBjbGFzcz0iY29udGVudCIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Ii9yZXNpemUvIj5SZXNpemUgSW1hZ2U8L2E+PC9saT48L3VsPjwvbmF2PjxkaXYgY2xhc3M9InNvY2lhbCI+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL2ZyZWVpY29uc3BuZyIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSIvX2ltZy9pY29uLXRvcC1mYWNlYm9vay5wbmciIGFsdD0iRmFjZWJvb2siIC8+PC9hPjxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vZnJlZWljb25zcG5nIiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Ii9faW1nL2ljb24tdG9wLXR3aXR0ZXIucG5nIiBhbHQ9IlR3aXR0ZXIiIC8+PC9hPjxhIGhyZWY9Imh0dHBzOi8vcGx1cy5nb29nbGUuY29tLytmcmVlaWNvbnNwbmciIHRhcmdldD0iX2JsYW5rIj48aW1nIHNyYz0iL19pbWcvaWNvbi10b3AtZ29vZ2xlLnBuZyIgYWx0PSJHb29nbGUrIiAvPjwvYT48YSBocmVmPSJodHRwczovL3d3dy5waW50ZXJlc3QuY29tL2ZyZWVpY29uc3BuZyIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSIvX2ltZy9pY29uLXRvcC1waW50ZXJlc3QucG5nIiBhbHQ9IlBpbnRlcmVzdCIgLz48L2E+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2hlYWRlcj48ZGl2IGlkPSJwYW5lbExvZ29zIj48ZGl2IGNsYXNzPSJsb2dvLXNlYXJjaC1wYWdlIj48ZGl2IGNsYXNzPSJjb250ZW50IiBzdHlsZT0ibWFyZ2luOjA7Ij48ZGl2IGNsYXNzPSJpbmZvIj48ZGl2IGNsYXNzPSJ0b3AiPjxkaXYgY2xhc3M9InRpdGxlLXdyYXBwZXIiPjxkaXYgY2xhc3M9InRpdGxlIj48aDE+U21pbGUgUE5HIEltYWdlczwvaDE+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2VudGVyIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToyMHB4OyI+PGRpdiBjbGFzcz0ibWVzc2FnZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgbGluZS1oZWlnaHQ6IDMwcHg7Ij5Eb3dubG9hZCBmcmVlIDxzdHJvbmc+c21pbGUgcG5nPC9zdHJvbmc+IGltYWdlcy4gSWYgeW91IGxpa2UsIHlvdSBjYW4gZG93bmxvYWQgcGljdHVyZXMgaW4gaWNvbiBmb3JtYXQgb3IgZGlyZWN0bHkgaW4gcG5nIGltYWdlIGZvcm1hdC48YnIvPglUbyBjcmVhdGVkIGFkZCAyNiBwaWVjZXMsIHRyYW5zcGFyZW50IDxzdHJvbmc+U01JTEU8L3N0cm9uZz4gaW1hZ2VzIG9mIHlvdXIgcHJvamVjdCBmaWxlcyB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNsZWFuZWQuIDwvZGl2PjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxzcGFuIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgYnRuLXNtIG15LTIiIHN0eWxlPSJtYXJnaW46MnB4OyI+PGgyIHN0eWxlPSJmb250LXNpemU6MTJweDsiPjxhIGhyZWY9Ii9pbWFnZXMvc21pbGV5LWljb24iIHRpdGxlPSJzbWlsZXkgaWNvbiI+c21pbGV5IGljb248L2E+PC9oMj48L3NwYW4+PHNwYW4gY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBidG4tc20gbXktMiIgc3R5bGU9Im1hcmdpbjoycHg7Ij48aDIgc3R5bGU9ImZvbnQtc2l6ZToxMnB4OyI+PGEgaHJlZj0iL2ltYWdlcy93aW5raW5nLXNtaWxleS1pY29uIiB0aXRsZT0id2lua2luZyBzbWlsZXkgaWNvbiI+d2lua2luZyBzbWlsZXkgaWNvbjwvYT48L2gyPjwvc3Bhbj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJsb2dvcy1hZHYtZ3JvdXAiPjxkaXYgY2xhc3M9ImFkLTItY29udGVudCI+PGRpdiBjbGFzcz0iYWQtd3JhcHBlciI+PGRpdiBpZD0icGFuZWxBZDIiPjxkaXYgY2xhc3M9InNwb25zb3JlZCI+Jm5ic3A7PC9kaXY+PGlucyBjbGFzcz0iYWRzYnlnb29nbGUgYWRzbG90XzIiIHN0eWxlPSJkaXNwbGF5OmJsb2NrIiBkYXRhLWFkLWNsaWVudD0iY2EtcHViLTA5OTc2NDk5MDExNjMyODQiIGRhdGEtYWQtc2xvdD0iNTEzNTkzNTkxNSIgZGF0YS1hZC1mb3JtYXQ9ImF1dG8iPjwvaW5zPjxzY3JpcHQ+IChhZHNieWdvb2dsZSA9IHdpbmRvdy5hZHNieWdvb2dsZSB8fCBbXSkucHVzaCh7fSk7IDwvc2NyaXB0PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgaWQ9InBhbmVsQWQzIj48ZGl2IGNsYXNzPSJhZC0zLWNvbnRlbnQiPjxkaXYgY2xhc3M9ImFkLXdyYXBwZXIiPjxkaXYgY2xhc3M9InNwb25zb3JlZCI+Jm5ic3A7PC9kaXY+PGlucyBjbGFzcz0iYWRzYnlnb29nbGUgYWRzbG90XzEiIHN0eWxlPSJkaXNwbGF5OmJsb2NrIiBkYXRhLWFkLWNsaWVudD0iY2EtcHViLTA5OTc2NDk5MDExNjMyODQiIGRhdGEtYWQtc2xvdD0iNTEzNTkzNTkxNSIgZGF0YS1hZC1mb3JtYXQ9ImF1dG8iPjwvaW5zPjxzY3JpcHQ+IChhZHNieWdvb2dsZSA9IHdpbmRvdy5hZHNieWdvb2dsZSB8fCBbXSkucHVzaCh7fSk7IDwvc2NyaXB0PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ29zLWNvbnRlbnQtcGFydHMiPjxkaXYgaWQ9InBhbmVsRnJlZUxvZ29zIiBjbGFzcz0iY29udGFpbmVyLWZsdWlkIj48ZGl2IGNsYXNzPSJsb2dvcy1jb250ZW50LXBhcnQtd3JhcHBlciByb3ciPjxoMj48c3Ryb25nPkZyZWUgU21pbGUgVHJhbnNwYXJlbnQgQmFja2dyb3VuZDwvc3Ryb25nPjwvaDI+PGRpdiBjbGFzcz0iIGxvZ29zLWNvbnRlbnQtcGFydC1yb3ciPjxkaXYgaWQ9ImdyaWQiIHN0eWxlPSJ3aWR0aDogYXV0bzsgbWFyZ2luOiAwIGF1dG87IG92ZXJmbG93OiBoaWRkZW47IGJhY2tncm91bmQ6ICNmZmYiPjxkaXYgY2xhc3M9ImNvbC1sZy0yIGNvbC1zbS0zIGNvbC14cy02IGdyaWQtaXRlbSIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2RkZDsgbWFyZ2luOjVweDsiPjxkaXYgY2xhc3M9ImxvZ28td3JhcHBlciI+PGRpdiBjbGFzcz0iaW1nY292ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YSBocmVmPSIvaW1nLzQ2NTE5IiB0aXRsZT0iU21pbGUgUE5HIFBob3RvIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS1wbmctcGhvdG8tMTkucG5nIiBhbHQ9IlNtaWxlIFBORyBQaG90byBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS1wbmctcGhvdG8tMTkucG5nIiBhbHQ9IlNtaWxlIFBORyBQaG90byBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPlNtaWxlIFBORzwvaDM+PGRpdiBjbGFzcz0iZm9ybWF0Ij5SZXM6PGI+ODE5KjgxOTwvYj48L2Rpdj48ZGl2IGNsYXNzPSJkb3dubG9hZCI+RG93bmxvYWQ6PGI+NTU1ODwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLXNtLTMgY29sLXhzLTYgZ3JpZC1pdGVtIiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZGRkOyBtYXJnaW46NXB4OyI+PGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj48ZGl2IGNsYXNzPSJpbWdjb3ZlciIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Ii9pbWcvNDY1MjYiIHRpdGxlPSJCZXN0IFNtaWxlIFBuZyBDbGlwYXJ0IFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9iZXN0LXNtaWxlLXBuZy1jbGlwYXJ0LTI2LnBuZyIgYWx0PSJCZXN0IFNtaWxlIFBuZyBDbGlwYXJ0IFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMjI4IiAvPjwvYT48bm9zY3JpcHQ+PGltZyBzcmM9Ii90aHVtYnMvc21pbGUtcG5nL2Jlc3Qtc21pbGUtcG5nLWNsaXBhcnQtMjYucG5nIiBhbHQ9IkJlc3QgU21pbGUgUG5nIENsaXBhcnQgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIyMjgiIC8+PC9ub3NjcmlwdD48L2Rpdj48ZGl2IGNsYXNzPSJsb2dvLXRpdGxlLWRldGFpbCI+PGRpdiBjbGFzcz0ibG9nby1kZXRhaWwiPjxoMz5CZXN0IFNtaWxlIFBuZzwvaDM+PGRpdiBjbGFzcz0iZm9ybWF0Ij5SZXM6PGI+MTYwMCoxMTQzPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImRvd25sb2FkIj5Eb3dubG9hZDo8Yj4xNzAxPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUwMiIgdGl0bGU9IlNtaWxlIFBORyBIRCBQTkcgaW1hZ2VzIj48aW1nIGNsYXNzPSJsYXp5bG9hZCIgc3JjPSIvX2ltZy9kZWZhdWx0LnBuZyIgZGF0YS1vcmlnaW5hbD0iL3RodW1icy9zbWlsZS1wbmcvc21pbGUtcG5nLWhkLTAucG5nIiBhbHQ9IlNtaWxlIFBORyBIRCBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS1wbmctaGQtMC5wbmciIGFsdD0iU21pbGUgUE5HIEhEIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiAvPjwvbm9zY3JpcHQ+PC9kaXY+PGRpdiBjbGFzcz0ibG9nby10aXRsZS1kZXRhaWwiPjxkaXYgY2xhc3M9ImxvZ28tZGV0YWlsIj48aDM+U21pbGUgUE5HPC9oMz48ZGl2IGNsYXNzPSJmb3JtYXQiPlJlczo8Yj45MDAqOTAwPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImRvd25sb2FkIj5Eb3dubG9hZDo8Yj4xMzExPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUwNCIgdGl0bGU9IkJlc3QgRnJlZSBTbWlsZSBQbmcgSW1hZ2UgUE5HIGltYWdlcyI+PGltZyBjbGFzcz0ibGF6eWxvYWQiIHNyYz0iL19pbWcvZGVmYXVsdC5wbmciIGRhdGEtb3JpZ2luYWw9Ii90aHVtYnMvc21pbGUtcG5nL2Jlc3QtZnJlZS1zbWlsZS1wbmctaW1hZ2UtMi5wbmciIGFsdD0iQmVzdCBGcmVlIFNtaWxlIFBuZyBJbWFnZSBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9iZXN0LWZyZWUtc21pbGUtcG5nLWltYWdlLTIucG5nIiBhbHQ9IkJlc3QgRnJlZSBTbWlsZSBQbmcgSW1hZ2UgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIzMjAiIC8+PC9ub3NjcmlwdD48L2Rpdj48ZGl2IGNsYXNzPSJsb2dvLXRpdGxlLWRldGFpbCI+PGRpdiBjbGFzcz0ibG9nby1kZXRhaWwiPjxoMz5CZXN0IEZyZWUgU21pbGU8L2gzPjxkaXYgY2xhc3M9ImZvcm1hdCI+UmVzOjxiPjEwMDAqMTAwMDwvYj48L2Rpdj48ZGl2IGNsYXNzPSJkb3dubG9hZCI+RG93bmxvYWQ6PGI+NDkyPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUyMSIgdGl0bGU9IkhkIFNtaWxlIFBuZyBUcmFuc3BhcmVudCBCYWNrZ3JvdW5kIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9oZC1zbWlsZS1wbmctdHJhbnNwYXJlbnQtYmFja2dyb3VuZC0yMS5wbmciIGFsdD0iSGQgU21pbGUgUG5nIFRyYW5zcGFyZW50IEJhY2tncm91bmQgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIzMjAiIC8+PC9hPjxub3NjcmlwdD48aW1nIHNyYz0iL3RodW1icy9zbWlsZS1wbmcvaGQtc21pbGUtcG5nLXRyYW5zcGFyZW50LWJhY2tncm91bmQtMjEucG5nIiBhbHQ9IkhkIFNtaWxlIFBuZyBUcmFuc3BhcmVudCBCYWNrZ3JvdW5kIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiAvPjwvbm9zY3JpcHQ+PC9kaXY+PGRpdiBjbGFzcz0ibG9nby10aXRsZS1kZXRhaWwiPjxkaXYgY2xhc3M9ImxvZ28tZGV0YWlsIj48aDM+SGQgU21pbGUgUG5nPC9oMz48ZGl2IGNsYXNzPSJmb3JtYXQiPlJlczo8Yj4xMDI0KjEwMjQ8L2I+PC9kaXY+PGRpdiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkOjxiPjQxOTwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLXNtLTMgY29sLXhzLTYgZ3JpZC1pdGVtIiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZGRkOyBtYXJnaW46NXB4OyI+PGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj48ZGl2IGNsYXNzPSJpbWdjb3ZlciIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Ii9pbWcvNDY1MjAiIHRpdGxlPSJHZXQgU21pbGUgUG5nIFBpY3R1cmVzIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9nZXQtc21pbGUtcG5nLXBpY3R1cmVzLTIwLnBuZyIgYWx0PSJHZXQgU21pbGUgUG5nIFBpY3R1cmVzIFBORyBpbWFnZXMiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiAvPjwvYT48bm9zY3JpcHQ+PGltZyBzcmM9Ii90aHVtYnMvc21pbGUtcG5nL2dldC1zbWlsZS1wbmctcGljdHVyZXMtMjAucG5nIiBhbHQ9IkdldCBTbWlsZSBQbmcgUGljdHVyZXMgUE5HIGltYWdlcyIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIC8+PC9ub3NjcmlwdD48L2Rpdj48ZGl2IGNsYXNzPSJsb2dvLXRpdGxlLWRldGFpbCI+PGRpdiBjbGFzcz0ibG9nby1kZXRhaWwiPjxoMz5HZXQgU21pbGUgUG5nPC9oMz48ZGl2IGNsYXNzPSJmb3JtYXQiPlJlczo8Yj4yMDAqMjAwPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImRvd25sb2FkIj5Eb3dubG9hZDo8Yj40MDM8L2I+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy0yIGNvbC1zbS0zIGNvbC14cy02IGdyaWQtaXRlbSIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2RkZDsgbWFyZ2luOjVweDsiPjxkaXYgY2xhc3M9ImxvZ28td3JhcHBlciI+PGRpdiBjbGFzcz0iaW1nY292ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YSBocmVmPSIvaW1nLzQ2NTE1IiB0aXRsZT0iU21pbGUgUE5HIENsaXBhcnQgUE5HIGltYWdlcyI+PGltZyBjbGFzcz0ibGF6eWxvYWQiIHNyYz0iL19pbWcvZGVmYXVsdC5wbmciIGRhdGEtb3JpZ2luYWw9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLXBuZy1jbGlwYXJ0LTE0LnBuZyIgYWx0PSJTbWlsZSBQTkcgQ2xpcGFydCBQTkcgaW1hZ2VzIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS1wbmctY2xpcGFydC0xNC5wbmciIGFsdD0iU21pbGUgUE5HIENsaXBhcnQgUE5HIGltYWdlcyIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIC8+PC9ub3NjcmlwdD48L2Rpdj48ZGl2IGNsYXNzPSJsb2dvLXRpdGxlLWRldGFpbCI+PGRpdiBjbGFzcz0ibG9nby1kZXRhaWwiPjxoMz5TbWlsZSBQTkc8L2gzPjxkaXYgY2xhc3M9ImZvcm1hdCI+UmVzOjxiPjIwMCoyMDA8L2I+PC9kaXY+PGRpdiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkOjxiPjIxMjwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLXNtLTMgY29sLXhzLTYgZ3JpZC1pdGVtIiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZGRkOyBtYXJnaW46NXB4OyI+PGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj48ZGl2IGNsYXNzPSJpbWdjb3ZlciIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Ii9pbWcvNDY1MTQiIHRpdGxlPSJTbWlsZSBQTkcgVHJhbnNwYXJlbnQgSW1hZ2UgUE5HIGltYWdlcyI+PGltZyBjbGFzcz0ibGF6eWxvYWQiIHNyYz0iL19pbWcvZGVmYXVsdC5wbmciIGRhdGEtb3JpZ2luYWw9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLXBuZy10cmFuc3BhcmVudC1pbWFnZS0xMy5wbmciIGFsdD0iU21pbGUgUE5HIFRyYW5zcGFyZW50IEltYWdlIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiAvPjwvYT48bm9zY3JpcHQ+PGltZyBzcmM9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLXBuZy10cmFuc3BhcmVudC1pbWFnZS0xMy5wbmciIGFsdD0iU21pbGUgUE5HIFRyYW5zcGFyZW50IEltYWdlIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiAvPjwvbm9zY3JpcHQ+PC9kaXY+PGRpdiBjbGFzcz0ibG9nby10aXRsZS1kZXRhaWwiPjxkaXYgY2xhc3M9ImxvZ28tZGV0YWlsIj48aDM+U21pbGUgUE5HIFRyYW5zcGFyZW50PC9oMz48ZGl2IGNsYXNzPSJmb3JtYXQiPlJlczo8Yj4yMDAwKjIwMDA8L2I+PC9kaXY+PGRpdiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkOjxiPjEzOTwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLXNtLTMgY29sLXhzLTYgZ3JpZC1pdGVtIiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZGRkOyBtYXJnaW46NXB4OyI+PGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj48ZGl2IGNsYXNzPSJpbWdjb3ZlciIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Ii9pbWcvNDY1MTciIHRpdGxlPSJTbWlsZSBQTkcgSW1hZ2UgUE5HIGltYWdlcyI+PGltZyBjbGFzcz0ibGF6eWxvYWQiIHNyYz0iL19pbWcvZGVmYXVsdC5wbmciIGRhdGEtb3JpZ2luYWw9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLXBuZy1pbWFnZS0xNy5wbmciIGFsdD0iU21pbGUgUE5HIEltYWdlIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiAvPjwvYT48bm9zY3JpcHQ+PGltZyBzcmM9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLXBuZy1pbWFnZS0xNy5wbmciIGFsdD0iU21pbGUgUE5HIEltYWdlIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiAvPjwvbm9zY3JpcHQ+PC9kaXY+PGRpdiBjbGFzcz0ibG9nby10aXRsZS1kZXRhaWwiPjxkaXYgY2xhc3M9ImxvZ28tZGV0YWlsIj48aDM+U21pbGUgUE5HPC9oMz48ZGl2IGNsYXNzPSJmb3JtYXQiPlJlczo8Yj4xMDI0KjEwMjQ8L2I+PC9kaXY+PGRpdiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkOjxiPjU3PC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUwOSIgdGl0bGU9IlNtaWxlIE1vdXRoIFBORyBGcmVlIERvd25sb2FkIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS1tb3V0aC1wbmctZnJlZS1kb3dubG9hZC03LnBuZyIgYWx0PSJTbWlsZSBNb3V0aCBQTkcgRnJlZSBEb3dubG9hZCBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjIzNCIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS1tb3V0aC1wbmctZnJlZS1kb3dubG9hZC03LnBuZyIgYWx0PSJTbWlsZSBNb3V0aCBQTkcgRnJlZSBEb3dubG9hZCBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjIzNCIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPlNtaWxlIE1vdXRoIFBORzwvaDM+PGRpdiBjbGFzcz0iZm9ybWF0Ij5SZXM6PGI+MjMwMioxNjg4PC9iPjwvZGl2PjxkaXYgY2xhc3M9ImRvd25sb2FkIj5Eb3dubG9hZDo8Yj4yOTYwPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUxOCIgdGl0bGU9IlNtaWxlIFRyYW5zcGFyZW50IFBORyBQTkcgaW1hZ2VzIj48aW1nIGNsYXNzPSJsYXp5bG9hZCIgc3JjPSIvX2ltZy9kZWZhdWx0LnBuZyIgZGF0YS1vcmlnaW5hbD0iL3RodW1icy9zbWlsZS1wbmcvc21pbGUtdHJhbnNwYXJlbnQtcG5nLTE4LnBuZyIgYWx0PSJTbWlsZSBUcmFuc3BhcmVudCBQTkcgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIzMjAiIC8+PC9hPjxub3NjcmlwdD48aW1nIHNyYz0iL3RodW1icy9zbWlsZS1wbmcvc21pbGUtdHJhbnNwYXJlbnQtcG5nLTE4LnBuZyIgYWx0PSJTbWlsZSBUcmFuc3BhcmVudCBQTkcgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIzMjAiIC8+PC9ub3NjcmlwdD48L2Rpdj48ZGl2IGNsYXNzPSJsb2dvLXRpdGxlLWRldGFpbCI+PGRpdiBjbGFzcz0ibG9nby1kZXRhaWwiPjxoMz5TbWlsZSBUcmFuc3BhcmVudDwvaDM+PGRpdiBjbGFzcz0iZm9ybWF0Ij5SZXM6PGI+MjQwMCoyNDAwPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImRvd25sb2FkIj5Eb3dubG9hZDo8Yj4xNDU3PC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUxMCIgdGl0bGU9IkRvd25sb2FkIFNtaWxlIEhpZ2ggUmVzb2x1dGlvbiBQTkcgaW1hZ2VzIj48aW1nIGNsYXNzPSJsYXp5bG9hZCIgc3JjPSIvX2ltZy9kZWZhdWx0LnBuZyIgZGF0YS1vcmlnaW5hbD0iL3RodW1icy9zbWlsZS1wbmcvZG93bmxvYWQtc21pbGUtaGlnaC1yZXNvbHV0aW9uLTgucG5nIiBhbHQ9IkRvd25sb2FkIFNtaWxlIEhpZ2ggUmVzb2x1dGlvbiBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9kb3dubG9hZC1zbWlsZS1oaWdoLXJlc29sdXRpb24tOC5wbmciIGFsdD0iRG93bmxvYWQgU21pbGUgSGlnaCBSZXNvbHV0aW9uIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiAvPjwvbm9zY3JpcHQ+PC9kaXY+PGRpdiBjbGFzcz0ibG9nby10aXRsZS1kZXRhaWwiPjxkaXYgY2xhc3M9ImxvZ28tZGV0YWlsIj48aDM+RG93bmxvYWQgU21pbGUgSGlnaDwvaDM+PGRpdiBjbGFzcz0iZm9ybWF0Ij5SZXM6PGI+MTYwMCoxNjAwPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImRvd25sb2FkIj5Eb3dubG9hZDo8Yj4xMzQ2PC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUwNiIgdGl0bGU9IkVtb2ppIFNtaWxlIERlc2lnbnMgUG5nIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9lbW9qaS1zbWlsZS1kZXNpZ25zLXBuZy00LnBuZyIgYWx0PSJFbW9qaSBTbWlsZSBEZXNpZ25zIFBuZyBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9lbW9qaS1zbWlsZS1kZXNpZ25zLXBuZy00LnBuZyIgYWx0PSJFbW9qaSBTbWlsZSBEZXNpZ25zIFBuZyBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPkVtb2ppIFNtaWxlIERlc2lnbnM8L2gzPjxkaXYgY2xhc3M9ImZvcm1hdCI+UmVzOjxiPjI1OTIqMjU5MjwvYj48L2Rpdj48ZGl2IGNsYXNzPSJkb3dubG9hZCI+RG93bmxvYWQ6PGI+MTI4OTwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLXNtLTMgY29sLXhzLTYgZ3JpZC1pdGVtIiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZGRkOyBtYXJnaW46NXB4OyI+PGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj48ZGl2IGNsYXNzPSJpbWdjb3ZlciIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Ii9pbWcvNDY1MDMiIHRpdGxlPSJTbWlsZSwgVGVldGggRW1vamkgUG5nIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS10ZWV0aC1lbW9qaS1wbmctMS5wbmciIGFsdD0iU21pbGUsIFRlZXRoIEVtb2ppIFBuZyBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjI5MSIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS10ZWV0aC1lbW9qaS1wbmctMS5wbmciIGFsdD0iU21pbGUsIFRlZXRoIEVtb2ppIFBuZyBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjI5MSIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPlNtaWxlLCBUZWV0aCBFbW9qaTwvaDM+PGRpdiBjbGFzcz0iZm9ybWF0Ij5SZXM6PGI+MTAyNCo5MzI8L2I+PC9kaXY+PGRpdiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkOjxiPjExMzk8L2I+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy0yIGNvbC1zbS0zIGNvbC14cy02IGdyaWQtaXRlbSIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2RkZDsgbWFyZ2luOjVweDsiPjxkaXYgY2xhc3M9ImxvZ28td3JhcHBlciI+PGRpdiBjbGFzcz0iaW1nY292ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YSBocmVmPSIvaW1nLzQ2NTExIiB0aXRsZT0iU21pbGUgVHJhbnNwYXJlbnQgQmFja2dyb3VuZCBQTkcgaW1hZ2VzIj48aW1nIGNsYXNzPSJsYXp5bG9hZCIgc3JjPSIvX2ltZy9kZWZhdWx0LnBuZyIgZGF0YS1vcmlnaW5hbD0iL3RodW1icy9zbWlsZS1wbmcvc21pbGUtdHJhbnNwYXJlbnQtYmFja2dyb3VuZC05LnBuZyIgYWx0PSJTbWlsZSBUcmFuc3BhcmVudCBCYWNrZ3JvdW5kIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzE0IiAvPjwvYT48bm9zY3JpcHQ+PGltZyBzcmM9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLXRyYW5zcGFyZW50LWJhY2tncm91bmQtOS5wbmciIGFsdD0iU21pbGUgVHJhbnNwYXJlbnQgQmFja2dyb3VuZCBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMxNCIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPlNtaWxlIFRyYW5zcGFyZW50PC9oMz48ZGl2IGNsYXNzPSJmb3JtYXQiPlJlczo8Yj4yNDAwKjIzNjA8L2I+PC9kaXY+PGRpdiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkOjxiPjk4NDwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLXNtLTMgY29sLXhzLTYgZ3JpZC1pdGVtIiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZGRkOyBtYXJnaW46NXB4OyI+PGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj48ZGl2IGNsYXNzPSJpbWdjb3ZlciIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Ii9pbWcvNDY1MDgiIHRpdGxlPSJEb3dubG9hZCBTbWlsZSBGYWNlIFBuZyBDbGlwYXJ0IFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9kb3dubG9hZC1zbWlsZS1mYWNlLXBuZy1jbGlwYXJ0LTYucG5nIiBhbHQ9IkRvd25sb2FkIFNtaWxlIEZhY2UgUG5nIENsaXBhcnQgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIzMjAiIC8+PC9hPjxub3NjcmlwdD48aW1nIHNyYz0iL3RodW1icy9zbWlsZS1wbmcvZG93bmxvYWQtc21pbGUtZmFjZS1wbmctY2xpcGFydC02LnBuZyIgYWx0PSJEb3dubG9hZCBTbWlsZSBGYWNlIFBuZyBDbGlwYXJ0IFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiAvPjwvbm9zY3JpcHQ+PC9kaXY+PGRpdiBjbGFzcz0ibG9nby10aXRsZS1kZXRhaWwiPjxkaXYgY2xhc3M9ImxvZ28tZGV0YWlsIj48aDM+RG93bmxvYWQgU21pbGUgRmFjZTwvaDM+PGRpdiBjbGFzcz0iZm9ybWF0Ij5SZXM6PGI+NTEyKjUxMjwvYj48L2Rpdj48ZGl2IGNsYXNzPSJkb3dubG9hZCI+RG93bmxvYWQ6PGI+NjY5PC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUwNyIgdGl0bGU9IlBuZyBGb3JtYXQgSW1hZ2VzIE9mIFNtaWxlIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9wbmctZm9ybWF0LWltYWdlcy1vZi1zbWlsZS01LnBuZyIgYWx0PSJQbmcgRm9ybWF0IEltYWdlcyBPZiBTbWlsZSBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9wbmctZm9ybWF0LWltYWdlcy1vZi1zbWlsZS01LnBuZyIgYWx0PSJQbmcgRm9ybWF0IEltYWdlcyBPZiBTbWlsZSBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPlBuZyBGb3JtYXQgSW1hZ2VzPC9oMz48ZGl2IGNsYXNzPSJmb3JtYXQiPlJlczo8Yj4xMDI0KjEwMjQ8L2I+PC9kaXY+PGRpdiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkOjxiPjM4NDwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLXNtLTMgY29sLXhzLTYgZ3JpZC1pdGVtIiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZGRkOyBtYXJnaW46NXB4OyI+PGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj48ZGl2IGNsYXNzPSJpbWdjb3ZlciIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Ii9pbWcvNDY1MTMiIHRpdGxlPSJTbWlsZSBCYWNrZ3JvdW5kIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS1iYWNrZ3JvdW5kLTExLnBuZyIgYWx0PSJTbWlsZSBCYWNrZ3JvdW5kIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMjAyIiAvPjwvYT48bm9zY3JpcHQ+PGltZyBzcmM9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLWJhY2tncm91bmQtMTEucG5nIiBhbHQ9IlNtaWxlIEJhY2tncm91bmQgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIyMDIiIC8+PC9ub3NjcmlwdD48L2Rpdj48ZGl2IGNsYXNzPSJsb2dvLXRpdGxlLWRldGFpbCI+PGRpdiBjbGFzcz0ibG9nby1kZXRhaWwiPjxoMz5TbWlsZTwvaDM+PGRpdiBjbGFzcz0iZm9ybWF0Ij5SZXM6PGI+MjE2MyoxMzY5PC9iPjwvZGl2PjxkaXYgY2xhc3M9ImRvd25sb2FkIj5Eb3dubG9hZDo8Yj4yNzM8L2I+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy0yIGNvbC1zbS0zIGNvbC14cy02IGdyaWQtaXRlbSIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2RkZDsgbWFyZ2luOjVweDsiPjxkaXYgY2xhc3M9ImxvZ28td3JhcHBlciI+PGRpdiBjbGFzcz0iaW1nY292ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YSBocmVmPSIvaW1nLzQ2NTEyIiB0aXRsZT0iRG93bmxvYWQgU21pbGUgSWNvbiBDbGlwYXJ0IFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9kb3dubG9hZC1zbWlsZS1pY29uLWNsaXBhcnQtMTAucG5nIiBhbHQ9IkRvd25sb2FkIFNtaWxlIEljb24gQ2xpcGFydCBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjIyOCIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9kb3dubG9hZC1zbWlsZS1pY29uLWNsaXBhcnQtMTAucG5nIiBhbHQ9IkRvd25sb2FkIFNtaWxlIEljb24gQ2xpcGFydCBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjIyOCIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPkRvd25sb2FkIFNtaWxlIEljb248L2gzPjxkaXYgY2xhc3M9ImZvcm1hdCI+UmVzOjxiPjYwMCo0Mjk8L2I+PC9kaXY+PGRpdiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkOjxiPjIzMzwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLXNtLTMgY29sLXhzLTYgZ3JpZC1pdGVtIiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZGRkOyBtYXJnaW46NXB4OyI+PGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj48ZGl2IGNsYXNzPSJpbWdjb3ZlciIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Ii9pbWcvNDY1MjMiIHRpdGxlPSJTbWlsZSBUcmFuc3BhcmVudCBCYWNrZ3JvdW5kIDIzIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS10cmFuc3BhcmVudC1iYWNrZ3JvdW5kLTIzLnBuZyIgYWx0PSJTbWlsZSBUcmFuc3BhcmVudCBCYWNrZ3JvdW5kIDIzIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiAvPjwvYT48bm9zY3JpcHQ+PGltZyBzcmM9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLXRyYW5zcGFyZW50LWJhY2tncm91bmQtMjMucG5nIiBhbHQ9IlNtaWxlIFRyYW5zcGFyZW50IEJhY2tncm91bmQgMjMgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIzMjAiIC8+PC9ub3NjcmlwdD48L2Rpdj48ZGl2IGNsYXNzPSJsb2dvLXRpdGxlLWRldGFpbCI+PGRpdiBjbGFzcz0ibG9nby1kZXRhaWwiPjxoMz5TbWlsZSBUcmFuc3BhcmVudCBCYWNrZ3JvdW5kPC9oMz48ZGl2IGNsYXNzPSJmb3JtYXQiPlJlczo8Yj41MTIqNTEyPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImRvd25sb2FkIj5Eb3dubG9hZDo8Yj4yMjU8L2I+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy0yIGNvbC1zbS0zIGNvbC14cy02IGdyaWQtaXRlbSIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2RkZDsgbWFyZ2luOjVweDsiPjxkaXYgY2xhc3M9ImxvZ28td3JhcHBlciI+PGRpdiBjbGFzcz0iaW1nY292ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YSBocmVmPSIvaW1nLzQ2NTI0IiB0aXRsZT0iU21pbGUgTW91dGggTGlwcyBQTkcgUGljIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS1tb3V0aC1saXBzLXBuZy1waWMtMjQucG5nIiBhbHQ9IlNtaWxlIE1vdXRoIExpcHMgUE5HIFBpYyBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjIwMCIgLz48L2E+PG5vc2NyaXB0PjxpbWcgc3JjPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS1tb3V0aC1saXBzLXBuZy1waWMtMjQucG5nIiBhbHQ9IlNtaWxlIE1vdXRoIExpcHMgUE5HIFBpYyBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjIwMCIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPlNtaWxlIE1vdXRoIExpcHM8L2gzPjxkaXYgY2xhc3M9ImZvcm1hdCI+UmVzOjxiPjMwMDAqMTg3ODwvYj48L2Rpdj48ZGl2IGNsYXNzPSJkb3dubG9hZCI+RG93bmxvYWQ6PGI+MTc5PC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUyNyIgdGl0bGU9IlNtaWxlIEVtb3RpY29uIFBORyBQaWN0dXJlIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy9zbWlsZS1lbW90aWNvbi1wbmctcGljdHVyZS0yNy5wbmciIGFsdD0iU21pbGUgRW1vdGljb24gUE5HIFBpY3R1cmUgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIzMTgiIC8+PC9hPjxub3NjcmlwdD48aW1nIHNyYz0iL3RodW1icy9zbWlsZS1wbmcvc21pbGUtZW1vdGljb24tcG5nLXBpY3R1cmUtMjcucG5nIiBhbHQ9IlNtaWxlIEVtb3RpY29uIFBORyBQaWN0dXJlIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzE4IiAvPjwvbm9zY3JpcHQ+PC9kaXY+PGRpdiBjbGFzcz0ibG9nby10aXRsZS1kZXRhaWwiPjxkaXYgY2xhc3M9ImxvZ28tZGV0YWlsIj48aDM+U21pbGUgRW1vdGljb24gUE5HPC9oMz48ZGl2IGNsYXNzPSJmb3JtYXQiPlJlczo8Yj4yNDA4KjI0MDA8L2I+PC9kaXY+PGRpdiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkOjxiPjE0NTwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLXNtLTMgY29sLXhzLTYgZ3JpZC1pdGVtIiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZGRkOyBtYXJnaW46NXB4OyI+PGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj48ZGl2IGNsYXNzPSJpbWdjb3ZlciIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Ii9pbWcvNDY1MDUiIHRpdGxlPSJTbWlsZSBMaXBzIFBuZyBJbWFnZXMgUE5HIGltYWdlcyI+PGltZyBjbGFzcz0ibGF6eWxvYWQiIHNyYz0iL19pbWcvZGVmYXVsdC5wbmciIGRhdGEtb3JpZ2luYWw9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLWxpcHMtcG5nLWltYWdlcy0zLnBuZyIgYWx0PSJTbWlsZSBMaXBzIFBuZyBJbWFnZXMgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIxODMiIC8+PC9hPjxub3NjcmlwdD48aW1nIHNyYz0iL3RodW1icy9zbWlsZS1wbmcvc21pbGUtbGlwcy1wbmctaW1hZ2VzLTMucG5nIiBhbHQ9IlNtaWxlIExpcHMgUG5nIEltYWdlcyBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjE4MyIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPlNtaWxlIExpcHMgUG5nPC9oMz48ZGl2IGNsYXNzPSJmb3JtYXQiPlJlczo8Yj4xNjE2KjkyNTwvYj48L2Rpdj48ZGl2IGNsYXNzPSJkb3dubG9hZCI+RG93bmxvYWQ6PGI+MTMyPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUyMiIgdGl0bGU9IldvbWVuIEVtb2ppIFNtaWxlIFBORyBpbWFnZXMiPjxpbWcgY2xhc3M9Imxhenlsb2FkIiBzcmM9Ii9faW1nL2RlZmF1bHQucG5nIiBkYXRhLW9yaWdpbmFsPSIvdGh1bWJzL3NtaWxlLXBuZy93b21lbi1lbW9qaS1zbWlsZS0yMi5wbmciIGFsdD0iV29tZW4gRW1vamkgU21pbGUgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIzMTciIC8+PC9hPjxub3NjcmlwdD48aW1nIHNyYz0iL3RodW1icy9zbWlsZS1wbmcvd29tZW4tZW1vamktc21pbGUtMjIucG5nIiBhbHQ9IldvbWVuIEVtb2ppIFNtaWxlIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzE3IiAvPjwvbm9zY3JpcHQ+PC9kaXY+PGRpdiBjbGFzcz0ibG9nby10aXRsZS1kZXRhaWwiPjxkaXYgY2xhc3M9ImxvZ28tZGV0YWlsIj48aDM+V29tZW4gRW1vamk8L2gzPjxkaXYgY2xhc3M9ImZvcm1hdCI+UmVzOjxiPjkwMCo4OTI8L2I+PC9kaXY+PGRpdiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkOjxiPjEwODwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTIgY29sLXNtLTMgY29sLXhzLTYgZ3JpZC1pdGVtIiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZGRkOyBtYXJnaW46NXB4OyI+PGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj48ZGl2IGNsYXNzPSJpbWdjb3ZlciIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Ii9pbWcvNDY1MTYiIHRpdGxlPSJTbWlsZSBJY29uIFN5bWJvbCBQTkcgaW1hZ2VzIj48aW1nIGNsYXNzPSJsYXp5bG9hZCIgc3JjPSIvX2ltZy9kZWZhdWx0LnBuZyIgZGF0YS1vcmlnaW5hbD0iL3RodW1icy9zbWlsZS1wbmcvc21pbGUtaWNvbi1zeW1ib2wtMTUucG5nIiBhbHQ9IlNtaWxlIEljb24gU3ltYm9sIFBORyBpbWFnZXMiIHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiAvPjwvYT48bm9zY3JpcHQ+PGltZyBzcmM9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLWljb24tc3ltYm9sLTE1LnBuZyIgYWx0PSJTbWlsZSBJY29uIFN5bWJvbCBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPlNtaWxlIEljb248L2gzPjxkaXYgY2xhc3M9ImZvcm1hdCI+UmVzOjxiPjEwMjQqMTAyNDwvYj48L2Rpdj48ZGl2IGNsYXNzPSJkb3dubG9hZCI+RG93bmxvYWQ6PGI+MTAzPC9iPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctMiBjb2wtc20tMyBjb2wteHMtNiBncmlkLWl0ZW0iIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZGQ7IG1hcmdpbjo1cHg7Ij48ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPjxkaXYgY2xhc3M9ImltZ2NvdmVyIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGEgaHJlZj0iL2ltZy80NjUyNSIgdGl0bGU9IlNtaWxlIE1vdXRoIEhpZ2gtcXVhbGl0eSBQbmcgUE5HIGltYWdlcyI+PGltZyBjbGFzcz0ibGF6eWxvYWQiIHNyYz0iL19pbWcvZGVmYXVsdC5wbmciIGRhdGEtb3JpZ2luYWw9Ii90aHVtYnMvc21pbGUtcG5nL3NtaWxlLW1vdXRoLWhpZ2gtcXVhbGl0eS1wbmctMjUucG5nIiBhbHQ9IlNtaWxlIE1vdXRoIEhpZ2gtcXVhbGl0eSBQbmcgUE5HIGltYWdlcyIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIxODQiIC8+PC9hPjxub3NjcmlwdD48aW1nIHNyYz0iL3RodW1icy9zbWlsZS1wbmcvc21pbGUtbW91dGgtaGlnaC1xdWFsaXR5LXBuZy0yNS5wbmciIGFsdD0iU21pbGUgTW91dGggSGlnaC1xdWFsaXR5IFBuZyBQTkcgaW1hZ2VzIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjE4NCIgLz48L25vc2NyaXB0PjwvZGl2PjxkaXYgY2xhc3M9ImxvZ28tdGl0bGUtZGV0YWlsIj48ZGl2IGNsYXNzPSJsb2dvLWRldGFpbCI+PGgzPlNtaWxlIE1vdXRoIEhpZ2gtcXVhbGl0eTwvaDM+PGRpdiBjbGFzcz0iZm9ybWF0Ij5SZXM6PGI+Mjc1NSoxNTg4PC9iPjwvZGl2PjxkaXYgY2xhc3M9ImRvd25sb2FkIj5Eb3dubG9hZDo8Yj44NTwvYj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0icGFnZXItYm90dG9tIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhci1mb290ZXIiPjwvZGl2Pjxmb290ZXI+PGRpdiBjbGFzcz0id3JhcHBlciI+PGRpdiBjbGFzcz0ibG9nby1uYXYiPjxkaXYgY2xhc3M9ImxvZ28iPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmZyZWVpY29uc3BuZy5jb20vIiB0aXRsZT0iRnJlZSBJY29ucyBQTkciPjxpbWcgc3JjPSIvX2ltZy9mb290ZXItbG9nby5wbmciIGFsdD0iRnJlZSBJY29ucyBQTkciIC8+PC9hPjwvZGl2PjxkaXYgY2xhc3M9ImZvb3Rlci1uYXYiPjx1bCBjbGFzcz0ibGlzdC11bnN0eWxlZCI+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmZyZWVpY29uc3BuZy5jb20vY29weXJpZ2h0LXBvbGljeS5odG1sIj5Db3B5cmlnaHQgUG9saWN5PC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmZyZWVpY29uc3BuZy5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT48L2xpPjxsaSBzdHlsZT0iYm9yZGVyOm5vbmU7Ij48YSBocmVmPSJodHRwczovL3d3dy5mcmVlaWNvbnNwbmcuY29tL2NvbnRhY3QuaHRtbCI+Q29udGFjdDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNvY2lhbC10ZXh0Ij48ZGl2IGNsYXNzPSJzb2NpYWwiPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9mcmVlaWNvbnNwbmciIHRhcmdldD0iX2JsYW5rIj48aW1nIHNyYz0iL19pbWcvaWNvbi1mb290ZXItZmFjZWJvb2sucG5nIiBhbHQ9IkZhY2Vib29rIiAvPjwvYT48YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2ZyZWVpY29uc3BuZyIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSIvX2ltZy9pY29uLWZvb3Rlci10d2l0dGVyLnBuZyIgYWx0PSJUd2l0dGVyIiAvPjwvYT48YSBocmVmPSJodHRwczovL3BsdXMuZ29vZ2xlLmNvbS8rZnJlZWljb25zcG5nIiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Ii9faW1nL2ljb24tZm9vdGVyLWdvb2dsZS5wbmciIGFsdD0iR29vZ2xlKyIgLz48L2E+PGEgaHJlZj0iaHR0cHM6Ly93d3cucGludGVyZXN0LmNvbS9mcmVlaWNvbnNwbmciIHRhcmdldD0iX2JsYW5rIj48aW1nIHNyYz0iL19pbWcvaWNvbi1mb290ZXItcGludGVyZXN0LnBuZyIgYWx0PSJQaW50ZXJlc3QiIC8+PC9hPjwvZGl2PjxkaXYgY2xhc3M9InRleHQiPkNvcHlyaWdodCAyMDE0IMKpIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmZyZWVpY29uc3BuZy5jb20vIiB0aXRsZT0iRnJlZSBJY29ucyBQTkciPmZyZWVpY29uc3BuZy5jb208L2E+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj48L2Rpdj48L2Zvb3Rlcj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMy4zLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+PHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGFnZWFkMi5nb29nbGVzeW5kaWNhdGlvbi5jb20vcGFnZWFkL2pzL2Fkc2J5Z29vZ2xlLmpzP2NsaWVudD1jYS1wdWItMDk5NzY0OTkwMTE2MzI4NCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvY29va2llY29uc2VudDIvMy4wLjMvY29va2llY29uc2VudC5taW4uY3NzIiAvPjxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9jb29raWVjb25zZW50Mi8zLjAuMy9jb29raWVjb25zZW50Lm1pbi5qcyI+PC9zY3JpcHQ+PHNjcmlwdD53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGZ1bmN0aW9uKCl7CndpbmRvdy5jb29raWVjb25zZW50LmluaXRpYWxpc2UoeyAicGFsZXR0ZSI6IHsgInBvcHVwIjogeyAiYmFja2dyb3VuZCI6ICIjMjUyZTM5IiB9LCAiYnV0dG9uIjogeyAiYmFja2dyb3VuZCI6ICIjMTRhN2QwIiB9IH0sICJ0aGVtZSI6ICJjbGFzc2ljIiwgImNvbnRlbnQiOiB7ICJtZXNzYWdlIjogIlRoaXMgd2Vic2l0ZSB1c2VzIGNvb2tpZXMgdG8gYW5hbHl6ZSB0cmFmZmljIGFuZCBmb3IgYWR2ZXJ0aXNlbWVudHMuIEJ5IGNvbnRpbnVpbmcgeW91IGFncmVlIHRvIHRoZSB1c2Ugb2YgdGhlc2UgY29va2llcy4iLCAiaHJlZiI6ICIvcHJpdmFjeS5odG1sI2Nvb2tpZXMiIH0KfSl9KTsKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7ICQoImltZyIpLm9uKCJjb250ZXh0bWVudSIsZnVuY3Rpb24oZSl7IHJldHVybiBmYWxzZTsgfSk7Cn0pOyA8L3NjcmlwdD48c2NyaXB0IGFzeW5jIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbWFzb25yeS1sYXlvdXRANC4yLjAvZGlzdC9tYXNvbnJ5LnBrZ2QubWluLmpzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3VucGtnLmNvbS9pbWFnZXNsb2FkZWRANC9pbWFnZXNsb2FkZWQucGtnZC5taW4uanMiPjwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2pxdWVyeS5sYXp5bG9hZC8xLjkuMS9qcXVlcnkubGF6eWxvYWQubWluLmpzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgeyAkKCIjZ3JpZCIpLmltYWdlc0xvYWRlZCgpLmRvbmUoZnVuY3Rpb24gKCkgeyAkKCIjZ3JpZCIpLm1hc29ucnkoeyBpdGVtU2VsZWN0b3I6ICcuZ3JpZC1pdGVtJyB9KTsgfSk7ICQoImltZy5sYXp5bG9hZCIpLmxhenlsb2FkKHsgc2tpcF9pbnZpc2libGUgOiBmYWxzZSB9KTsgfSk7PC9zY3JpcHQ+PC9kaXY+PC9ib2R5PjwvaHRtbD4="}'); +} +$data = json_decode($data, true); +if($data == null) { + err("invalid POST json"); +} + +if(!array_key_exists('image', $data)) { + err("no image field in POST"); +} + +$img = $data['image']; + +$prefix = "data:image/png;base64,"; +if (substr($img, 0, strlen($prefix)) == $prefix) { + $img = substr($img, strlen($prefix)); +} else { + err("image field is not a base64 encoded png"); +} + +// decode it +$dec = base64_decode($img, true /*strict*/); + +if(!$dec) { + err("invalid image base64 encoding"); +} + +$imagick = new Imagick(); +try { + $imagick->readImageBlob($dec); +} +catch(Exception $e) { + err("Couldn't parse image"); +} + +$histo = getImageHistogram($imagick, 5); +print json_encode(["top_colors" => $histo]); |