job-bob 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 85e94b14729c7cddd72b8daad00cc4a3f2da296e
4
+ data.tar.gz: 735801150bb29e8545fbe71a471354ef0b4b4438
5
+ SHA512:
6
+ metadata.gz: 061e9fee719b570d3562de3938eb87a746c99752833335c9728975f12dc264a9e0cc5f3d0b372fae3757de0a84f8c94fb73ca6c0065b7769282977768c9306c8
7
+ data.tar.gz: 5f76d0962d9245bdb337025048df6a2c1fa4a715a6bfb7ba803ca313e411d6b5bf86a04504a2be45ac12aacb149c9bfc4ea48e30d94a8c7c4dc553caee637e2f
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bob.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,7 @@
1
+ guard :rspec do
2
+ # specs
3
+ watch(%r{^spec/(.+)_spec.rb$})
4
+ # code
5
+ watch(%r{^lib/(.+)/(.+)\.rb$}) { |m| puts m.inspect; "spec/#{m[1]}/#{m[2]}_spec.rb" }
6
+ watch(%r{^lib/([^/]+)\.rb$}) { |m| puts m.inspect; "spec/#{m[1]}_spec.rb" }
7
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Giorgos Avramidis
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Bob
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'job-bob, require: 'bob'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install bob
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bob.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bob/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "job-bob"
8
+ spec.version = Bob::VERSION
9
+ spec.authors = ["Giorgos Avramidis", "Dario Hamidi"]
10
+ spec.email = ["avramidg@gmail.com", "dario.hamidi@gmail.com"]
11
+ spec.description = %q{Bob, the Job Fetcher}
12
+ spec.summary = %q{Fetch Job Posting Information}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "oj"
22
+ spec.add_dependency "nokogiri"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "vcr"
27
+ spec.add_development_dependency "webmock"
28
+ spec.add_development_dependency "guard"
29
+ spec.add_development_dependency "guard-rspec"
30
+ end
@@ -0,0 +1,163 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://jobs.github.com/lalalala.json
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - '*/*'
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 404
19
+ message: Not Found
20
+ headers:
21
+ Server:
22
+ - GitHub.com
23
+ Date:
24
+ - Sun, 20 Oct 2013 12:26:19 GMT
25
+ Content-Type:
26
+ - text/html;charset=utf-8
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Status:
32
+ - 404 Not Found
33
+ Strict-Transport-Security:
34
+ - max-age=31536000
35
+ X-Frame-Options:
36
+ - sameorigin
37
+ X-Xss-Protection:
38
+ - 1; mode=block
39
+ X-Cascade:
40
+ - pass
41
+ Set-Cookie:
42
+ - rack.session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRiJFMjZkZWVjZDY2MDQ5YWNkZTE4NTM2%0AYjdjMGNmM2YwZGYwMGEzMDJkOWQ5MmNhNWRmZGI3OWQwZWQ4YTkyN2Y5OEki%0ADXRyYWNraW5nBjsARnsISSIUSFRUUF9VU0VSX0FHRU5UBjsARiItYjIxN2U5%0AOGMzYmY3MGYzY2Y0NjMzYTU0NDdkNjU4N2VlYTk3NGJhMUkiGUhUVFBfQUND%0ARVBUX0VOQ09ESU5HBjsARiItZGRkMDk4OTE3NGYxOWE1YjE4NzkxMjEzY2M0%0AMGM1YTYwOWQyNTQ2Y0kiGUhUVFBfQUNDRVBUX0xBTkdVQUdFBjsARiItZGEz%0AOWEzZWU1ZTZiNGIwZDMyNTViZmVmOTU2MDE4OTBhZmQ4MDcwOQ%3D%3D%0A--90c871320df2ca8b83769d294c79366f6de7ca48;
43
+ path=/; HttpOnly; secure
44
+ body:
45
+ encoding: UTF-8
46
+ string: |
47
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
48
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
49
+
50
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
51
+ <head>
52
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
53
+ <title>GitHub Jobs</title>
54
+ <meta http-equiv="X-UA-Compatible" content="chrome=1" />
55
+ <link rel="stylesheet" href="/css/main.css" type="text/css" />
56
+ <script src="/js/main.js"></script>
57
+ <script type="text/javascript">
58
+ var _gaq = _gaq || [];
59
+ _gaq.push(['_setAccount', 'UA-3769691-9']);
60
+ _gaq.push(['_trackPageview']);
61
+
62
+ (function() {
63
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
64
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
65
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
66
+ })();
67
+ </script>
68
+ </head>
69
+ <body class="">
70
+ <div class="non-footer">
71
+ <div id="header">
72
+ <div id="wrap">
73
+ <h2 id="logo"><a href="http://jobs.github.com">GitHub Jobs</a></h2>
74
+ <ul id="gnav">
75
+ <li><a href="http://jobs.github.com/positions">All jobs</a></li>
76
+ <li><a href="https://jobs.github.com/post">Post a job</a></li>
77
+ <li><a href="http://jobs.github.com/faq">How it works</a></li>
78
+ </ul>
79
+ </div>
80
+ </div><!-- /#header -->
81
+ <div id="wrap">
82
+ <div id="search" class="clearfix">
83
+
84
+
85
+
86
+ </div><!-- /#search -->
87
+ <div id="page">
88
+ <div class="inner">
89
+ <div class="errorimage">
90
+ <img src="/images/modules/errors/404.png" />
91
+ <div class="message">
92
+ <h1>Octocat can&rsquo;t find the page you&rsquo;re looking for.</h1>
93
+ <p>Look, you made him cry, don&rsquo;t you feel bad?</p>
94
+ </div>
95
+ <p class="next">I guess you better <a href="/positions">look at some listings</a> or see <a href="/faq">how it works</a>.</p>
96
+ </div>
97
+ </div>
98
+ </div><!-- /#page -->
99
+ </div><!-- /#wrap -->
100
+ </div><!-- /.non-footer -->
101
+ <div id="footer">
102
+ <div class="inner">
103
+ <ul class="github-nav">
104
+ <li><a href="https://github.com/blog" class="blog">The GitHub Blog</a></li>
105
+ <li><a href="https://github.com/contact">Contact</a></li>
106
+ <li><a href="/api">API</a></li>
107
+ </ul>
108
+ <p class="copyline">&copy; 2013 GitHub Inc. All rights reserved.</p>
109
+ <a href="https://github.com"><img src="/images/layout/invertocat.png" width="24" height="24" class="invertocat" /></a>
110
+ <!-- Environment: production -->
111
+ </div>
112
+ </div><!-- /#footer -->
113
+ <!--[if IE 8]>
114
+ <script type="text/javascript" charset="utf-8">
115
+ $(document.body).addClass("ie8")
116
+ </script>
117
+ <![endif]-->
118
+
119
+ <!--[if IE 6]>
120
+ <style type="text/css" media="screen">
121
+ .non-footer, #footer{
122
+ display:none
123
+ }
124
+ .ie6-notice{
125
+ padding:50px;
126
+ font-size:24px;
127
+ font-weight:bold;
128
+ text-align:center;
129
+ color:#000;
130
+ }
131
+ </style>
132
+ <div class="ie6-notice">
133
+ <p>We're sorry, but we do not support Internet Explorer 6.</p>
134
+ <p>Please upgrade to <a href="http://www.google.com/chrome">Chrome</a>, <a href="http://getfirefox.com">Firefox</a> or <a href="http://www.microsoft.com/windows/internet-explorer/default.aspx">Internet Explorer 8</a>
135
+ </div>
136
+
137
+ <script type="text/javascript"src="//ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
138
+ <script>
139
+ CFInstall.check({
140
+ mode: "overlay"
141
+ });
142
+ </script>
143
+ <![endif]-->
144
+
145
+ <script type="text/javascript">
146
+ var _gauges = _gauges || [];
147
+ (function() {
148
+ var t = document.createElement('script');
149
+ t.type = 'text/javascript';
150
+ t.async = true;
151
+ t.id = 'gauges-tracker';
152
+ t.setAttribute('data-site-id', '4e791756613f5d4d93000001');
153
+ t.src = '//secure.gaug.es/track.js';
154
+ var s = document.getElementsByTagName('script')[0];
155
+ s.parentNode.insertBefore(t, s);
156
+ })();
157
+ </script>
158
+
159
+ </body>
160
+ </html>
161
+ http_version:
162
+ recorded_at: Sun, 20 Oct 2013 12:26:20 GMT
163
+ recorded_with: VCR 2.6.0
@@ -0,0 +1,50 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://jobs.github.com/positions/19341a08-377e-11e3-862f-7f91026928c0.json
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - '*/*'
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - GitHub.com
23
+ Date:
24
+ - Fri, 18 Oct 2013 15:12:26 GMT
25
+ Content-Type:
26
+ - application/json;charset=utf-8
27
+ Connection:
28
+ - keep-alive
29
+ Status:
30
+ - 200 OK
31
+ Strict-Transport-Security:
32
+ - max-age=31536000
33
+ X-Frame-Options:
34
+ - sameorigin
35
+ X-Xss-Protection:
36
+ - 1; mode=block
37
+ Content-Length:
38
+ - '4032'
39
+ Set-Cookie:
40
+ - rack.session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRiJFMGQ5NzYzNjBjYzQwZTNlYjQwNTE4%0AZmZlOWFjMzk1ZWY0MjU1MDA0Y2U3NDc4MDZjYzFhODMwNjA1ZTI3MTE3NEki%0ADXRyYWNraW5nBjsARnsISSIUSFRUUF9VU0VSX0FHRU5UBjsARiItYjIxN2U5%0AOGMzYmY3MGYzY2Y0NjMzYTU0NDdkNjU4N2VlYTk3NGJhMUkiGUhUVFBfQUND%0ARVBUX0VOQ09ESU5HBjsARiItZGRkMDk4OTE3NGYxOWE1YjE4NzkxMjEzY2M0%0AMGM1YTYwOWQyNTQ2Y0kiGUhUVFBfQUNDRVBUX0xBTkdVQUdFBjsARiItZGEz%0AOWEzZWU1ZTZiNGIwZDMyNTViZmVmOTU2MDE4OTBhZmQ4MDcwOQ%3D%3D%0A--6585743b174d534e6cbf2a0972c06a8f61db68d0;
41
+ path=/; HttpOnly; secure
42
+ Vary:
43
+ - Accept-Encoding
44
+ body:
45
+ encoding: UTF-8
46
+ string: |
47
+ {"id":"19341a08-377e-11e3-862f-7f91026928c0","created_at":"Thu Oct 17 22:48:01 UTC 2013","title":"Sr. Mobile Application Developer, Android at ModCloth","location":"San Francisco","type":"Full Time","description":"<p>ModCloth currently has an exciting opportunity for a highly skilled Android developer. You will join our San Francisco-based engineering team, building our v1.0 Android application for phone and tablet. Our iOS app is highly rated and designated an Editor\u2019s Choice app - so expectations are high!</p>\n\n<p>We are excited by the possibilities of the Android platform and the distribution options of the Play store; this is not just a port of our existing iOS app. We are looking to leverage the unique aspects of the platform and deliver a first class experience to our large (and growing) Android customer base.</p>\n\n<h3>Responsibilities:</h3>\n\n<p>Define, develop, and deliver features from product roadmap (v1.0 + ongoing)\nChampion best practices for Android development and testing\nCreate elegant and maintainable code\nRaise the team&#39;s skill level through pairing, design/code reviews, and mentoring\nResearch and prototype solutions to difficult problems, remove team roadblocks\nEnsure that finished products fully meet the UX designer\u2019s intention\nEvangelize the best new software libraries, techniques and practices\nDesign full-stack \u201cvertical slices of functionality\u201d</p>\n\n<h3>Requirements:</h3>\n\n<p>2+ years Android development experience, with knowlegde and experience in developing for multiple android operating systems and platforms\nSolid server side/API programming experience\nInterest in Android design principles and appreciation of developer guidelines\nAbility to mentor junior members of the team\nFull understanding of Agile Development and its best practices\nGreat communication and problem solving skills\nDesire to work with and help build a diverse team with a wide variety of backgrounds and interests</p>\n\n<h3>Nice to Have experience:</h3>\n\n<p>Ruby on Rails\nRobotium\nRobolectric\nExperience shipping apps via the Play store\nWell considered opinion on ADT vs. Android Studio\nE-commerce\nInterest in open-source projects</p>\n\n<h3>The Benefits You\u2019ll Get:</h3>\n\n<p>As part of the ModCloth community, you\u2019ll be entitled to a great list of benefits including (but not limited to!) medical, dental, vision, 401k, life insurance, emergency travel assistance, flex time, and continuing education stipends. Oh, and let\u2019s not forget the snack wall and the staggering employee discount!</p>\n\n<h3>About ModCloth:</h3>\n\n<p>If you\u2019ve made it this far, you probably want some more background on ModCloth. Not a prob! ModCloth is an innovative, rapidly growing e-retailer that sells affordable independent designer fashion and decor. Through groundbreaking technology, social media, and customer involvement, we\u2019re creating a brand that\u2019s disrupting the world of social commerce. You\u2019ve already seen how this is happening with our consumer-empowering Be the Buyer program and customer-designed Make the Cut initiative, and that\u2019s just the beginning of what\u2019s up our sleeve. By combining this eye for innovation with a fun-loving group of employees whose culture centers on passion, entrepreneurship, and fun ModCloth is furthering its current success!</p>\n\n<p>Itching for more info about life at ModCloth? Then, take a look-see at our ModCloth Careers Twitter (<a href=\"http://bit.ly/dNSfyh\">http://bit.ly/dNSfyh</a>) and Facebook (<a href=\"http://on.fb.me/eImYYU\">http://on.fb.me/eImYYU</a>) pages!</p>\n","how_to_apply":"<p>Apply here: <a href=\"https://hire.jobvite.com/j?cj=oooSXfwl&amp;s=GitHub\">https://hire.jobvite.com/j?cj=oooSXfwl&amp;s=GitHub</a></p>\n","company":"ModCloth","company_url":"http://www.modcloth.com","company_logo":"http://github-jobs.s3.amazonaws.com/f5100178-377d-11e3-8618-7ebb0e979680.png","url":"http://jobs.github.com/positions/19341a08-377e-11e3-862f-7f91026928c0"}
48
+ http_version:
49
+ recorded_at: Fri, 18 Oct 2013 15:12:26 GMT
50
+ recorded_with: VCR 2.6.0
@@ -0,0 +1,410 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://careers.stackoverflow.com/company/stadtwerke-m%C3%BCnchen
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - '*/*'
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Cache-Control:
22
+ - private
23
+ Content-Type:
24
+ - text/html; charset=utf-8
25
+ Vary:
26
+ - Accept-Encoding
27
+ Access-Control-Allow-Origin:
28
+ - '*'
29
+ Access-Control-Allow-Methods:
30
+ - POST, GET, OPTIONS
31
+ Access-Control-Allow-Headers:
32
+ - x-requested-with
33
+ Access-Control-Max-Age:
34
+ - '60'
35
+ Date:
36
+ - Sat, 19 Oct 2013 18:58:16 GMT
37
+ Content-Length:
38
+ - '5208'
39
+ body:
40
+ encoding: ASCII-8BIT
41
+ string: !binary |-
42
+ PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEg
43
+ VHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0
44
+ L2xvb3NlLmR0ZCI+DQoNCjwhLS1baWYgbHQgSUUgN10+ICAgICAgPGh0bWwg
45
+ Y2xhc3M9Im5vLWpzIGx0LWllOSBsdC1pZTggbHQtaWU3Ij4gPCFbZW5kaWZd
46
+ LS0+DQoNCjwhLS1baWYgSUUgN10+ICAgICAgICAgPGh0bWwgY2xhc3M9Im5v
47
+ LWpzIGx0LWllOSBsdC1pZTgiPiA8IVtlbmRpZl0tLT4NCjwhLS1baWYgSUUg
48
+ OF0+ICAgICAgICAgPGh0bWwgY2xhc3M9Im5vLWpzIGx0LWllOSI+IDwhW2Vu
49
+ ZGlmXS0tPg0KPCEtLVtpZiBndCBJRSA4XT48IS0tPg0KPGh0bWwgY2xhc3M9
50
+ Im5vLWpzIj4NCjwhLS08IVtlbmRpZl0tLT4NCg0KICAgICAgICA8aGVhZD4N
51
+ CiAgICAgICAgICAgIDx0aXRsZT5Db21wYW55IFBhZ2U6IFN0YWR0d2Vya2Ug
52
+ TSYjMjUyO25jaGVuIEdtYkggLSBTdGFjayBPdmVyZmxvdyBDYXJlZXJzIDIu
53
+ MCA8L3RpdGxlPg0KICAgICAgICAgICAgPGxpbmsgaHJlZj0iLy9jZG4tY2Fy
54
+ ZWVycy5zc3RhdGljLm5ldC9jYXJlZXJzL2Nzby9hbGwubWluLmNzcz92PWM3
55
+ OGVlOGU3ZDgwNiIgcmVsPSJzdHlsZXNoZWV0IiAvPg0KICAgICAgICAgICAg
56
+ DQogICAgPGxpbmsgaHJlZj0iLy9jZG4tY2FyZWVycy5zc3RhdGljLm5ldC9j
57
+ YXJlZXJzL2Nzby9jb21wYW55LXBhZ2VzLm1pbi5jc3M/dj1iMmQ2OGIyZjdj
58
+ M2IiIHJlbD0ic3R5bGVzaGVldCIgLz4NCg0KPCEtLVtpZiBsdCBJRSA4XT4N
59
+ CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQppbnB1dFt0eXBlPXN1Ym1pdF0s
60
+ IGJ1dHRvbg0Kew0KICAgIHdpZHRoOmF1dG8gIWltcG9ydGFudDsNCiAgICBt
61
+ aW4td2lkdGg6MDsNCn0NCjwvc3R5bGU+DQo8IVtlbmRpZl0tLT4NCiAgICAg
62
+ ICAgICAgIA0KICAgIA0KPG1ldGEgbmFtZT0idHdpdHRlcjpjYXJkIiBjb250
63
+ ZW50PSJzdW1tYXJ5X2xhcmdlX2ltYWdlIj4NCjxtZXRhIG5hbWU9InR3aXR0
64
+ ZXI6c2l0ZSIgY29udGVudD0iQFN0YWNrQ2FyZWVycyI+DQo8bWV0YSBuYW1l
65
+ PSJ0d2l0dGVyOmRvbWFpbiIgY29udGVudD0iU3RhY2sgT3ZlcmZsb3cgQ2Fy
66
+ ZWVycyI+DQo8bWV0YSBuYW1lPSJ0d2l0dGVyOnRpdGxlIiBjb250ZW50PSJT
67
+ dGFkdHdlcmtlIE0mIzI1MjtuY2hlbiBHbWJIIj4NCjxtZXRhIG5hbWU9InR3
68
+ aXR0ZXI6ZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkRpZSBTdGFkdHdlcmtlIE0m
69
+ YW1wO2FtcDt1dW1sO25jaGVuIChTV00pIHomYW1wO2FtcDthdW1sO2hsZW4g
70
+ enUgZGVuIGdyJmFtcDthbXA7b3VtbDsmYW1wO2FtcDtzemxpZzt0ZW4gRW5l
71
+ cmdpZS0gdW5kIEluZnJhc3RydWt0dXJ1bnRlcm5laG1lbiBEZXV0c2NobGFu
72
+ ZHMuICZhbXA7YW1wO1V1bWw7YmVyIGVpbmUgTWlsbGlvbiBQcml2YXRoYXVz
73
+ aGFsdGUsIEdld2VyYmUtIHVuZCBHZXNjaCZhbXA7YW1wO2F1bWw7ZnRza3Vu
74
+ ZGVu4oCmIj4NCjxtZXRhIG5hbWU9InR3aXR0ZXI6aW1hZ2UiIGNvbnRlbnQ9
75
+ Imh0dHA6Ly9pLnN0YWNrLmltZ3VyLmNvbS9naHVoYmwuanBnIj4NCg0KDQoN
76
+ CiAgICAgICAgICAgICAgICA8bGluayByZWw9ImFsdGVybmF0ZSIgaHJlZmxh
77
+ bmc9ImVuLVVTIiBocmVmPSIvY29tcGFueS9zdGFkdHdlcmtlLW0lQzMlQkNu
78
+ Y2hlbiIgLz4NCiAgICAgICAgICAgICAgICA8bGluayByZWw9ImFsdGVybmF0
79
+ ZSIgaHJlZmxhbmc9ImRlLURFIiBocmVmPSIvZGUvY29tcGFueS9zdGFkdHdl
80
+ cmtlLW0lQzMlQkNuY2hlbiIgLz4NCiAgICAgICAgICAgICAgICA8bGluayBy
81
+ ZWw9ImFsdGVybmF0ZSIgaHJlZmxhbmc9ImVuLUdCIiBocmVmPSIvdWsvY29t
82
+ cGFueS9zdGFkdHdlcmtlLW0lQzMlQkNuY2hlbiIgLz4NCiAgICAgICAgICAg
83
+ ICAgICA8bGluayByZWw9ImFsdGVybmF0ZSIgaHJlZmxhbmc9ImZyLUZSIiBo
84
+ cmVmPSIvZnIvY29tcGFueS9zdGFkdHdlcmtlLW0lQzMlQkNuY2hlbiIgLz4N
85
+ CiAgICAgICAgICAgIDxsaW5rIHJlbD0iY2Fub25pY2FsIiBocmVmPSJodHRw
86
+ Oi8vY2FyZWVycy5zdGFja292ZXJmbG93LmNvbS9jb21wYW55L3N0YWR0d2Vy
87
+ a2UtbSYjMjUyO25jaGVuIiAvPg0KICAgICAgICAgICAgICAgIDxsaW5rIHJl
88
+ bD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iLy9jZG4tY2FyZWVycy5zc3RhdGlj
89
+ Lm5ldC9jYXJlZXJzL0ltZy9mYXZpY29uLmljbz92PTBhMDI0NmM3YTA1OSIg
90
+ Lz4NCg0KDQogICAgICAgIDwvaGVhZD4NCiAgICA8Ym9keT4NCiAgICAgICAg
91
+ PG5vc2NyaXB0Pg0KICAgICAgICAgICAgPGRpdiBpZD0ibm9zY3JpcHQtcGFk
92
+ ZGluZyI+PC9kaXY+DQogICAgICAgIDwvbm9zY3JpcHQ+DQoNCiAgICAgICAg
93
+ DQogICAgICAgICAgICA8ZGl2IGlkPSJnbG9iYWwiPg0KICAgICAgICAgICAg
94
+ ICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+DQoNCg0KDQo8dWwgaWQ9Im5h
95
+ di1nbG9iYWwiIGNsYXNzPSJuYXYiPg0KICAgICAgICA8bGkgY2xhc3M9Imxv
96
+ Z2luIj4NCjxhIGhyZWY9Imh0dHA6Ly9jYXJlZXJzLnN0YWNrb3ZlcmZsb3cu
97
+ Y29tL3VzZXJzL2xvZ2luP3JldHVyblVybD0lMmZjb21wYW55JTJmc3RhZHR3
98
+ ZXJrZS1tJTI1QzMlMjVCQ25jaGVuIj5sb2cgaW48L2E+ICAgICAgICA8L2xp
99
+ Pg0KPC91bD4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAg
100
+ IDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBpZD0iaGVhZGVyIj4NCiAgICAg
101
+ ICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPg0KICAgICAgICAg
102
+ ICAgICAgICAgICA8ZGl2IGNsYXNzPSJicmFuZGluZyI+DQoNCiAgICAgICAg
103
+ ICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvIiBjbGFzcz0idHdvLW9o
104
+ Ij48aW1nIGFsdD0iQ2FyZWVycyAyLjAiIHNyYz0iLy9jZG4tY2FyZWVycy5z
105
+ c3RhdGljLm5ldC9jYXJlZXJzL0ltZy9sb2dvLW5ldy5wbmc/dj02ZTM0NjQ1
106
+ MWNjNTAiPjwvYT4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAg
107
+ ICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2IGNhcmVlcnMiPg0KDQog
108
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz0i
109
+ IiBocmVmPSIvIj5ob21lPC9hPjwvbGk+DQogICAgICAgICAgICAgICAgICAg
110
+ ICAgICAgICAgICAgIDxsaT48YSBjbGFzcz0iIiBocmVmPSIvam9icyI+c2Vh
111
+ cmNoIGpvYnM8L2E+PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAg
112
+ ICAgICAgPGxpPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL2pvYnMvY29t
113
+ cGFuaWVzIj5jb21wYW5pZXM8L2E+PC9saT4NCiAgICAgICAgICAgICAgICAg
114
+ ICAgICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz0iIiBocmVmPSIvY3Yi
115
+ Pm15IHByb2ZpbGU8L2E+PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAg
116
+ ICAgICAgICAgICAgIDxsaSBjbGFzcz0icm9sZS1zd2l0Y2giPjxhIGhyZWY9
117
+ Ii9wcm9kdWN0cyIgdGl0bGU9InBvc3Qgam9iIGxpc3RpbmdzLCBzZWFyY2gg
118
+ Y2FuZGlkYXRlcywgYW5kIG1vcmUiPmZvciBlbXBsb3llcnMgJiMxODc7PC9h
119
+ PjwvbGk+DQogICAgICAgICAgICAgICAgICAgIDwvdWw+DQoNCiAgICAgICAg
120
+ ICAgICAgICA8YnIgY2xhc3M9ImNsZWFyIiAvPg0KICAgICAgICAgICAgICAg
121
+ IDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAg
122
+ PGRpdiBjbGFzcz0iY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICA8ZGl2
123
+ IGlkPSJjb250ZW50Ij4NCiAgICAgICAgICAgICAgICAgICAgDQoNCg0KDQoN
124
+ CjxkaXYgaWQ9ImNvbXBhbnktcHJvZmlsZSIgY2xhc3M9InZpZXciPg0KICAg
125
+ ICAgICA8ZGl2IGRhdGEtY29tcGFueS1zZWN0aW9uPSJ0b3AtaW1hZ2UiPg0K
126
+ ICAgICAgICA8aW1nIHNyYz0iaHR0cDovL2kuc3RhY2suaW1ndXIuY29tL2do
127
+ dWhiLmpwZyIgYWx0PSIiLz4NCiAgICA8L2Rpdj4NCg0KICAgICAgICA8ZGl2
128
+ IGRhdGEtY29tcGFueS1zZWN0aW9uPSJjb21wYW55LWluZm8iPg0KICAgICAg
129
+ ICA8ZGl2IGNsYXNzPSJsb2dvLWNvbnRhaW5lciI+DQogICAgICAgICAgICA8
130
+ dGFibGU+PHRyPjx0ZD48aW1nIHNyYz0iaHR0cDovL2kuc3RhY2suaW1ndXIu
131
+ Y29tL0tBS1E4LnBuZyIgYWx0PSIiIC8+PC90ZD48L3RyPjwvdGFibGU+DQog
132
+ ICAgICAgIDwvZGl2Pg0KICAgICAgICA8aDE+U3RhZHR3ZXJrZSBNJiMyNTI7
133
+ bmNoZW4gR21iSDwvaDE+DQogICAgICAgIDxkaXYgY2xhc3M9InJpZ2h0Ij4N
134
+ CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iYmFzaWNzIj4NCiAgICAgICAg
135
+ ICAgICAgICAgICAgPHRyPjx0ZD5zaXplOjwvdGQ+PHRkPjUuMDAxLTEwLjAw
136
+ MDwvdGQ+PC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
137
+ ICAgIDx0cj48dGQ+c3RhdHVzOjwvdGQ+PHRkPiYjMjE0O2ZmZW50bGljaDwv
138
+ dGQ+PC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
139
+ IDx0cj48dGQ+Zm91bmRlZDo8L3RkPjx0ZD4xOTk4PC90ZD48L3RyPg0KICAg
140
+ ICAgICAgICAgPC90YWJsZT4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Imxp
141
+ bmtzIGNsZWFyIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0
142
+ cDovL3d3dy5zd20uZGUiPmh0dHA6Ly93d3cuc3dtLmRlPC9hPg0KICAgICAg
143
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6
144
+ Ly93d3cuZmFjZWJvb2suY29tL1N0YWR0d2Vya2VNdWVuY2hlbj9mcmVmPXRz
145
+ IiBjbGFzcz0iZmFjZWJvb2siPjwvYT4NCiAgICAgICAgICAgICAgICAgICAg
146
+ ICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2
147
+ Pg0KICAgIDwvZGl2Pg0KDQogICAgICAgIDxkaXYgZGF0YS1jb21wYW55LXNl
148
+ Y3Rpb249ImNvbXBhbnktc3RhdGVtZW50Ij4NCiAgICAgICAgPGgyPiYjMjIw
149
+ O2JlciB1bnM8L2gyPg0KICAgICAgICA8ZGl2PjxwPkRpZSBTdGFkdHdlcmtl
150
+ IE0mdXVtbDtuY2hlbiAoU1dNKSB6JmF1bWw7aGxlbiB6dSBkZW4gZ3Imb3Vt
151
+ bDsmc3psaWc7dGVuIEVuZXJnaWUtIHVuZCBJbmZyYXN0cnVrdHVydW50ZXJu
152
+ ZWhtZW4gRGV1dHNjaGxhbmRzLiAmVXVtbDtiZXIgZWluZSBNaWxsaW9uIFBy
153
+ aXZhdGhhdXNoYWx0ZSwgR2V3ZXJiZS0gdW5kIEdlc2NoJmF1bWw7ZnRza3Vu
154
+ ZGVuIHByb2ZpdGllcmVuIHQmYXVtbDtnbGljaCB2b24gZGVuIFNXTSBEaWVu
155
+ c3RsZWlzdHVuZ2VuIHVuZCBBbmdlYm90ZW4uIFNlaXQgSmFocnplaG50ZW4g
156
+ c3RlaGVuIGRpZSBTV00gZiZ1dW1sO3IgZWluZSBzaWNoZXJlIHVuZCByZXNz
157
+ b3VyY2Vuc2Nob25lbmRlIFZlcnNvcmd1bmcgZGVyIGJheWVyaXNjaGVuIE1l
158
+ dHJvcG9sZSBtaXQgRW5lcmdpZSAoU3Ryb20sIEVyZGdhcywgRmVybncmYXVt
159
+ bDtybWUpLjwvcD4KPHA+Vm9yYmlsZGNoYXJha3RlciBmJnV1bWw7ciBhbmRl
160
+ cmUgS29tbXVuZW4gaGFiZW4gdS5hLiBkaWUgU1dNIEF1c2JhdW9mZmVuc2l2
161
+ ZSBFcm5ldWVyYmFyZSBFbmVyZ2llbiB1bmQgZGllIE9mZmVuc2l2ZSBmJnV1
162
+ bWw7ciBkaWUgdW13ZWx0ZnJldW5kbGljaGUgRmVybncmYXVtbDtybWUuIERh
163
+ ciZ1dW1sO2JlciBoaW5hdXMgdmVyc29yZ2VuIGRpZSBTV00gZGllIE1pbGxp
164
+ b25lbnN0YWR0IG1pdCBxdWVsbGZyaXNjaGVtIFRyaW5rd2Fzc2VyIGF1cyBk
165
+ ZW0gYmF5ZXJpc2NoZW4gVm9yYWxwZW5sYW5kICZuZGFzaDsgZWluZXMgZGVy
166
+ IGJlc3RlbiBFdXJvcGFzICZuZGFzaDsgdW5kIGJldHJlaWJlbiBtaXQgMTgg
167
+ SGFsbGVuLSB1bmQgRnJlaWImYXVtbDtkZXJuIGVpbmUgZGVyIG1vZGVybnN0
168
+ ZW4gQiZhdW1sO2RlcmxhbmRzY2hhZnRlbiBpbiBEZXV0c2NobGFuZC4gRGll
169
+ IFZlcmtlaHJzdG9jaHRlciBNVkcgaXN0IHZlcmFudHdvcnRsaWNoIGYmdXVt
170
+ bDtyIFUtQmFobiwgQnVzIHVuZCBUcmFtIHVuZCBkYW1pdCBlaW4gd2VzZW50
171
+ bGljaGVyIFBmZWlsZXIgaW0gTSZ1dW1sO25jaG5lciAmT3VtbDtQTlYuPC9w
172
+ Pgo8cD5EZXIgU1dNIEtvbnplcm4gYmVzY2gmYXVtbDtmdGlndCBydW5kIDgu
173
+ MTAwIE1pdGFyYmVpdGVyaW5uZW4gdW5kIE1pdGFyYmVpdGVyLiBJbSBHZXNj
174
+ aCZhdW1sO2Z0c2phaHIgMjAxMiBsYWcgZGVyIEtvbnplcm51bXNhdHogYmVp
175
+ IHJ1bmQgNCw1IE1pbGxpYXJkZW4gRXVyby48L3A+PC9kaXY+DQogICAgPC9k
176
+ aXY+DQoNCiAgICAgICAgPGRpdiBkYXRhLWNvbXBhbnktc2VjdGlvbj0iY29t
177
+ cGFueS1zdGF0ZW1lbnQiPg0KICAgICAgICA8aDI+U1dNIEthcnJpZXJlPC9o
178
+ Mj4NCiAgICAgICAgPGRpdj48cD5BbHMgd2lydHNjaGFmdHNzdGFya2VyIHVu
179
+ ZCBlbmdhZ2llcnRlciBBcmJlaXRnZWJlciBmJnV1bWw7aGxlbiB3aXIgdW5z
180
+ IHVuc2VyZW0gd2ljaHRpZ3N0ZW4gRXJmb2xnc2Zha3RvciB2ZXJwZmxpY2h0
181
+ ZXQgJm5kYXNoOyB1bnNlcmVuIE1pdGFyYmVpdGVyaW5uZW4gdW5kIE1pdGFy
182
+ YmVpdGVybi4gQmVpIGRlbiBTV00gZ2lidCBlcyB2aWVsZiZhdW1sO2x0aWdl
183
+ IFQmYXVtbDt0aWdrZWl0c2ZlbGRlciB2b2xsZXIgc3Bhbm5lbmRlciBBdWZn
184
+ YWJlbiB1bmQgUHJvamVrdGUuPC9wPgo8cD5HZXN1Y2h0ZSBGYWNocmljaHR1
185
+ bmdlbjo8YnIgLz5CYXVpbmdlbmlldXJ3ZXNlbjxiciAvPkVsZWt0cm90ZWNo
186
+ bmlrPGJyIC8+RW5lcmdpZXRlY2huaWsgKC13aXJ0c2NoYWZ0KTxiciAvPklu
187
+ Zm9ybWF0aWs8YnIgLz5JbmZvcm1hdGlvbnN0ZWNobmlrPGJyIC8+TWFzY2hp
188
+ bmVuYmF1PGJyIC8+TWVjaGF0cm9uaWs8YnIgLz5XaXJ0c2NoYWZ0c2luZm9y
189
+ bWF0aWs8YnIgLz5XaXJ0c2NoYWZ0c2luZ2VuaWV1cndlc2VuPGJyIC8+V2ly
190
+ dHNjaGFmdHN3aXNzZW5zY2hhZnRlbjxiciAvPlZlcmZhaHJlbnN0ZWNobmlr
191
+ PC9wPgo8cD5Ba3R1ZWxsZSBTdGVsbGVuYW56ZWlnZW46PGJyIC8+aHR0cDov
192
+ L3d3dy5zd20uZGUva2FycmllcmU8L3A+PC9kaXY+DQogICAgPC9kaXY+DQoN
193
+ CiAgICANCiAgICANCg0KDQogICAgDQoNCg0KICAgIA0KDQogICAgPGRpdiBk
194
+ YXRhLWNvbXBhbnktc2VjdGlvbj0iZ2FsbGVyeSIgbmctY29udHJvbGxlcj0i
195
+ R2FsbGVyeUNvbnRyb2xsZXIiPg0KICAgICAgICA8YSBuYW1lPSJnYWxsZXJ5
196
+ Ij48L2E+DQogICAgICAgIDxkaXYgY2xhc3M9ImFjdGl2ZS1pdGVtIiBuZy1z
197
+ d2l0Y2ggb249ImFjdGl2ZUl0ZW0uVHlwZSI+DQogICAgICAgICAgICA8aW1n
198
+ IG5nLXN3aXRjaC13aGVuPSJpbWFnZSIgbmctc3JjPSJ7eyBhY3RpdmVJdGVt
199
+ LlVybCB9fSIgLz4NCiAgICAgICAgICAgIDxpZnJhbWUgbmctc3dpdGNoLXdo
200
+ ZW49InlvdXR1YmUiIHdpZHRoPSI5NzUiIGhlaWdodD0iNTUwIiBuZy1zcmM9
201
+ Int7IGFjdGl2ZUl0ZW0uVXJsIH19IiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dm
202
+ dWxsc2NyZWVuPjwvaWZyYW1lPg0KICAgICAgICAgICAgPGlmcmFtZSBuZy1z
203
+ d2l0Y2gtd2hlbj0idmltZW8iIHdpZHRoPSI5NzUiIGhlaWdodD0iNTUwIiBu
204
+ Zy1zcmM9Int7IGFjdGl2ZUl0ZW0uVXJsIH19IiBmcmFtZWJvcmRlcj0iMCIg
205
+ d2Via2l0QWxsb3dGdWxsU2NyZWVuIG1vemFsbG93ZnVsbHNjcmVlbiBhbGxv
206
+ d0Z1bGxTY3JlZW4+PC9pZnJhbWU+DQogICAgICAgIDwvZGl2Pg0KICAgICAg
207
+ ICA8ZGl2IGNsYXNzPSJjYXJvdXNlbCIgbmctc2hvdz0iZGlzcGxheU5hdiI+
208
+ DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sdGlwIj48L2Rpdj4NCiAg
209
+ ICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmV2aW91cyIgbmctY2xpY2s9InBy
210
+ ZXZpb3VzUGFnZSgpIiBuZy1jbGFzcz0ieyBkaXNhYmxlZDogY3VycmVudFBh
211
+ Z2UgPT0gMCB9Ij48L3NwYW4+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJp
212
+ dGVtcy1jb250YWluZXIiIG5nLXJlcGVhdD0iKGlkeCwgcGFnZSkgaW4gcGFn
213
+ ZWRJdGVtcyIgbmctc2hvdz0iaWR4ID09IGN1cnJlbnRQYWdlIj4NCiAgICAg
214
+ ICAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD0iZ2FsbGVyeUl0ZW0gaW4gcGFn
215
+ ZSIgY2xhc3M9Iml0ZW0ge3sgZ2FsbGVyeUl0ZW0uVHlwZSB9fSIgbmctY2xh
216
+ c3M9InsgYWN0aXZlOiBhY3RpdmVJdGVtID09IGdhbGxlcnlJdGVtIH0iIG5n
217
+ LWNsaWNrPSJzZXRBY3RpdmUoZ2FsbGVyeUl0ZW0pIj4NCiAgICAgICAgICAg
218
+ ICAgICAgICAgPGRpdiBjbGFzcz0iaGVscGVyIj48L2Rpdj4NCiAgICAgICAg
219
+ ICAgICAgICAgICAgPGltZyBhbHQ9IiIgbmctc3JjPSJ7eyBnYWxsZXJ5SXRl
220
+ bS5UaHVtYm5haWxVcmwgfX0iIC8+DQogICAgICAgICAgICAgICAgPC9kaXY+
221
+ DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxzcGFuIGNsYXNz
222
+ PSJuZXh0IiBuZy1jbGljaz0ibmV4dFBhZ2UoKSIgbmctY2xhc3M9InsgZGlz
223
+ YWJsZWQ6IHBhZ2VkSXRlbXMubGVuZ3RoID09IDAgfHwgY3VycmVudFBhZ2Ug
224
+ PT0gcGFnZWRJdGVtcy5sZW5ndGggLSAxIH0iPjwvc3Bhbj4NCiAgICAgICAg
225
+ PC9kaXY+DQogICAgPC9kaXY+DQoNCiAgICANCg0KDQoNCiAgICANCg0KICAg
226
+ IDxkaXYgZGF0YS1jb21wYW55LXNlY3Rpb249ImxvY2F0aW9ucyI+DQogICAg
227
+ ICAgIDxhIG5hbWU9ImxvY2F0aW9ucyI+PC9hPg0KICAgICAgICA8aDI+TG9j
228
+ YXRpb25zPC9oMj4NCg0KICAgICAgICA8ZGl2IGNsYXNzPSJhZGRyZXNzZXMi
229
+ Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFkZHJlc3MiIGRhdGEt
230
+ bWFwLXVybD0iaHR0cDovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkv
231
+ c3RhdGljbWFwP3NpemU9NTQ5eDM0NiZhbXA7bWFwdHlwZT1yb2FkbWFwJmFt
232
+ cDtzZW5zb3I9ZmFsc2UmYW1wO2NlbnRlcj1FbW15LU5vZXRoZXItU3RyYSVj
233
+ MyU5ZmUrMiUyYys4MDk5MitNJWMzJWJjbmNoZW4mYW1wO21hcmtlcnM9Y29s
234
+ b3I6cmVkJTdDRW1teS1Ob2V0aGVyLVN0cmElYzMlOWZlKzIlMmMrODA5OTIr
235
+ TSVjMyViY25jaGVuIj5FbW15LU5vZXRoZXItU3RyYSYjMjIzO2UgMiwgODA5
236
+ OTIgTSYjMjUyO25jaGVuPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgICAg
237
+ ICANCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcCI+DQogICAgICAgICAg
238
+ ICAgICAgPGltZyBhbHQ9IiIgd2lkdGg9IjU0OSIgaGVpZ2h0PSIzNDYiIHNy
239
+ Yz0iIiAvPg0KICAgICAgICAgICAgPC9kaXY+DQoNCg0KICAgICAgICA8YnIg
240
+ Y2xhc3M9ImNsZWFyIi8+DQogICAgPC9kaXY+DQoNCg0KICAgIDxpbWcgYWx0
241
+ PSIiIGNsYXNzPSJhbmFseXRpYyIgc3JjPSIvYW5hbHl0aWNzL2NvbXBhbnlw
242
+ YWdldmlzaXQvMTA0OSI+DQo8L2Rpdj4NCg0KDQogICAgICAgICAgICAgICAg
243
+ PC9kaXY+DQogICAgICAgICAgICAgICAgPGJyIGNsYXNzPSJjbGVhciIgLz4N
244
+ CiAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgPGRpdiBpZD0iZm9vdGVyIj4N
245
+ CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+DQoNCiAgICAg
246
+ ICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2dvIj4NCiAgICAgICAgICAgICAg
247
+ ICAgICAgPGltZyBhbHQ9IkNhcmVlcnMgMi4wIiBzcmM9Ii8vY2RuLWNhcmVl
248
+ cnMuc3N0YXRpYy5uZXQvY2FyZWVycy9JbWcvbG9nby1ncmF5LnBuZz92PWIx
249
+ ZWQxZjVhNGY1ZCI+DQogICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAg
250
+ ICAgICAgICAgICAgICAgPGRpdiBpZD0iZm9vdGVyLW1lbnUiPg0KICAgICAg
251
+ ICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2Fib3V0Ij5hYm91dDwvYT4N
252
+ CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9mYXEiPmZhcTwv
253
+ YT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9zdXBwb3J0
254
+ Ij5zdXBwb3J0PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJl
255
+ Zj0iaHR0cDovL2Jsb2cuY2FyZWVycy5zdGFja292ZXJmbG93LmNvbSI+Ymxv
256
+ ZzwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJo
257
+ dHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vbGVnYWwiPmxlZ2FsPC9hPg0KICAg
258
+ ICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zdGFj
259
+ a2V4Y2hhbmdlLmNvbS9sZWdhbC9wcml2YWN5LXBvbGljeSI+cHJpdmFjeSBw
260
+ b2xpY3k8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJl
261
+ Zj0iaHR0cDovL2VuZ2luZS5hZHplcmsubmV0L3I/ZT1leUpoZGlJNk5ERTBM
262
+ Q0poZENJNk1qQXNJbU50SWpvNU5UUXNJbU5vSWpveE1UYzRMQ0pqY2lJNk16
263
+ TTVNU3dpWkcwaU9qUXNJbVpqSWpvek9EQTVMQ0ptYkNJNk1qYzFNU3dpYm5j
264
+ aU9qSXlMQ0p5ZGlJNk1Dd2ljSElpT2pFeE5Td2ljM1FpT2pBc0luVnlJam9p
265
+ YUhSMGNEb3ZMM04wWVdOcmIzWmxjbVpzYjNjdVkyOXRMMkZpYjNWMEwyTnZi
266
+ blJoWTNRaUxDSnlaU0k2TVgwJnM9VVZQdnZTVE95WXEtc0Z6VHhuUWI3X2Rn
267
+ OTFFIj5hZHZlcnRpc2UgaGVyZTwvYT4NCiAgICAgICAgICAgICAgICAgICAg
268
+ ICAgIDxzdHJvbmc+PGEgaHJlZj0iaHR0cDovL3R3aXR0ZXIuY29tL1N0YWNr
269
+ Q2FyZWVycyI+Zm9sbG93IHVzPC9hPjwvc3Ryb25nPg0KICAgICAgICAgICAg
270
+ ICAgICAgICAgICAgPHN0cm9uZz48YSBocmVmPSJodHRwOi8vbWV0YS5zdGFj
271
+ a292ZXJmbG93LmNvbSI+ZmVlZGJhY2sgYWx3YXlzIHdlbGNvbWU8L2E+PC9z
272
+ dHJvbmc+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InNp
273
+ dGVzIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHls
274
+ ZT0iY29sb3I6ICNGRTdBMTUiPuKWoDwvc3Bhbj4mbmJzcDs8YSBocmVmPSJo
275
+ dHRwOi8vc3RhY2tvdmVyZmxvdy5jb20iPnN0YWNrb3ZlcmZsb3cuY29tPC9h
276
+ Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJj
277
+ b2xvcjogI0U4MjcyQyI+4pagPC9zcGFuPiZuYnNwOzxhIGhyZWY9Imh0dHA6
278
+ Ly9zZXJ2ZXJmYXVsdC5jb20iPnNlcnZlcmZhdWx0LmNvbTwvYT4NCiAgICAg
279
+ ICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMw
280
+ MEFGRUYiPuKWoDwvc3Bhbj4mbmJzcDs8YSBocmVmPSJodHRwOi8vc3VwZXJ1
281
+ c2VyLmNvbSI+c3VwZXJ1c2VyLmNvbTwvYT4NCiAgICAgICAgICAgICAgICAg
282
+ ICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM5Njk2OTYiPuKWoDwv
283
+ c3Bhbj4mbmJzcDs8YSBocmVmPSJodHRwOi8vbWV0YS5zdGFja292ZXJmbG93
284
+ LmNvbSI+bWV0YTwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2
285
+ Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0idHJh
286
+ bnNsYXRpb25zIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
287
+ ICAgIDxzcGFuIHN0eWxlPSJjb2xvcjojRTgyNzJDIj7ilqA8L3NwYW4+DQo8
288
+ YSBocmVmPSIvY29tcGFueS9zdGFkdHdlcmtlLW0lQzMlQkNuY2hlbiI+Q2Fy
289
+ ZWVycyAyLjA8L2E+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
290
+ ICAgPHNwYW4gc3R5bGU9ImNvbG9yOiNGRkNFMDAiPuKWoDwvc3Bhbj4NCjxh
291
+ IGhyZWY9Ii9kZS9jb21wYW55L3N0YWR0d2Vya2UtbSVDMyVCQ25jaGVuIj5D
292
+ YXJlZXJzIERldXRzY2g8L2E+ICAgICAgICAgICAgICAgICAgICAgICAgICAg
293
+ ICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiMwMDI0N2QiPuKWoDwvc3Bh
294
+ bj4NCjxhIGhyZWY9Ii91ay9jb21wYW55L3N0YWR0d2Vya2UtbSVDMyVCQ25j
295
+ aGVuIj5DYXJlZXJzIFVLPC9hPiAgICAgICAgICAgICAgICAgICAgICAgICAg
296
+ ICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjojRUY0MTM1Ij7ilqA8L3Nw
297
+ YW4+DQo8YSBocmVmPSIvZnIvY29tcGFueS9zdGFkdHdlcmtlLW0lQzMlQkNu
298
+ Y2hlbiI+Q2FyZWVycyBGcmFuJiMyMzE7YWlzPC9hPiAgICAgICAgICAgICAg
299
+ ICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAg
300
+ IDxkaXYgaWQ9ImNvcHlyaWdodCI+DQogICAgICAgICAgICAgICAgICAgICAg
301
+ ICAgICAgc2l0ZSBkZXNpZ24gLyBsb2dvICYjMTY5OyAyMDEzIHN0YWNrIGV4
302
+ Y2hhbmdlIGluYw0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQog
303
+ ICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICA8L2Rp
304
+ dj4NCiAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgPG5vc2NyaXB0Pg0KICAg
305
+ ICAgICAgICAgPGRpdiBpZD0ibm9zY3JpcHQtd2FybmluZyI+U3RhY2sgT3Zl
306
+ cmZsb3cgcmVxdWlyZXMgSmF2YVNjcmlwdCB0byBiZSBlbmFibGVkPC9kaXY+
307
+ DQogICAgICAgIDwvbm9zY3JpcHQ+DQoNCiAgICAgICAgDQoNCiAgICA8c2Ny
308
+ aXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgICAgIHZhciBfZ2Fx
309
+ ID0gX2dhcSB8fCBbXTsNCiAgICAgICAgX2dhcS5wdXNoKFsnX3NldEFjY291
310
+ bnQnLCAnVUEtNTYyMDI3MC01J10pOw0KICAgICAgICBfZ2FxLnB1c2goWydf
311
+ c2V0Q3VzdG9tVmFyJywgMSwgJ0lzQXV0aGVudGljYXRlZCcsICdUcnVlJ10p
312
+ Ow0KICAgICAgICAgICAgICAgICAgICAgICAgX2dhcS5wdXNoKFsnX3RyYWNr
313
+ UGFnZXZpZXcnXSk7DQogICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAg
314
+ ICAgIHZhciBnYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcp
315
+ Ow0KICAgICAgICAgICAgZ2EudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOw0K
316
+ ICAgICAgICAgICAgZ2EuYXN5bmMgPSB0cnVlOw0KICAgICAgICAgICAgZ2Eu
317
+ c3JjID0gKCdodHRwczonID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29s
318
+ ID8gJ2h0dHBzOi8vc3NsJyA6ICdodHRwOi8vd3d3JykgKyAnLmdvb2dsZS1h
319
+ bmFseXRpY3MuY29tL2dhLmpzJzsNCiAgICAgICAgICAgIHZhciBzID0gZG9j
320
+ dW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdOw0KICAg
321
+ ICAgICAgICAgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnYSwgcyk7DQog
322
+ ICAgICAgIH0pKCk7DQogICAgPC9zY3JpcHQ+DQoNCg0KDQogICAgICAgIDxz
323
+ Y3JpcHQgc3JjPSIvL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2px
324
+ dWVyeS8xLjkuMS9qcXVlcnkubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3Jp
325
+ cHQiPjwvc2NyaXB0Pg0KPHNjcmlwdCBzcmM9Ii8vY2RuLWNhcmVlcnMuc3N0
326
+ YXRpYy5uZXQvY2FyZWVycy9Kcy90aGlyZC1wYXJ0eS9qcXVlcnkubWlncmF0
327
+ ZS8xLjIuMS9qcXVlcnktbWlncmF0ZS1wcm9kLm1pbi5qcz92PTIwNzQ1ZWZh
328
+ MDc4ZCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4gICAgICAg
329
+ IA0KDQo8c2NyaXB0IHNyYz0iLy9jZG4tY2FyZWVycy5zc3RhdGljLm5ldC9j
330
+ YXJlZXJzL0pzL3N0dWIubWluLmpzP3Y9YzQ1OWMzODIxODg4IiB0eXBlPSJ0
331
+ ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0Pg0KDQoNCg0KPHNjcmlwdCB0eXBl
332
+ PSJ0ZXh0L2phdmFzY3JpcHQiPg0KICAgIENhcmVlcnMuZG9tYWluID0gImNh
333
+ cmVlcnMuc3RhY2tvdmVyZmxvdy5jb20iOw0KICAgIENhcmVlcnMucmVmZXJy
334
+ ZXIgPSAiY2FyZWVycy5zdGFja292ZXJmbG93LmNvbSI7DQoNCg0KDQogICAg
335
+ ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTmFtZSArPSAiIGpzIjsN
336
+ Cg0KICAgIA0KICAgIENhcmVlcnMuaW5pdCh7InNpdGUiOnsibmFtZSI6IkNh
337
+ cmVlcnMgMi4wIn0sInVzZXIiOnsiaXNBbm9ueW1vdXMiOnRydWV9fSk7DQog
338
+ ICAgQ2FyZWVycy51c2luZy5zZXRGaWxlUHJvdmlkaW5nKHsiYmlndGV4dCI6
339
+ Ii8vY2RuLWNhcmVlcnMuc3N0YXRpYy5uZXQvY2FyZWVycy9Kcy90aGlyZC1w
340
+ YXJ0eS9iaWd0ZXh0Lm1pbi5qcz92PWYyYzQyYjgyNjViMiIsImNhbmRpZGF0
341
+ ZU1hbmFnZXIiOiIvL2Nkbi1jYXJlZXJzLnNzdGF0aWMubmV0L2NhcmVlcnMv
342
+ SnMvQ2FuZGlkYXRlTWFuYWdlci9DYW5kaWRhdGVNYW5hZ2VyLm1pbi5qcz92
343
+ PTZmNTg1YzQyMWU5MyIsImFjY291bnRzIjoiLy9jZG4tY2FyZWVycy5zc3Rh
344
+ dGljLm5ldC9jYXJlZXJzL0pzL2FjY291bnRzLm1pbi5qcz92PWYwMjA4Y2Yx
345
+ MDEzMyIsImNhcmVlcnNBdXRoIjoiLy9jZG4tY2FyZWVycy5zc3RhdGljLm5l
346
+ dC9jYXJlZXJzL0pzL2NhcmVlcnNhdXRoLm1pbi5qcz92PTZkZTllYWEzNzEx
347
+ YiIsImNoZWNrb3V0IjoiLy9jZG4tY2FyZWVycy5zc3RhdGljLm5ldC9jYXJl
348
+ ZXJzL0pzL2NoZWNrb3V0Lm1pbi5qcz92PWQ5MjRhMDAwNDc5NiIsImNoZWNr
349
+ b3V0Q2hvb3NlIjoiLy9jZG4tY2FyZWVycy5zc3RhdGljLm5ldC9jYXJlZXJz
350
+ L0pzL2NoZWNrb3V0LWNob29zZS5taW4uanM/dj02MmI1MWIwOGU0ZjkiLCJj
351
+ b21wYW55UGFnZXMiOiIvL2Nkbi1jYXJlZXJzLnNzdGF0aWMubmV0L2NhcmVl
352
+ cnMvSnMvY29tcGFueS1wYWdlcy5taW4uanM/dj1kZGEyNWYxNmY5Y2QiLCJj
353
+ b21wYW55UGFnZXNDcmVhdGUiOiIvL2Nkbi1jYXJlZXJzLnNzdGF0aWMubmV0
354
+ L2NhcmVlcnMvSnMvY29tcGFueS1wYWdlcy5hbmd1bGFyLWNyZWF0ZS5taW4u
355
+ anM/dj04NGYyZTJlNDE2NDIiLCJjb21wYW55UGFnZXNFZGl0IjoiLy9jZG4t
356
+ Y2FyZWVycy5zc3RhdGljLm5ldC9jYXJlZXJzL0pzL2NvbXBhbnktcGFnZXMu
357
+ YW5ndWxhci1lZGl0Lm1pbi5qcz92PTA3Y2ZhYjdjMjFhMSIsImN2IjoiLy9j
358
+ ZG4tY2FyZWVycy5zc3RhdGljLm5ldC9jYXJlZXJzL0pzL2N2Lm1pbi5qcz92
359
+ PTdkN2I3MDU0ZjlkZiIsImN2RWRpdCI6Ii8vY2RuLWNhcmVlcnMuc3N0YXRp
360
+ Yy5uZXQvY2FyZWVycy9Kcy9jdi1lZGl0Lm1pbi5qcz92PTI3YTMzMDY4NTY3
361
+ YSIsImN2SW52aXRhdGlvbiI6Ii8vY2RuLWNhcmVlcnMuc3N0YXRpYy5uZXQv
362
+ Y2FyZWVycy9Kcy9jdi1pbnZpdGF0aW9uLm1pbi5qcz92PWEwM2MwMDMxMWI1
363
+ MyIsImN2SW52aXRhdGlvbnNBZG1pbiI6Ii8vY2RuLWNhcmVlcnMuc3N0YXRp
364
+ Yy5uZXQvY2FyZWVycy9Kcy9jdi1pbnZpdGF0aW9ucy1hZG1pbi5taW4uanM/
365
+ dj1lMmE1N2E1MTdhNzUiLCJlbXBsb3llckxvZ2luIjoiLy9jZG4tY2FyZWVy
366
+ cy5zc3RhdGljLm5ldC9jYXJlZXJzL0pzL2VtcGxveWVyLWxvZ2luLm1pbi5q
367
+ cz92PWY1ZWU0ZGU4NzAzNCIsImltcG9ydCI6Ii8vY2RuLWNhcmVlcnMuc3N0
368
+ YXRpYy5uZXQvY2FyZWVycy9Kcy9pbXBvcnQubWluLmpzP3Y9NmY3OGIwMzc3
369
+ ZmQwIiwiam9icyI6Ii8vY2RuLWNhcmVlcnMuc3N0YXRpYy5uZXQvY2FyZWVy
370
+ cy9Kcy9qb2JzLm1pbi5qcz92PWMyMGJlMTg0MGZjOSIsImpvYnNBZG1pbiI6
371
+ Ii8vY2RuLWNhcmVlcnMuc3N0YXRpYy5uZXQvY2FyZWVycy9Kcy9qb2JzLmFk
372
+ bWluLm1pbi5qcz92PWU0NmQ1ODc1MmEwYyIsImpvYnNQb3N0IjoiLy9jZG4t
373
+ Y2FyZWVycy5zc3RhdGljLm5ldC9jYXJlZXJzL0pzL2pvYnMtcG9zdC5taW4u
374
+ anM/dj01M2JhNzQ2NmNiYjIiLCJtZXNzYWdpbmciOiIvL2Nkbi1jYXJlZXJz
375
+ LnNzdGF0aWMubmV0L2NhcmVlcnMvSnMvbWVzc2FnaW5nLm1pbi5qcz92PTI2
376
+ OTgyYWM4NDVhOSIsIm9wZW5pZEpxdWVyeSI6Ii8vY2RuLWNhcmVlcnMuc3N0
377
+ YXRpYy5uZXQvY2FyZWVycy9Kcy90aGlyZC1wYXJ0eS9vcGVuaWQtanF1ZXJ5
378
+ Lm1pbi5qcz92PTA2ZTllMzNhMTc3NyIsInBvc2l0aW9uSGVhZGVyIjoiLy9j
379
+ ZG4tY2FyZWVycy5zc3RhdGljLm5ldC9jYXJlZXJzL0pzL3Bvc2l0aW9uLWhl
380
+ YWRlci5taW4uanM/dj0wNWQ1YzRlOWU0OTkiLCJwcml2YWN5IjoiLy9jZG4t
381
+ Y2FyZWVycy5zc3RhdGljLm5ldC9jYXJlZXJzL0pzL3ByaXZhY3kubWluLmpz
382
+ P3Y9Y2Y1NjEyZDMwZmEwIiwic2VhcmNoTmV3IjoiLy9jZG4tY2FyZWVycy5z
383
+ c3RhdGljLm5ldC9jYXJlZXJzL0pzL3NlYXJjaC12My5taW4uanM/dj0zODBm
384
+ YzE3ZTEyZDgiLCJzaGFyZWQiOiIvL2Nkbi1jYXJlZXJzLnNzdGF0aWMubmV0
385
+ L2NhcmVlcnMvSnMvc2hhcmVkLm1pbi5qcz92PTliNzE2M2I4ZDc4NyIsInN0
386
+ YWNrYW5zd2VycyI6Ii8vY2RuLWNhcmVlcnMuc3N0YXRpYy5uZXQvY2FyZWVy
387
+ cy9Kcy9jdl9zdGFja2Fuc3dlcnMubWluLmpzP3Y9ZDNkNjZkNWI3MGZjIiwi
388
+ dGFnRWRpdG9yIjoiLy9jZG4tY2FyZWVycy5zc3RhdGljLm5ldC9jYXJlZXJz
389
+ L0pzL3RhZ2VkaXRvci5taW4uanM/dj0xMWVhM2U2YzhmNDAifSk7DQogICAg
390
+ Q2FyZWVycy51c2luZy5zZXRGaWxlUHJvdmlkaW5nKHtsb2NhbGl6YXRpb246
391
+ ICIvL2Nkbi1jYXJlZXJzLnNzdGF0aWMubmV0L2NhcmVlcnMvSnMvTG9jYWxp
392
+ emF0aW9uL2xvY2FsaXphdGlvbi5taW4uanM/dj0xODNjMjFkOGQ3MjMifSk7
393
+ DQoNCjwvc2NyaXB0Pg0KICAgICAgICANCiAgICA8c2NyaXB0IHNyYz0iLy9j
394
+ ZG4tY2FyZWVycy5zc3RhdGljLm5ldC9jYXJlZXJzL0pzL3RoaXJkLXBhcnR5
395
+ L2FuZ3VsYXIvMS4xLjMvYW5ndWxhci5taW4uanM/dj1mMGM2ZTM3YzQ2Yzgi
396
+ IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+DQogICAgDQogICAg
397
+ PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICAgICAgICBDYXJl
398
+ ZXJzLmluaXRpYWxpemUgPSB7fTsNCiAgICAgICAgICAgIENhcmVlcnMuaW5p
399
+ dGlhbGl6ZS5nYWxsZXJ5SXRlbXMgPSBbeyJUeXBlIjoieW91dHViZSIsIlVy
400
+ bCI6Imh0dHA6Ly93d3cueW91dHViZS5jb20vZW1iZWQvVWdLOVRtZ3ZMMWM/
401
+ cmVsPTAiLCJUaHVtYm5haWxVcmwiOiJodHRwOi8vaW1nLnlvdXR1YmUuY29t
402
+ L3ZpL1VnSzlUbWd2TDFjL2RlZmF1bHQuanBnIn1dOw0KICAgICAgICAgICAg
403
+ ICAgICAgICBDYXJlZXJzLmluaXRpYWxpemUucGVvcGxlID0gW107DQogICAg
404
+ ICAgIA0KICAgICAgICBDYXJlZXJzLnVzaW5nKFsiY29tcGFueVBhZ2VzIl0s
405
+ IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgQ2FyZWVycy5jb21wYW55UGFn
406
+ ZXMuaW5pdCgpOw0KICAgICAgICB9KTsNCiAgICA8L3NjcmlwdD4NCg0KDQog
407
+ ICAgICAgIA0KDQogICAgPC9ib2R5Pg0KPC9odG1sPg0K
408
+ http_version:
409
+ recorded_at: Sat, 19 Oct 2013 18:58:16 GMT
410
+ recorded_with: VCR 2.6.0
@@ -0,0 +1,28 @@
1
+ require 'open-uri'
2
+
3
+ module Bob
4
+ module Fetchers
5
+ module Github
6
+ extend self
7
+
8
+ def fetch(url)
9
+ response = URI("#{url}.json").read
10
+
11
+ create_job ::Oj.load(response)
12
+ end
13
+
14
+ def create_job(data)
15
+ opts = {
16
+ name: data["title"],
17
+ description: data["description"],
18
+ company_name: data["company"],
19
+ company_logo: data["company_logo"],
20
+ company_url: data["company_url"],
21
+ extra_info: data
22
+ }
23
+
24
+ ::Bob::Job.new(opts)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,40 @@
1
+ require 'nokogiri'
2
+
3
+ module Bob
4
+ module Fetchers
5
+ module Stackoverflow
6
+ extend self
7
+
8
+ def fetch(url)
9
+ doc = Nokogiri::HTML(open(url))
10
+ attrs = {}
11
+
12
+ doc.css('meta').each do |tag|
13
+ property = tag.attribute('property').to_s
14
+ property = tag.attribute('name').to_s if property.empty?
15
+
16
+ next unless property.match(/\A(\w+):(\w*)$/)
17
+
18
+ attrs[property] = tag.attribute('content').to_s
19
+ end
20
+
21
+ create_job(attrs)
22
+ end
23
+
24
+ def create_job(attrs)
25
+ opts = {}
26
+ opts[:name] = any_of(attrs, "og:title", "twitter:title")
27
+ opts[:description] = any_of(attrs, "og:description", "twitter:description")
28
+ opts[:company_logo] = any_of(attrs, "twitter:image")
29
+ opts[:extra_info] = attrs
30
+
31
+ ::Bob::Job.new(opts)
32
+ end
33
+
34
+ private
35
+ def any_of(hash, *keys)
36
+ hash.values_at(*keys).compact.map(&:strip).first
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,2 @@
1
+ require 'bob/fetchers/github'
2
+ require 'bob/fetchers/stackoverflow'
data/lib/bob/job.rb ADDED
@@ -0,0 +1,16 @@
1
+ module Bob
2
+ class Job
3
+ attr_accessor :name, :url, :description, :extra_info,
4
+ :company_name, :company_logo, :company_url
5
+
6
+ def initialize(opts = {})
7
+ @name = opts[:name]
8
+ @url = opts[:url]
9
+ @company_name = opts[:company_name]
10
+ @company_url = opts[:company_url]
11
+ @company_logo = opts[:company_logo]
12
+ @description = opts[:description]
13
+ @extra_info = opts[:extra_info]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module Bob
2
+ VERSION = "0.0.1"
3
+ end
data/lib/bob.rb ADDED
@@ -0,0 +1,35 @@
1
+ require 'net/http'
2
+ require 'oj'
3
+ require "bob/version"
4
+ require "bob/job"
5
+ require 'bob/fetchers'
6
+
7
+ module Bob
8
+ extend self
9
+
10
+ class UnprocessableHostError < StandardError; end
11
+
12
+
13
+ FETCHERS = {
14
+ 'jobs.github.com' => Bob::Fetchers::Github,
15
+ 'careers.stackoverflow.com' => Bob::Fetchers::Stackoverflow
16
+ }
17
+
18
+ def fetch(url)
19
+ url = URI.encode(url)
20
+ host = URI(url).host
21
+ fetcher = FETCHERS[host]
22
+
23
+ raise_error(url) if fetcher.nil?
24
+ begin
25
+ fetcher.fetch(url)
26
+ rescue StandardError
27
+ raise_error(url)
28
+ end
29
+ end
30
+
31
+ private
32
+ def raise_error(url)
33
+ raise UnprocessableHostError.new("Dont know how to handle #{url}.")
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bob::Fetchers::Github do
4
+ context "with a valid github url" do
5
+ let(:url) do
6
+ "https://jobs.github.com/positions/19341a08-377e-11e3-862f-7f91026928c0"
7
+ end
8
+
9
+ subject do
10
+ VCR.use_cassette('github_job') do
11
+ Bob::Fetchers::Github.fetch(url)
12
+ end
13
+ end
14
+
15
+ its(:name) {should == "Sr. Mobile Application Developer, Android at ModCloth"}
16
+ its(:description) {should =~ /<p>ModCloth currently has an exciting opportunity for a highly skilled Android developer./}
17
+ its(:company_name) {should == "ModCloth"}
18
+ its(:company_logo) {should == "http://github-jobs.s3.amazonaws.com/f5100178-377d-11e3-8618-7ebb0e979680.png"}
19
+ its(:company_url) {should == "http://www.modcloth.com"}
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bob::Fetchers::Stackoverflow do
4
+ context "with a valid github url" do
5
+ let(:url) do
6
+ "http://careers.stackoverflow.com/company/stadtwerke-m%C3%BCnchen"
7
+ end
8
+
9
+ subject do
10
+ VCR.use_cassette('stackoverflow_job') do
11
+ Bob::Fetchers::Stackoverflow.fetch(url)
12
+ end
13
+ end
14
+
15
+ its(:name) {should == "Stadtwerke München GmbH"}
16
+ its(:description) {should == "Die Stadtwerke M&amp;uuml;nchen (SWM) z&amp;auml;hlen zu den gr&amp;ouml;&amp;szlig;ten Energie- und Infrastrukturunternehmen Deutschlands. &amp;Uuml;ber eine Million Privathaushalte, Gewerbe- und Gesch&amp;auml;ftskundenâ\u0080¦"}
17
+
18
+ its(:company_logo) {should == "http://i.stack.imgur.com/ghuhbl.jpg"}
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bob::Job do
4
+ subject do
5
+ attrs = {
6
+ name: "name",
7
+ url: "url",
8
+ description: "a description",
9
+ company_name: "a company_name",
10
+ company_url: "http://co.mpa.ny",
11
+ company_logo: "http://co.mpa.ny/logo.png",
12
+ extra_info: {
13
+ hello: "World"
14
+ }}
15
+ Bob::Job.new(attrs)
16
+ end
17
+
18
+ its(:name) {should == "name"}
19
+ its(:url) {should == "url"}
20
+ its(:description) {should == "a description"}
21
+ its(:company_name) {should == "a company_name"}
22
+ its(:company_url) {should == "http://co.mpa.ny"}
23
+ its(:company_logo) {should == "http://co.mpa.ny/logo.png"}
24
+ its(:extra_info) {should == {hello: "World"}}
25
+ end
data/spec/bob_spec.rb ADDED
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bob do
4
+ describe '#fetch' do
5
+ describe 'Github' do
6
+ let(:url) do
7
+ 'https://jobs.github.com/positions/19341a08-377e-11e3-862f-7f91026928c0'
8
+ end
9
+
10
+ it 'uses github' do
11
+ Bob::Fetchers::Github.should_receive(:fetch).with(url)
12
+ Bob.fetch(url)
13
+ end
14
+ end
15
+
16
+ describe 'Stackoverflow' do
17
+ let(:url) do
18
+ "http://careers.stackoverflow.com/company/stadtwerke-münchen"
19
+ end
20
+
21
+ it 'uses stackoverflow' do
22
+ Bob::Fetchers::Stackoverflow.should_receive(:fetch).with(URI.encode(url))
23
+ Bob.fetch(url)
24
+ end
25
+ end
26
+
27
+ describe "404" do
28
+ let(:url) do
29
+ 'https://jobs.github.com/lalalala'
30
+ end
31
+
32
+ it "handles the 404 from URI" do
33
+ VCR.use_cassette("404") do
34
+ expect {
35
+ Bob.fetch(url)
36
+ }.to raise_error Bob::UnprocessableHostError
37
+ end
38
+ end
39
+ end
40
+
41
+ describe "Unprocessable host" do
42
+ let(:url) do
43
+ 'https://news.ycombinator.com/jobs'
44
+ end
45
+
46
+ it 'raises a UnprocessableHostError' do
47
+ expect {
48
+ Bob.fetch(url)
49
+ }.to raise_error Bob::UnprocessableHostError
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'bob' # and any other gems you need
5
+ require 'vcr'
6
+
7
+ VCR.configure do |c|
8
+ c.cassette_library_dir = 'fixtures/vcr_cassettes'
9
+ c.hook_into :webmock
10
+ end
11
+
12
+ RSpec.configure do |c|
13
+ c.filter_run_including focus: true
14
+ c.run_all_when_everything_filtered = true
15
+ end
metadata ADDED
@@ -0,0 +1,185 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: job-bob
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Giorgos Avramidis
8
+ - Dario Hamidi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: oj
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '>='
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '>='
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: nokogiri
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: '1.3'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '1.3'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: vcr
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: webmock
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: guard
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: guard-rspec
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: Bob, the Job Fetcher
127
+ email:
128
+ - avramidg@gmail.com
129
+ - dario.hamidi@gmail.com
130
+ executables: []
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - .gitignore
135
+ - .ruby-version
136
+ - Gemfile
137
+ - Guardfile
138
+ - LICENSE.txt
139
+ - README.md
140
+ - Rakefile
141
+ - bob.gemspec
142
+ - fixtures/vcr_cassettes/404.yml
143
+ - fixtures/vcr_cassettes/github_job.yml
144
+ - fixtures/vcr_cassettes/stackoverflow_job.yml
145
+ - lib/bob.rb
146
+ - lib/bob/fetchers.rb
147
+ - lib/bob/fetchers/github.rb
148
+ - lib/bob/fetchers/stackoverflow.rb
149
+ - lib/bob/job.rb
150
+ - lib/bob/version.rb
151
+ - spec/bob/fetchers/github_spec.rb
152
+ - spec/bob/fetchers/stackoverflow_spec.rb
153
+ - spec/bob/job_spec.rb
154
+ - spec/bob_spec.rb
155
+ - spec/spec_helper.rb
156
+ homepage: ''
157
+ licenses:
158
+ - MIT
159
+ metadata: {}
160
+ post_install_message:
161
+ rdoc_options: []
162
+ require_paths:
163
+ - lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - '>='
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ required_rubygems_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ requirements: []
175
+ rubyforge_project:
176
+ rubygems_version: 2.1.9
177
+ signing_key:
178
+ specification_version: 4
179
+ summary: Fetch Job Posting Information
180
+ test_files:
181
+ - spec/bob/fetchers/github_spec.rb
182
+ - spec/bob/fetchers/stackoverflow_spec.rb
183
+ - spec/bob/job_spec.rb
184
+ - spec/bob_spec.rb
185
+ - spec/spec_helper.rb