Scraping data using Nokogiri - ruby-on-rails

I am trying to scrape data using Nokogiri. The code I am trying to access is:
<div class="main-header">
<span>Make More Money</span>
</div>
I want to get the text "Make More Money", only. Here is my code:
url = 'xyz.com'
doc = Nokogiri::HTML(open(url))
doc.at_css('main-header span').text
Using this I am getting a NilClass error. What do I need to do to fix this?

The . for the class main-header is missing. It should be
doc.at_css('.main-header span').text

Related

How to find text on a page using Nokogiri

I am trying to find the best way to find a word on a page using Nokogiri.
I have a page which has the following text.
<p>Modelo: ABC123-A</p>
I would like to find the "Modelo:" text, and then get the model number after it.
I have had a look around but can't seem to find. So, I thought I would post on here and see if anyone with experience of Nokogiri could shed some light on this for me.
Use p:contains selector and get the matching p nodes.
doc = Nokogiri::HTML('<html><body><p>Modelo: ABC123-A</p><br/><p>Nothing here</p><p>Modelo: 4321</p></body></html>')
doc.css('p:contains("Modelo")').map { |x| x.text.split(': ').last }
#=> ["ABC123-A", "4321"]
A simple example:
doc = Nokogiri::HTML('<html><body><p>Modelo: ABC123-A</p></body></html>')
doc.css('p').first.content # => Modelo: ABC123-A
str.split( ': ' )[-1] # => ABC123-A
You could also try Oga, it's lighter than Nokogiri.

Nokogiri results different from brower inspect

I am trying to scrape a site but the results returned for just the links is different from when I inspect it with the browser.
In my browser I get normal links but all the a HREF links all become javascript:void(0); from Nokogiri.
Here is the site:
https://www.ctgoodjobs.hk/jobs/part-time
Here is my code:
url = "https://www.ctgoodjobs.hk/jobs/part-time"
response = open(url) rescue nil
next unless response
doc = Nokogiri::HTML(open(url))
links = doc.search('.job-title > a').text
is not that easy, urls are "obscured" using a js function, that's why you're getting javascript: void(0) when asking for the hrefs... looking at the html, there are some hidden inputs for each link, and, there is a preview url that you can use to build the job preview url (if that's what you're looking for), so you have this:
<div class="result-list-job current-view">
<input type="hidden" name="job_id" value="04375145">
<input type="hidden" name="each_job_title_url" value="barista-senior-barista-咖啡調配員">
<h2 class="job-title">Barista/ Senior Barista 咖 啡 調 配 員</h2>
<h3 class="job-company">PACIFIC COFFEE CO. LTD.</h3>
<div class="job-description">
<ul class="job-desc-list clearfix">
<li class="job-desc-loc job-desc-small-icon">-</li>
<li class="job-desc-work-exp">0-1 yr(s)</li>
<li class="job-desc-salary job-desc-small-icon">-</li>
<li class="job-desc-post-date">09/11/16</li>
</ul>
</div>
<a class="job-save-btn" title="save this job" style="display: inline;"> </a>
<div class="job-batch-apply"><span class="checkbox" style="background-position: 0px 0px;"></span><input type="checkbox" class="styled" name="job_checkbox" value="04375145"></div>
<div class="job-cat job-cat-de"></div>
</div>
then, you can retrieve each job_id from those inputs, like:
inputs = doc.search('//input[#name="job_id"]')
and then build the urls (i found the base url at joblist_preview.js:
urls = inputs.map do |input|
"https://www.ctgoodjobs.hk/english/jobdetails/details.asp?m_jobid=#{input['value']}&joblistmode=previewlist&ga_channel=ct"
end
Take the output of a browser and that of a tool like wget, curl or nokogiri and you will find the HTML the browser presents can differ drastically from the raw HTML.
Browsers these days can process DHTML, Nokogiri doesn't. You can only retrieve the raw HTML using something that lets you see the content without the browser, like the above mentioned tools, then compare that with what you see in a text editor, or what nokogiri shows you. Don't trust the browser - they're known to lie because they want to make you happy.
Here's a quick glimpse into what the raw HTML contains, generated using:
$ nokogiri "https://www.ctgoodjobs.hk/jobs/part-time"
Nokogiri dropped me into IRB:
Your document is stored in #doc...
Welcome to NOKOGIRI. You are using ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]. Have fun ;)
Counting the hits found by the selector returns:
>> #doc.search('.job-title > a').size
30
Displaying the text found shows:
>> #doc.search('.job-title > a').map(&:text)
[
[ 0] "嬰 兒 奶 粉 沖 調 機 - 兼 職 產 品 推 廣 員 Part Time Promoter (時 薪 高 達 HK$90, 另 設 銷 售 佣 金 )",
...
[29] "Customer Services Representative (Part-time)"
]
Looking at the actual href:
>> #doc.search('.job-title > a').map{ |n| n['href'] }
[
[ 0] "javascript:void(0);",
...
[29] "javascript:void(0);"
]
You can tell the HTML doesn't contain anything but what Nokogiri is telling you, so the browser is post-processing the HTML, processing the DHTML and modifying the page you see if you use something to look at the HTML. So, the short fix is, don't trust the browser if you want to know what the server sends to you.
This is why scraping isn't very reliable and you should use an API if at all possible. If you can't, then you're going to have to roll up your sleeves and dig into the JavaScript and manually interpret what it's doing, then retrieve the data and parse it into something useful.
Your code can be cleaned up and simplified. I'd write it much more simply as:
url = "https://www.ctgoodjobs.hk/jobs/part-time"
doc = Nokogiri::HTML(open(url))
links = doc.search('.job-title > a').map(&:text)
The use of search(...).text is a big mistake. text, when applied to a NodeSet, will concatenate the text of each contained node, making it extremely difficult to retrieve the individual text. Consider this:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
<p>bar</p>
</body>
</html>
EOT
doc.search('p').class # => Nokogiri::XML::NodeSet
doc.search('p').text # => "foobar"
doc.search('p').map(&:text) # => ["foo", "bar"]
The first result foobar would require being split apart to be useful, and unless you have special knowledge of the content, trying to figure out how to do it will be a major pain.
Instead, use map to iterate through the elements and apply &:text to each one, returning an array of each element's text.
See "How to avoid joining all text from Nodes when scraping" and "Taking apart a DHTML page" also.

Can't Get NameSpace from Parsing XML File Using Nokogiri

I'm looking to parse a RSS feed such as http://feeds.soundcloud.com/users/soundcloud:users:70685608/sounds.rss using Nokogiri. However despite how many different ways I try to parse the document, I'm unable to get the data elements I want.
For example, if I want to get the itunes:name block, I've tried the following below and none of these is returning what I want.
page = HTTParty.get('http://feeds.soundcloud.com/users/soundcloud:users:70685608/sounds.rss')
parse_feed = Nokogiri::HTML(page)
#tried 1
parse_feed.css('channel|itunes:owner')
#tried 2
parse_feed.css('itunes:name')
#tried 3
parse_feed.xpath('//itunes:email')
Am I just way off here on my xpath or css searches to get the block I'm looking for?
It worked for me by switching Nokogiri::HTML(page) with Nokogiri::XML(page). Then, I could use xpath to extract the itunes:name block:
page = HTTParty.get('http://feeds.soundcloud.com/users/soundcloud:users:70685608/sounds.rss')
parse_feed = Nokogiri::XML(page)
itunes_name = parse_feed.xpath("//itunes:name")
# do stuff

Image Data URI Active record Rails

I am running an API Request in the Rails Console to return the data of a movie poster.
I start by specifying what the movie is so,
#movies = Movie.find('Iron Man')
It then returns the one of the posters' urls
http://d3gtl9l2a4fn1j.cloudfront.net/t/p/w92/s2IG9qXfhJYxIttKyroYFBsHwzQ.jpg
I then run a code to return the above poster's data, this is what it gives
> #movie.posters.first.data
=> "\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xFF\xDB\x00C\x00\x03\x02\x02\x03\x02\x02\x03\x03\x03\x03\x04\x03\x03\x04\x05\b\x05\x05\x04\x04\x05\n\a\a\x06\b\f\n\f\f\v\n\v\v\r\x0E\x12\x10\r\x0E\x11\x0E\v\v\x10\x16\x10\x11\x13\x14\x15\x15\x15\f\x0F\x17\x18\x16\x14\x18\x12\x14\x15\x14\xFF\xDB\x00C\x01\x03\x04\x04\x05\x04\x05\t\x05\x05\t\x14\r\v\r\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\xFF\xC0\x00\x11\b\x00\x8A\x00\\\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01\xFF\xC4\x00\x1D\x00\x00\x01\x04\x03\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x04\x05\x06\b\x00\x03\t\x02\x01\xFF\xC4\x00<\x10\x00\x01\x03\x02\x05\x01\a\x02\x05\x01\x05\t\x00\x00\x00\x00\x01\x02\x03\x04\x05\x11\x00\x06\a\x12!1\b\x13\x14\"AQa2q\x15R\x81\x91\xA1\t\x16#b\xC1\xD1\x17$34Br\x82\xA2\xB1\xFF\xC4\x00\x1C\x01\x00\x01\x05\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x02\x03\x04\x06\x01\a\b\xFF\xC4\x007\x11\x00\x01\x03\x03\x03\x01\x05\a\x03\x04\x01\x05\x00\x00\x00\x00\x01\x00\x02\x03\x04\x11!\x05\x121A\x13\"Qaq\x06\x14\x81\x91\xA1\xB1\xD12B\xC1#R\xF0\xF1\x15$b\x92\xA2\xE1\xFF\xDA\x00\f\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xE6\xEEV\x88\x95\xBA\x01\x1C\xDE\xF8\xD5\xC4\xD0\x02\x0FR\xE3d\x7F\xD1\xFC\x9C\xAC\xC5^\x8FLi!oMi\xF8\x8D\x8FR\xA5\xB2\xB0\x91\xFA\x92\x06\x02{E'c\xA5\xCF'\xF6\x8B\xFC\x88)\xDA1\x0E\xD4\"\a\xA9\xB7\xCC\x10\xAB\x86t\xA49G\xAC\xCAa\xD4\x94).\x90\x12G\xCE\x01R\xC8%\x8C8-5S\v\x1CA\xF1M\xD4f\x82\xEA\r\xF1{\x10m\x89f6aM\xA7\x03z\xB0:A\xA2U\x9DJ\xACJ\x8DN\x88\xB7\x9CDr\xFAR\x94\xF2#8\xC6\xD7\xEA,\xA5`.=V\x92\b7\x12J7\xF6\xFB\xD2Yz\x7F\x96t\x84xE7Og)1O.\xDB\x81!$-\xC4\x9Fbw_\xF7\xC5m\x182)% \xF7\xA4!\xE7\xD0\x8B\x03\xE9\x84r\x93eD\x124\xF2\xD2G\xC3\xFD\xAA+^\xA5?N\x10\x9DxY\x13\x19/\xB5\xF2\x8D\xEAE\xFF\x00t+\e\xF8_u\x84\xAF\x8Fc\xC1\xBF?\x9B\x7F\t\xB5\n\xDB\xD3\x95\x1E\x98\xBA\r\x90\xCB]\x12\xB4\xDF#3\xD6\xA78\xA6\xE8pR\x9D\xC2\xE3\xC4\xBC\e\xDF\xF6\x1D\x7F\x8CP\x96\xBE8N\xD2O\xC1_\x8BO\x9AV\xEE\x02\xC3\xCD*\xD4\x8D\x16\xD4M\x13r*\xF3\x8E[\x97\x0E$\x85\x94D\x9A,\xE3+]\xBA!\xC1qr?\xE968\xBFK\xA8\tM\x98n~\xA1R\xA8\xA2|\"\xEF\x16\x1FD\xD4\xEC5\xA62\x14\xEB]\xD3\xD6\xB2\x87\xBF\xC8\xC6\xA5\x80\xED\xBB\xB9Y\xFD\xC3u\x9B\xC2H\x12\xD5\xBF\xBC\xF2\xAB\xDA\xD7\xC5\x96\x90\x02q\xBFE\xBF+4Z}\x17\xB0=o\xD7\x14\xD8,\x13j]ud\xF4R\xBE\xEE_\xAFR\xAAp\x83F|)(\x92\xC2]\xE5\x05\xC4\x90R\x15\xF0H\x00\xFC`m|\"\xA2'D\xFE\x1C\b>\x85AJ\xF1\x14\xADx\xE8n\x96\xF6\x86\xEC\x81*\xBE\xD5s=#\xCF\xD96+hm\xD9\xD2\xE8\x13^v\rF3\xBC\xA9q\xFC:\xC2\xBC\xC0\xDD \x05\e\xF1\xE8o\x80\xB4\xDA$\x94\x11\x061\xDB\x988v,G\xAD\xD1\xE9\xB5\xB8\xAA\xDFg\xB7k\xFA\xB7$\xDF\xD2\xC3\xE6\xA9\xEES},\xD7\"\x97\x1Cj;Ei\xDC\xF3\xC8+Kb\xE2\xEA)\x1C\x9B{\fWtL\x96\xD1\xC8\xEB\x03\xC9\xF0D\xA3\x95\xF1\xDD\xECm\xCFA\xE2\xBA-\xA6\xDA\xE7\xA1\xFAi\x067\x85\xCC\x99\xABR+\xAE\xA05\xF8m*\x9E\x9A\x1C\x178\xB9C\x8A\x04\xB8\xA4\xDF\xA8+ \xFA\x83\x8A\xEF\xD2tZK\xC9;\xC1\xB6o\xDEy\xF8\f5Fj\xF5z\xC2\e\fv'\xC4\x86\x8F\x89\xEF\x13\xF0\b\xEB\xDA_Hb\x8E\xC8\x15\asUD=Y\x9B%\x12\xA9Q\x16\xB2[\xA5\xAD\xD5on\fM\xDEb\x94\x8B\xEER\x89$%G\xCA\x94\x803:\x85tu\xF3\xD3\xD6\xE9\xF1vq\xE0\x11\x81v\xD8\x8B\xBA\xD8\x1E6\x1DQ\xAD\n\x19\xE8\xA54\xF2?{\xCD\xC5\xF2rO\x9Em\xE1~\x8B\x8Du\xCA\xAB\xD3\xFC$wW\xBD\x10\x90\xA6\x1A?\xE0.)\x7F\xFDY\xFD\xF1\xAF\x8CX]\r\xAC\x93|\x9BOK\xFD\xD2\x18\x8E\xA9\xA7\xD0R\x017\x1D~\xF8\xB1|\x15#r\xAE\xF7f\xBDj\xC8\xDAn\xFD=Y\x8F0\xB1\x04\xABi.\xA1\xB7\x16\xA6\xBD,\xB2\x84\x9D\xBF\xAE3\xB2S\xC9#\xCB\x9A\x16\xA7\xDE\xA2c\x03\x1C\xEC\xAB{\xDA\x1F<\xE9~\xA8v~\xAB\xC1{:QW\x1A\xAF\x05\xC7\xA9NH\x92\x84w\xAF\xB5u6\xB6\xC9\xEA\xA0\xE2#\xE3\xDC\x8Fq\x86S\xF6\x8C\xA8k\x9A\r\xC1Q\xD4\x18\xDD\x03\x83\x88\xB1\x18\\\xC5\xAFBS\x8D\xA5\xC0\x8B)I\v)\xFB\x8B\xDB\x1E\xB5\x10\xDE\x17\x97\xB5\xDB]e\x19\xF0\xEB\x04\xF1o\xFCq1\x8E\xCA\xDE\xE0W\x9C\xB5()\xA4\x8By\x87\x1Dz\xE0{\r\xC2\xEDCH(\xB5\x91\xEA*ah\xF3\x10\x0F\x04\xDF\r\x90\x02\x10\xFC\x87aO;cj+\x1A\x86\xBA\x15]\xE6\xBB\xA9_\x84GbC\x97\xE5\xC7\x10\vd\x9F\x90\x7F\x82\x9Cy,43\xD1\xD7L\xD7\x9B\xB5\xCE\xBB}9\x1F\x8F\x82\xF4\xC8\xAAb\xA8\xA2\x8C\xB7\x90,}\x7F\xCC\xAAo\x04\xEC\x94\x80z%v8\xD3\xBC]\xA8tG\xBC\x8E\xBA-\x06\x04<\xD9\x1Al\xE7\x10\xC4\x16\\C\x8E8\xBE\x89\x17\e\xBF\xF5\n\xC63Vt\x92#bg\xEA7\v[B\xD61\xFB\xDD\xC2\xB2\xFA\xD7\xAFs\xFBB\xD6s\x1Du\xF7\xD5I\xCBYV\x99\xDCR\xA0\xADvJ$I\xF2 \x11\xD0\xBAZK\x8BQ\xF4\x05)\x1C\x03z\xF4\xB1I\r$m\x96\xD7\xC0\xB0\xE3\x1C\x9F\xC2\xD1\xFB3J\xC7\xEA\x0F\x97\xA3\x1A\xE7\x12\x7F\xB8\x83\xB4\x7F\x9E+\x9EU\x88nC\x98B\xC6\xDD\xFEp>.\x7F\xD3\e\xC8\x9D\xB9\xA1y\xA5|&\x1A\x87\x03\xD7)3D\a\x12U\xF4\x82/\x89\xFA!\xE1t\e\xB2\xCE\x82\xE9\x85z\x83+2L(v\x02\xE1\x97jt\x8A\xA3M\xBA\xD6\xD6\xC1p\xAD.\x11\xBD\xB1\xC5\xC9I\x1E\xDE\xD8\x05$\xF2\xB4\xEC<\xAD\eib\x00<\f\x1F\x150\xD3j6\x8Cv\x8A\xD2\a\xF2\xFCF\xE9H\xCC9\\I\xF0hN\xFF\x00\x13\n\b\x90_l\xB4\xBE7#r\xC2J\xF9<\xED8k]4\x0F\xBB\xB86Ms`\x9D\x9B[\xD0 l\xED'\x99>\x8E\xF4\xF4$\x06\x9BN\xE2zz^\xC0~\xFF\x00\xB6=F\x9Ef\x80\x1A\xBC\x8ER\xE0\xE2B\b\xD5\a\x83\x9A\xE3JI\n\a\x9E1q\xE4_\b\xA4Cs\x01\xBA\x88P\x1D6\x01&\xD7\xEA/\x81\x11\e\x84Fq\x94N\xCB\xB3\x14\x84\xB7\xB5W\xF9\xBFLLE\xD0g\f\xA2:r\xA4=S\xA41\x97\xA5>\xDC\x17\xDF%\xB8\xB3]6CO(\x10\x82\xB3\xF9\n\x8AB\xBE\r\xFD1\x99\xD5\xEF\f&\xA46\xFB3a\xCD\xBA\xDB\xD3\x95\xA2\xD1^\x1F#\xA9\x89\xB6\xF1\x83\xE62\a\xC4\\z\xD9UWa;O\x9A\xF4yI\xEEd2\xB56\xE27\x03e$\x90z{\x10F(\\8\x02\xDE\n.\xC2\x01\xB9VK\xB2\x8D3\"f\xBA\xF4\xD4j\x0Ekc(\xE5\x98\x88\x12\x1E\x99)\xA76I(IY\x8E\x95\x84\x90\x16\xA4\xA4\x90\x93\xCA\x80! \x9E1\x91\xD5i\xAA\xDF\xB5\xB4\xB6\x0E7\xC9\xCD\xBC\xEC2~\xC3\xA9\b\xF5=\\Q\xC6\xE7<\x13ka\x10\xB3\xD6_\x01\xA8\xF9.\x9BG\xA9R\xDD\xCD5\x95\xE6\xA9N\xD4\x18\f\xF8J|\x87vD.\x80\xA2\x13\xB5\x92\x8F%\xEE\t\xB7\x04\xE2:h\x9C\xFD\xAD\xDC\x1C#\x01\x97\a\x92\x06O\xC4\xAD\xF6\x95\xA8\xD2i\xF4\x0Eu\xEF,\xA4\x928\xB6z\x9F!a\x85K3]I\x15|\xC5>[7\xF0\xCE<\xAE\xE1%!;Z\x06\xC8\x16\x1D<\xB6\xC6\xD6&\x0607\xC1y-d\xEF\xAA\x9D\xD3\xBF\x97\x14\xD2o\xCE%T\x91\xCBEu\x830\xE5\xEAt\xDAE\f\xA9\x12&\xB4\x98\xF2\x1D\x10\xCC\xB3\xDD_\x94\xA5\xB0\b%]\r\xC7LP\x96&n\xDE\xF4^*\x87\xC9\x1Fd\xCC\x1F\x1EQ\xCBC\xA6H\xC94\x8A\xEBYu\x99\xB4\xE4I\x1E\n\xAE\xD5B\x94\xA8\x82M\xF7m(**\xF3\xB6U\xE8R,z\x1E\x82v\xB1\xB3\xCB\e_\xEA,\xAA\xCA\xF1M\f\x8E\x8C\x90#\xCD\xFC\xF0\x8CZ\x9D\"&H\xD1\x9A]1-7\xF8\xA5Dx\xE7]?[,\x91\xB5\xA4|n\xE5G\xE3n4\xB0\x13$\xC5\xDD\x06\x16\x12F\x81\x10m\xB2s\xF8\xFC\xAA\x15\x99\x9FS\x95w\x94\x14y\xF6\xC1\xB7X\x9C\xAB\x906\xCC\n\x15Gwk\x83\xD0t8\x13\tE&\x18DZ\x04\xE4\x84\x04\x8B\x03\xB7\xAD\xF1m\x04\x90\x10T\xEE\x89\x9B\xD7Au\x89Q\xD4\x85=\x1D\xC4\xBA\x80\xE1\xE3rHP\xB8\xFD9\xF8\xC42D%\x05\xA7\x82\x9A\xC2XA\x1C\x846\xD7\xEC\xC7I\xCD\x1A\xAFY\xAEe\xEAji4\xCA\x82\x19SpR\x00K\x044\x84\xA9\t\x03\xA2n\x9E>-\x8C5%5E,]\x85S\xB79\xA4\xE7\xC4\\\x90~D-\xFC\xEE\x84\xF6r\xC0p\xF6\x83o\x03\xC1\x1F0\x9C4\x8B_\xEB\x1AQH\xACR\xE1D\x84\xEC*\xA4\x98\xD2\xA4&K\tz\xEAgv\xC1\xB5wA\x17Y6RM\x88\x04\x11l\x0F\xD44\xB6\xD6\xBD\x92\x17\x10Z\b\x166\xE7\x94B\x8A\xAA(\xC3\x9B(\xE6\xDD.\x91j\x16\xB0g|\xD3\xF8\x95VeFjb\xD7\x1D*u\xE4\xAD[]\t&\xCD\x95\xFA\xD8\x92m\xEEon\x05\xADP\xD1AG\x18\x86!k}\xFCS+\xE7\x99\xED\xDF\xFB]\xC7\xA2\x14\xDE\xF6\xC1\x81\x85\x9F\xE5[\xDE\xCD}\x94\xA8\xBA\xBF\x92\x1E\x9DQ\x8A\xE8^\xE2\x92\xFBN)+A\xB7\x04z~\xE0\xE0\rUl\xB1I\xDC\xE1i)\xA8\xA1|#<d\xA0^\xA3eZ\xEFg\x8DT\xAAQ`\xD5d\xC6\x91\x14\x82\xC4\xD8\xEB-)\xD6V7$\x9B\x1E\xB66? \xE0\xBD3\xD9U\x18y\x1C\xF4Ag\x8D\xD4\xB2\x96\x02\xAD\x86\x86\xE9\xC5z\x8D\x912\xADg6W\xA4\x05\xE6I\x0EJ4g\xAE{\x8A{\b*/\xAC\x92|\xCA+\x01\"\xC3\xEA\xF5=4qS1\xA0\x9D\xBD\xE0>\xA7\xA7\xE5e\xABj\x89\x01\x81\xD8'\xEC\x9D5\x92\xA9'5\xB9*xRP\xDB\xC2\xE9a\\\x04\xA0yR\x91\x7FD\x80\a\x1E\xD8\xB5\ff!b\x10\xE7\xB8;\xAA\xAA\xB5\xBA\x02\xCDI\xDB$\xDB\x8E\xA7\x16\xF7\x8E\xAAfH#\xB2\x17At\xA5d\x03k\x8B_\x03\"6Z\x17\x8B\xA9D\x1A\xA2X\xB2\x94\x02S`-\xEB\x8B\xA1\xC8[\xE2'\x85\xEAff\tmM\xA4\x90:\xF0p\x8B\xC3Re1&\xE9\x1D\r\x0FW\xEBq\x18\xF0_\x88%\xD5\xA5\r\xC7Q$8\xB2xO\x04\x1El#\x17\xB9\xBF\x18\xCEW\xD4\xF6\x8D;N\x02\xD5i\x14\xC0\xD5G\e\xD9\xBBq\xB5\xBC~Y\xCA\xD3^\xCB5\x1AMN\xA2\xDC\x98I\x80\xFA\x1Dq\v\x8E\xE1\t[E+)Zv\xDE\xE0\x82-n\xBC`[^6\x8B\x94Zzg\x19e0\xB4\x01\x7F\x97\x90=S<\xE7e5\t\x10\x16\xF2\x93\x1D\xB7\v\xC8\x8E\xA5\e]#y\x88\xBD\xB7X\x01\xEF\xC6,4\x87\v\x84\nh\xA4\x89\xDBd\xC1\xE6\xDE\xA9\x13IJ\x90.\xAD\xA4(s\xF1\x89:(:\xAE\x9CvG\xCF\xD9W+\xE4\xA57'9Qc\xC7,\x03\xFD\xE3\xC9m[\x82E\xD1\xB4\xF2U\x7F#\t\xE7\x19i\xE2\x90\xBC\x80\xD2\xB61L\xCD\x8Du\xC6\x10\xBF\xB6\x1E\x9D\xCA^\xAE\xE4\xAC\xE1L\x10\xAAO\xD6Jb\xA2\x14\xE8\xE4\xC6RZ\tXZ\x95\xEBp\xE8\xE1\"\xE9\t\xF76\xC6\x87\xD9\xE0\xF2\x1C\xC6\xFE\xDC\x9B\xF9\xFF\x00\xA5\x9D\xD7\xB64\t\x1EM\x9D\x8Cy\x7F\xB4\xE9\x98\xF5>]r\x9D'2\xCB\xA7\xF7*Zc\xD3\xA2S#,\xBA\x86b\xB4N\xE2\x95\x00<\xAA^\xE5\xDE\xC2\xF7M\xF1\xE8\x90\xD3\x86\x90\xCB\xF9\x93\xE6W\x98O.\xF7\xF7z`]0\xD63I\xCC\xB9.}Uq\xCB\x1D\xF4\x87P\x86;\xBD\xA9i\xB4\xD8!)\xF8\xDBc\x7FRI\xF5\xC7$\x8F\xB3xkN,\xA4\x04\x91\x9EUd\xAB\xD6^f\xA0\xF2[yhE\xF8\x01d\f5\xD8<#1F\v\x01\xB2\x1F\xB6\xBD\xB6\xB7Q\x8C\xE3J>BS\xE2\xD4\e\xDB\xB8\xDB\xE7\x13\xF6\x98\xB5\xD4{\x05\xEE\xB67\x01\xD7\xA2\xAAB\xEE\x11p\x94\x0F\xCCOL\a\xA8\xA9\xBB\xBB6\xFCQ\xAAz\a:\x03P\xEE/a\xE6S\xFC9\xA9\xA3S\xA3\"1\x02bJ\xDC.\x8E\vEV\x1D\x7F6\xD4\xF5\xF4\xDC#\xC52\xE0[\xB4\x05~\ngD\xF1+\x8D\xAD\xC7C\xEAJH\xB2\xDBR[r[\xC8SE!\xC5-*\xDCH#v\xDF\xFB\xBD>\xE7\x15\xCB\\\r\x87*\xF4R\xC0v\xBECf\x0F\xA8\x1D\a\xAD\xAD\xF1Q\xC9\xB2\x95.B\xDE_\xD4\xE1*?\x1C\xF4\xC5\xB6\xB44X,\xC4\xF3:\xA2WJ\xFEI\xBA\xF0\xCB\x81\xB5\xA4\xA9!i\x04\x12\x93\xD0\xDB\xD3\x0F\xB5\xC2\xAE9\xBA\xBD=\x89\xB5*\x8D\x97r4\xF3'.\xB0\x89,V\xCC\xA6gI\x8CJ\x18m\xE0\x86\xB6\xC7u \xA9\v\x05)\xB9W\x90\x8E\x0FP#\x8A\xA8\x1E\xF7\r\xA7\x90\x8D\xD2\xCC\xC60\x977\x17\xF8'N\xD1\xF5\x8A\xBEd\xD76\xE0\xB1%\xFA\x92it\xF4\xA5\x96\x90\x90;\xB7\x9El8\xFA\xAC:(\xA7\xBA\x1E\xC2\xC0zcQ\xA5G\x1E\x9B\xA6\xBA\xA6Q\xCF>y\xB0\x1F5\x99\xD4\xE4\x93S\xACm4G\xFC\xEAS\xC4|\xB4\xEC\x1At\x14L\x8C\xE4\x12\xEB+\x02;\xED\x80B\x10\xB2\xDF\x02\xFF\x00O\xA8\xE9pol^\xD35\xA6j/{\x03v\xB9\xB9\xE6\xF8B\xB5-\nM9\xADyv\xE0q\xC7T?\xD4\x1A\xF4\xE9Q*\x11\x1F\x84\xA8t\xC8i\xEEc\xA8\x9F+\xA9\a\xC9ok$^\xDF\xE28\xD2\xC5\x17\xEE\xBD\xC9Y\xE2\xEB\x90\xD2\xAAmfF\xEA\x9C\x83\xE9\xB8\xDB\x15\xA6=\xF5\xAC\x85\xBD\xC0\xA3\xA0\xDB\x19PQ%\xB6\x1CuM\x96\xCCtr\xB7V\x10\x00\xF98\x8AI64\xB8\xF4Vi\xA0uL\xCC\x85\xBC\xB8\x81\xF3*mU\xA2;\x1A\x1C\x14\xA1 7b\xBB$rU\xD0\x13\xF6\x18\xCE\xB2P\xE7\xB8\xBB\x95\xE9\xF5\x9AS\xA1\xA7\xA7dc\xBA.}\\x?\x00\x9BSMz2\xD0RU\xDF\x02\bROC\xF1\x89;at0\xE9\xCFh\xB1\xC9)\x92\xB6\x16\xCB\xFD\xD2\x88U\xBD\xBE}qj#\xB8nY]D\x18\x9F\xD9t\t\xAC\xE2t\x1Dm\x8D\xC3\xC8'\xA5\xFAbX\xBFX\xBA\xE1\xE1\\\x1E\xC42\xE3W\xB33\xB4\xC9\xCBb\x99Jx\xED_x\xA1g\xDCH+\xDA\x94\xF5\xDER\x95[\xA0\xE3\xDF\x83vJ#\xF6\t\x9A8*\xA9\xA8tg\xB2'\x05NP\xFDk:U\xB5+R\x19\xA1\xCD\xA9SK\xABe,C\x8E\\!\x83\xFD\xDA\x12H \xA4lJ.G&\xE6\xDDp\xCDn\xA28)\xE1\xA1i\xCF'\xCB\x18\xBF\xA9\xE3\xD1I\xA3S\xBEi\xA4\xAC-\xC0\x16\x1Ef\xF9\xB7\xC1/\xD4\f\xE3\x02$\xEA}\x1E4\x05S\xEBT\xFAtV*\xE5]\xE8q\xC9+e\n>W\x14JR\x90\x12\b\x00\x1D\xC4\xDE\xF8\x17\xA1m\x8Ei\x1D\xD4\x8F\xE5\x18\xD7C\x9D\x04c\xA5\xCF\xD9\r3\xDB\xCF\xCB\xA7\xA6\xC0:\x9E\x8A\bQ;O\xCF\xB7\xA7\xEE1\xE9t\x92\x89\x06\x17\x99T#b\x90\x17*\xE3]\xA4\xED\xAA=\xC7S~\xB8\xEC\xB0\x878\x92\x16\x82\t\x7F\xA6\x14A \x9B\x01\xC9\xC6)\xAD\xBA2\xA7\xFA3\x93\xE5\xE6<\xF5\x05\r\xC6[\xE9a+\x90R\x94\xDE\xFBG\x03\xF7#\x1456>:W\x109\xC2\xD7{\"!~\xAF\e\xA56\f\xBB\xB3\xE41\xF5\xB2\xB5Ze\xD9O2jM\x1E\n\xA3\xD3K\xB5\x04G\xF3\xC5u\xC0\x85\r\xB6\xDF`y;I\x00\xFC\x91\xEF\x8CC\xE5\x91\xF3=\x90\x8B\x8B\xAFy\x8Am*\x8E\x8A\x9D\xDA\x94\x96yh\xC76?\x95\x01\xED5\xA3u\r\am\x86+\x10\xFC\rQ\xF6\xD2Xl\e\xDD&\xF7?\xA0\x1C\xFE\x98\xB3J%t\xDD\x9C\x82\xDDP\x9D~\xAFM\xFF\x00\x8B5\xFA{\xB7\x12v\x0F^O\xC8*\xB10\xA9J\xEF\x14|\xCA\xE6\xDE\xD8\xD47\x18\v\xE7\xC9\xEE\xE3\xBD\xDC\x94\x98\xF9\x96O\xB9\xBE\x1E\x15Eb{?\xE9\x8EB\xAD\x96\xE5gY\r\xB1\x19\xB4\xA9\xD7\x83\xB3T\xD9\t\x04\x02\xAD\xA8\xE4\x00H\xEA}p6\xA2\xA2X\xDF\xB5\x9Fdf\x9E\x96\x19\"\xDD'>\xA8\xE5\xFE\xC9\xA8\xD9\x17R(\x8Dd\xFA\xCA#e\xEA\xE8\xEE\xDC\x94\xA5\x17\xC4v\xD4\x9B\x87\x10\xA3\xE67M\xEC\x0F7\xB7=q{N\xD5\xA4k$d\xE2\xFBE\xC7\x9A\xA3\xA8i,q\x88\xC3\x80\xE3c\xD6\xC9\xA3R5\xE6.C\xAA\xD0\xE9\x94X\xD2#\xE4(2C\xB1b)jK\x93\xCA-\xDE:\xE9E\xB7)~\x97 \x01kq\x86\xBBO\xAA\xADw\xBC\xCE-\xBF\xE8\x15\x86\xD6\xD3Q\xB4\xD3S\xE7f>i]gVrGhL\xE3\x1ERY\xA9e\xAA\xDDI\x86`\xC8L\xB8\xC9Z%\xBA\x9B\x86\xDF\x0E6n\x16R\x9D\xAA\x04sd\x9B\x8B`\x8B4\xCFp\xED*X\xEB\x800\b\xB17<rG\xA2\x1C5'\xD7\x18\xA9f`\x04\xBB$\e\xDA\xC3\x9E\x01\xF5Qz\xCE\\\xADG\xABD\xA3Di\xC9h\x85\t\xC9N\xC4Jv]$\xABr\x8FP\x15\xB0$\xD8\x91\xF4\xD8X\x8B\x92Zv\xA3\v[\xDA\xC8\xE0\x0E\xED\xB9\xEA\xA2\xD4\xB4\xA9\x8B\xBB(\xDA\\6\xEE\xC7D\x16\xCC\x90\xD1\x16\xAC\xEBo\x8E\xE5V\n\tP\xB5\xC1\xE4\x11\xEE9\xEB\x8D\x98|re\xA6\xEB2\xC6=\x8D\x01\xC3*\x05\x97\xA8\xC9\x9F-\b\xEF\x80$\xFERF2t\xF0\xDD\xC1\x1A\x9E]\x8D7]B\xFE\x98\x9A\t\x06\xA1^\xAAf\n\x9CF\xE4\xB1\x19\x80\xDBd\x8B\x82\xA2A\xE7\xF6\x183\xAB\x86Q\xD21\xA0w\xDC~\x8B)\xA6\xCF-~\xA0\xFB\x1F\xE9\xB0[\a\x93tx\xD6\xAC\xE5J\xEC\xE1\xAE\x99J\xAE!\x94Q\xF7KT\x96\xE3\xA4\x05\x14\xBC\xC2\x81Jz\x0F\xA9\xB6\x8F\xDD8\xF2\xDA\xBF\xFAy\x85CF\b\xCF\xAD\xED\xFC\xAFv\xD0\xA8]\xAE\xD2\xBA\x84\xC9g\xB4\xD9\xA4\xF0\x05\xAF\x9F\xFCW0\xFBgv\x84\xA8v\x82\xD4\xBA\x8D~f\xD6b0\x9F\v\n*\r\xD2\xCBc\xD0\x1FS\xEE}M\xF1\xCAv\xB9\xEE\xED\x1E2~\x83\xA0F5\x9Fw\xD3\xA9=\xC2\x94\xDD\xB1\x82/\xFD\xCE?\xA8\xFF\x00\x03\xC0\x05Yd\xAC\xA9#z\x01\x82\xA0Yy\x8C\xAE\xDCV\xB4yH=9\xC3\x82\x85Xn\xCB9\xE2%:\xBBP\xA2\xD6\x18\xA7I\xA2V`\x1A}A\xD9\xF1\xDEt\xB0\xC2\x9EJ\xD6Q\xDDr\x92JB\xAFc}\x80p0*\xB6# \xB86 \xDF\b\xE6\x9D \x04\xB4\x8B\xE1\x17u36Qh3\xD3A\xC9\x91\xA1S\x11\x1A#\x8E\xAA\xA6\xD9R\xEE\xAB\x03\xDE\xA8\xAB\x9EGN/\xCF\xBE\x19E\x14\x92\xBE\xEE\xC98N\xD4&d-hf-\x94\x1E\xCEB^l\xCBj\\h\xD2%\xC8K\x89u\ta\x05E\xB7\a\xD5\xC0\xE8,I\xBFKc\xD2\x19]\x19\xA6\xDB1\xDA\xE6\xD8\x1F\x1F\v\xFCV\x05\xB4r2\xB3t\"\xEC}\xCE8\xB76\xF8\x14\x9B\xB3\x8DI\xDC\xAF\xAA\x91\x9A}\xAF\xF7\x96[|\xECX\ak\x856\xB8\xF9\xB5\xFD}qNX\xD9,\x05\xAD\xE0\xE5\x10/0\xCA\xD9:\x8C+\x14\xF6gv}v\xB1V5t\xD2\xDC\\_\n\x14Sp\xA5n\xB9Q\x03\xEA\xE3\x80H6\xE7\xD0\xE3!QA\xB1\x8C\x8C\xB2\xE0:\xF7\xFE\x16\xBA\x9BS\x0Es\xA4k\xB2#\x16\xF4\xEB\xE6|<\x1079G\xA77Se\x96\xD8\x8D%\xB6XKiq\xD4\x82\xA2.M\xF9\xFB\xDF\xF5\xC6\xAE\x9D\x929\x9B\x9CrVR\xA6a\xBE\xCD\xE0`!\xAE\x9D\xC3i\xDA\x9B!IR\xD4O\t\x06\xD8\x96\x9EG6F\xE1\v\xAEq\xEC\xDC\xBA\xF9\xFD:\xEB\xF4\xFAm\"},\xBA\x94Hs\x95$\x9E~0o\xDA(\xDD,\x11\xC8\xDE\x02\xC5\xFB-;b\xAB\x9E'\x9C\xBB(U\xFDR\xF3\x93+\xCC\xF4\x98l8\x92\xB8\xEC\xDF\xCA}\xD2\xAE\x7F\x9Cy\xE5DW\f\x0E\xF3\xFB\xAF\xA0\xBD\x9A\x98\xC4\xF9%i\xEA>\xC7\xF2\xB9oUjE^p\x89\x19\nu\xE7\x14U\xB6\xFD\x00\xE4\x92O\x00\x01\xC9'\x801\xD6\x80\xDC\xAAZ\x8C\xCE\x99\xDD\x98\xE4\x9B\xA8\xFC\x96\xD0\xC3\x85\xB4\xAC:A\xE5\xC4\xFD'\xED\xFE\xB8p\xB9\xCA\x06\xF0\x1Al2\xB4\xE1\xCA5!\xC8\xF5\xB9\x94*\xFB\x0F#\x82\xCDJS\x97i\x11\x9Fl\xAC(\x9E\x84X\x8B\x11\xE8}1\xCE\xC7\xB7\xEE\x0EJ\x91\x93v\a\x7F\xDD\x12W\x99cQf\xD4b\xD5T\xCE`\xAETX,\xCAm\x95\xA90\xE9\xA0\x90l\x14\x82\v\xAE\xA4\x81\xEA\x10\x9B[\xCEz\x1A\xD3i#\x8EM\xA7\xA76C\xEA\xE7|\xED\xED\x0F\xC1Gs\x06l\xACe\xC8QX\x839Q\x14\xF0QS\xB1^I+o\xD0*\xC6\xE2\xFDll~1gQ\x8D\xAE\xDB\xB8duP\xD1o\x8Fv\xD7`\xF4Hr]jT,\xCB\x1A\xA8\xFC\x82\xE9S\x9B\x96\xBE\xAA$\x82?\xCF\x13\xD2\xC4X\xDB_\n:\xBBH\b\xEA\x9D\xEB\xB9\x9EK2\x1CS\x12\\\xE6\xF6\e\xB8\xE7\x04\x9E\xC8\xC8\xEF*t\xE0\x80\xA1\xD33\x14\xB7^%O\xAA\xF6\xB6\a\xBEa\x19\xDA\x116\xC2\xD28K2\xF5qt\xC9(}\xA5\xEDP\xC58e-!\xEC6!A<\"F\x96\xB8a\x1D\xF4\x9F\xB4\x85SO\xEBlH\x831\xC6]X!J\n\xB76\xE3\xF9\xC1Q\xA9\xBD\x94\xEEc\x80p\xF3#\xA9}\x9D\x86\xAE\xBD\x84\xB8\xB2\xF8\xB8\xE53k\xB6\xAF\xD5\xF5*\xBE\xCDB\xB1(\xBD%m\x8D\xEBY\xE0\\\x9E\xBE\xDDq\x8E\x9AN\xDEG?\xE4\x17\xB1\xB6\x99\x9AU<P6\xF8\x19?\x94\x1A\xABW\x19\x8F\x11\xC8\x10\xAF\xB5\xCF\xF9\x99\x00X\xC8WP>\e\a\xA2}m\xB8\xF3`!-$\xDDg\xDF3{\xD7\xC9*6I&\xE7\xD7\x0FT\t\xBEW\xCB\xE3\x8B\x89\xD3.\xAEB*#\xC3\xC8\x11\x14\xA4)%\xF2\t\xD8\x9Brx\x04\x8Fk\x8F|_\xA5\xDE\x1D\xDC\xE4\xE1E k\x87{\x85\xB0\xD4\x8D5*j2\x82V~\xB5\xA7\xDF\xD8`\xBBj\x05\#{8\xF9\xEA\xAB\x98\x84\xC7s\xF8\xE8\x9B\xE4I[\xE6\xEBYs\xE4\xFA`|\xB5\x05\xE6\xD7\xBA\xB0\xD6\x06\xF0\x12\x8AuEP\xDFB\xAEJA\xBD\xB1b\n\xAD\xA6\xC5E,A\xE19?SD\xB2\b\x16\xFB\xE0\xB0\x94?*\xA8\x88\xB57\xC8h-\xD2G\xAE!{C\x8D\xD5\x96\x93d\x91\x0E\x14\x9E.0\f\x16\x9F\xD4\x14\xE4](nIh\x85)D\x01\xC8\x1E\xA7\x16\v\xC3E\x93\x03sq\xCA\x94J\xA8\xB5U\xA3Fx\xA8\x99*IK\xDC\xF4P\xE3\xA7\xB1\x16\xC6i\xE1\xCC\x94\x8E\x8B\xD0\xC5Du\x94,.\xFDV\xB1\xF5\x1F\x9C(\xC4\xA56\xCB\x83\xB8J/\xD3s\x8A\vW\xDF\xD8b\xC3M\xF2V6f\x86\e\x04\x89\xC5)j\xBA\x94V\xA3\xEAq\"\xAA\xB5\x80V\xB0\a$\x9B\f7\x93\x84\x94\xF2\x99\x06\x8F\x16\x96\xA5=\xE1\xDA\x92\x86\x8A\x94\xB7\x1DR\x94\xBB\x03\xC6\xD1\xC0\xB9)\xFE>pT40_\x83\xFEq\xEA\xABou\xEDk\xA85\xF9\xE7\x15\xB7\e\xE5X\xB2\xF8O8\x85\xCF\xCA\xEA\xF3\xBB\x11\x87\x90\x92\xF6\x87\x8Aqf:\x873\v\x84]l\xEF\xFD\xCE/{\xDF\x8Af\xD5\xAFz\xBF1\xFD\xF00H\xE1\xD5>\xCB\xE5\xCF\xBE9\xB8\xAE\xA5\xB0j\t\x8C\xCA\xDBZJ\x81;\x85\xBD\x0E\x19$e\xE4\x14F\x96\xA8#\xD71\xC2\xE0\xA4\xAF\xAD.:\xA5$\x10\x0F\xBE\x1E\xD6\x90,\xA9\xCA\xE0\xF7\x97\x05\xAF\x0E\x00\x81\xC2\x89g8V\xF2I}\xC3\xEC\x12_0\xDC\xA4\xB3\x9Cs>\t,=0\xD7q\xC2K\xCE!If\x12K\xED\xCE\x15\xD2R\x9C\xD1\x91$ex\xF4\xB7\\\x92\x87\xFCz\x94\x94\xA5()\xDA#l\x9F\xBF\xFCA\xFBb\xBC5\x02R\xEB\x0E?\xFB\xF8S\xBE'0\v\xF5RZ\xAE\x85\xD4i\xB4\xD7\xE6\n\x94WP\xDCg\xE5\x01\xB5#\xAD,\x82V=l|\xAA\x02\xE0\\\x8C1\x9A\x83^#\xB7\x87\xD5=\xF4\xE5\x82\xF7M\x993J&g*,\x8A\xA3S\xE2\xC4\x8C\xCA\xD4\x82\x1D$\xAC\x94\xED\xBF\x1F%i\x00^\xE4\x9E\x98\x96Z\xC1\x13\xB6[)\xAC\x84\xBD\xBB\xAE\x92'M\xE67\x9F\x8EV\x93)\x96d\x04\a\f\x80\x14\xA4\x04\x16C\xA0\xDB\xAF\xD2G\xEAq\xD3X;\x1E\xD8\x0F\xF2\xF6\\l%\xD2vkns\xD3)Y6\x96\x89\xAFKnB\x14\xF8f\xC8l\x8F\xA8(\xA4\xDC\xFB\x84\xDF\xF5\xC3 \xADl\xEF\xD8\x05\xB1u$\xB4\xCE\x89\xBB\xCA\xD1\x95t\xF5\xFC\xD7D\x9D:4\xA4\xA1\xF8\xEAR[\x8A[$\xBC\xA0\x8D\xDBA\x1C\x02z\v\xE2I\xAA\xDB\v\xC3]\xD568\x1D+K\x9B\xD1$\xCD\xB9*^QD?\x12\xB0\xB5\xC8\xDC6\x84\x91\xB5I\xDBq\xF3\xF5\x7F\x18\xECUM\x9A\xE5\xBD\x13e\x85\xD1[r}\xACh\xD5b\x8BN~S\xCE\xB0\xAE\xE5Km\xC4\xA2\xE6\xCBBJ\x94\x9F~\x80\xF3k\e\x1CB\xCA\xF6Hl\x13\x9FN\xF6r\xB4\xE4],\x7F<\xC3\x86\xFB5\x16b\x99\x15\x11O\r\xAD\xB5(\xA6\xE9B\xB7\xF1\xE9\xE7\xE9\xD7\x8C*\x8A\xC6\xC3p\xE1\xD2\xEB\x91B\xE9xL\x19\xC3+/)U\x11\ro\xF8\x8D\xEC\xA1\xE0\xBD\x9B8U\xF8\xB5\xCF\xB6\x1D\f\xA2V\xDC&I\x19\x8C\xD8\xA6<N\xA2X:\xE1$\xAC\xF7iL\xA0\xDE_\xA5iJ\xD1{Nu\xF5n#\xA8\xDB\x0F\x9F\xE4\xE3'\xA4N&mC\x81\xE0\xDB\xEE\xB4Z\x936:\x01k\\\x02\x8E\xD9\xD7JX\xA7i\xBE|\x9D\xB9e\xF8\x99~\xA0\xFAw\xA3\xCA\x84\xAB\xBF\x00\x0Ey\xB8J\xF9=\n\x87[c=A\xA8\t*\xA9\xE3\xE7y?\xFA\x84b\xBE\x902\t\x9Do\xD3o\xAA\x80\xF6C\xD3\a\xF3\x96\x95\xBD%\f)\xD4?S\\1\xB1\xB2\xAB\x12\xECRI qas\xF6\xC4\xDE\xD0\xEA\xD1\xD0\xD5\x16Hm\xDC\xBEO\xAA\x83J\xA3\xED\xA9D\x9F\xF7[\xE1\x84\xD7;\"\xAAGo\xE9\xD9M\xB6\n\xCE\xDF\a\xDD\x00o\xE5\xA6'\xD3\xF4\xC5\xB9\xF5\x10=\x9Cmq6\x16i\xF9\xB8*\xB4\xB1\xC6\xED\\\xB3\xF6\xDD\xDFb\xA7}\xBF\xF4Q\x9D2\xD1\\\xB5Qd\xF7\x9E*\xB8\x88\xE5\xD0\x9D\xB7\xDB\x1D\xDE\b\xF8)#\xF48\x05\xEC\x96\xA8\xFA\xFDBV8\x10\x1A\xDB\xFC\xC8W5\xB9!4\xEDd|\xEE\xFE\n\x13vb\xA6FgJ\xF3.c\x99\nD\xD84Y\x8B\x9711\x80\xEF\x12\xCAXAQI<n\x02\xE4\\\x80H\xF4\xC6\x97Y\x986\xB6\x18\v\xACd\xC0\xF5%S\xD2{\xB4\xD3\xCBo\xD3b\xB6v\xD4\xC9\xF1\xE8\x14\xAD9\xA9\xC3aq\xE2V#;-\xA0\xE5\xB7mZ#\xB8/\xF3g\x05\xF1\x1F\xB3U\x9E\xF2\xFA\x98\xB7\\\xB0\x81\xF2$\x7F\v\x9A\xD0\x1D\x94\x12\fn\x04\xFD\x91c6\xE4WF_\xCE\xD3$6\xF2Zi5\t\x01\xB5\xB46\\\xB2\xF8J\xC2\xBA\x93p\xAF\x8EF\x042\xBCv\xF1\xB1\xA7\x97\x01\xF5\v#\xEAF\xB6\x9D\xC6\xD9\x11\xEE\xF9\x840\xEC\x8B\xA7\xCE\xE7L\xA6\xB5\xB2\xB0\xD2\xD9\xAD(\a-\xF4\x9F\x0E\x82\x9E~\xFF\x00\xCE\x0E\xEB\xD5\x1E\xEC\xE6\xB8\xFE\xE0G\xC9g\xF4h\x84\x8D\x91\xCE\xE1\xB6\xFA\xA1\xEFk\xEC\xBA\x8C\xAB\xAA\xEDSP\x00\xEE\xA9QI\x03\xDC\x85\x1F\xF3\xC5\xDFg\xE7\xF7\x9A>\xD6\xFC\xB8\xAAZ\xC0\xDBVZ\x06\x00\x1Fd\x10\xC6\x95\x04Y\x84\x92\x90\xE6=D\xCC\xF9\xBD\xBA[u\xBA\xFDF\xAA\xDD-; \xA2d\x958#'\xCB\xC3`\x9F(\xF2'\xA7\xE5\x1E\xD8\xAB\r$\x14\xFB\xBB\x16\x06\xEE76\x00\\\xF9\xF8\xA9\x9F4\x92X\xBD\xC4\xDB\x8B\x9E\x13\xEDO_u\"\xB5\x02|)\xF9\xEB0L\x87=\x8F\r-\x87\xAA\x0E)\x0F\xB5\xCF\x91`\x9ES\xE6W\a\xF3\x1F|E\x1E\x9FG\tk\xA3\x85\xA0\xB6\xF6\xB3F/\xCD\xBC.\x9C\xEA\x89\x9E\bs\xC9\xBF\x99Ir.\xB5g\xED1\x89\"&R\xCEu\xDC\xB9\x12B\x8A\xDD\x8FL\xA8:\xC3kQ\x16*)I\xB5\xEC\x00\xBF^\x06\x1F=\x15-Q\x06\xA2&\xBE\xDCnh6\xF9\x85\x10{\x9A,\xD2Bo\xA7jVl\xA4\xE7O\xED|<\xCBV\x8F\x9A\xBB\xC5;\xF8\xDA&8&oRJT\xAE\xFA\xFB\xAEA \x9B\xF48\x99\xD0\xC4\xE6vnh-\xF0\xB0\xB6<\xB8\\\x0E \xDC\x14\xB78k.{\xD4\x1A34\x8C\xCD\x9C+\x95\xFA[\x12W1\xA8u)\xEE>\xD2\x1FQQS\x81*$\x05\x1D\xEB\xB9\xEB\xE6>\xF8L\x86(\xCD\xD8\xD0\x0F\x90\x01p\x92y)\r\aR3VV\xCB\xB5z\r\x1F1T\xE9\x94Z\xBAvT)\xF1%-\xB6%\xA6\xD6\xB3\xA8\x06\xCB\x16\xE3\x9C5\xF4\xF0\xC8\xF6\xC8\xF6\x02\xE6\xF0H\x04\x8FC\xD18=\xC0X\x1C,\xCDZ\x91\x9A\xB3\xCC*\\<\xC3\x98ju\xB8\xB4\xB6\xBB\x88,\xCF\x94\xB7\x93\x15\xBD\xA9N\xD6\xC2\x89\xDA,\x84\x8B\x0FD\x8Flr\x1Ah)\xCB\x9D\v\x03K\xB9\xB0\x02\xFE\xB6\xE5p\xBD\xCE\x00\x13{'\xCA\x8Fh\rJ\xAB\xC2\x93\x0Ev{\xCC\x12\xE2\xC9c\xC3>\xCB\xD5\x17T\x87\x1A\xB1\e\x14\t\xE56R\xB8\xF98\xAE4\xEA6\xB88B\xD0A\xBF\xE9\x1C\xF8\xFA\xF9\xA9\xBD\xE2n7\x9E-\xC9\xE3\xC3\xD13\xE5\x8DO\xCD\xD9*\x9B*\x9F#\xCC\xB5J4)N%\xD7\xA3\xC1\x96\xB6\x90\xE2\xC5\xAC\xA2\x12y\"\xC3\x9F\x8CO5,\x15\x0Ek\xA6`qo\x17\x00\xDB\xD1F\xC9\x1E\xC0C\x1CE\xD3~j\xCE\x15\xBC\xF1W]S0U\xA6V\xAAKBP\xA9s\x9ES\xAE\x14\xA4Y \xA9\\\xD8a\xD0S\xC3L\xCE\xCE\x06\x06\xB7\xC0\v\x05\xC7\xBD\xF2\x1D\xCF7>i\xA3\x16\x13\x17\xA3\x8E\x94\x97\x9Cq%\x98I,\xC2If\x12K0\x92Y\x84\x92\xCC$\x96a$\xB3\t%\x98I,\xC2I\x7F\xFF\xD9"
So the above data should display the above poster.
But when i add that code
<img src="data:image/gif;base64,**HERE**" />
The movie poster isnt shown, does anyone have any idea why?
I can see one possible error. The image link you have posted in .jpg while you are setting mime-type as gif. Please check with mime type as image/jpeg.
EDIT:
I tried the following sample code, works fine:
<%
require 'open-uri'
raw_img_data= nil
open('http://d3gtl9l2a4fn1j.cloudfront.net/t/p/w92/s2IG9qXfhJYxIttKyroYFBsHwzQ.jpg') do |f| raw_img_data= f.read end
base_64_img_data= Base64.encode64(raw_img_data)
%>
<img src="data:image/jpeg;base64,<%= base_64_img_data%>" />
Did you encode the raw image data to base64 before placing it as part of the URI?

Rails Display Current Facebook Share Count

so I'm trying to display the current facebook share count in a Rails application. I keep getting the "can't convert string to text" error when trying to grab the current URL in my Rails app.
The code works if I put in something like facebook_shares("http://www.google.com")
The code does not work if I use facebook_shares("#{request.protocol}#{request.host_with_port}#{request.fullpath}")
Not sure how to fix this problem
Here is my current code...
helper.rb:
def facebook_shares(url)
data = Net::HTTP.get(URI.parse("http://graph.facebook.com/?ids=#{URI.escape(url)}"))
data = JSON.parse(data)
data[url]['shares']
end
view.html.erb:
<% current_url = "#{request.protocol}#{request.host_with_port}#{request.fullpath}" %>
<%= facebook_shares(current_url) %>
When I run this I get a "can't convert string into integer" error. It works if I do the code below:
<% current_url = "http://www.google.com" %>
<%= facebook_shares(current_url) %>
Super lost...
data[url]['shares'] part is suspicious. Eithere data[url] gives you Array and when you are trying ['shares'] on that Array you are getting the error,which is obvious. Or data itself is Array of something... Thus data[url] throws the error. So inspect first how data is looks like. This error is coming as Array#[] don't allow string inside []. See the below demo code:
arr = [1,2]
arr['foo']
# ~> -:2:in `[]': no implicit conversion of String into Integer (TypeError)
# ~> from -:2:in `<main>'
I figured it out. This was a horrible oversight by myself :p.
I'm in development running on a local server, so I'm pulling localhost:3000/something.
Pushing this and running the function in production works fine. Sorry everyone, but thanks for the help!

Resources