sendgrid-ruby 4.0.8 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a840acb40e2da148fe009b968673e85da03b126
4
- data.tar.gz: 835cfbda40d0ef43706814349b7db9bd580c622c
3
+ metadata.gz: 4935426058ea7d1c14f61020231f4260b12a8ef8
4
+ data.tar.gz: 5d52f19f64ace9e2cc1f66ed13e97087138ddbdf
5
5
  SHA512:
6
- metadata.gz: 338e8d6b6a2d2f9ae1f91cc96945f59b607a5c0c9ab859db4cf4a0c5e57227178f26c48714204b357ea099f18aa8e96f208a2ece258f763d4b5748893e037af2
7
- data.tar.gz: 3b24b4d95faddb1a5fd1376ce956738372931476bd712a6c697153fa322b00fba4495d76aeeec698e41ef6263b22a96d645c642e24c6636020a034a694633c14
6
+ metadata.gz: 9a2681e049f3ef54cc5d322c6854edfbae48ed8a3b797b1e9f71dbc0b40ddb961156dcda684b19287aae71ac52c0df0700c0a85f5a6f87dc74a56ef9a99af759
7
+ data.tar.gz: dd6e20dc8672654f467f152a357a56b2e8ac6545d0db35df7565076577514376fd422594c3c2adcbaf254a4fdf55a3c768148cd112eb36d0ff75af9c471d7bc9
data/.gitignore CHANGED
@@ -1,6 +1,7 @@
1
1
  # Created by https://www.gitignore.io
2
2
 
3
3
  ### Ruby ###
4
+ bin
4
5
  *.gem
5
6
  *.rbc
6
7
  /.config
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## [4.1.0] - 2016-2-17 ##
5
+ ### Add
6
+ - #144: Add [Inbound Email Parse Webhook](https://sendgrid.com/docs/API_Reference/Webhooks/inbound_email.html) support
7
+ - Thanks to [Wataru Sato](https://github.com/awwa) for the pull request!
8
+
4
9
  ## [4.0.8] - 2016-2-17 ##
5
10
  ### Add
6
11
  - Solves #147: Add User Agent string
data/CONTRIBUTING.md CHANGED
@@ -16,13 +16,13 @@ We use [Milestones](https://github.com/sendgrid/sendgrid-ruby/milestones) to hel
16
16
  <a name="cla"></a>
17
17
  ## CLAs and CCLAs
18
18
 
19
- Before you get started, SendGrid requires that a SendGrid Contributor License Agreement (CLA) or a SendGrid Company Contributor Licensing Agreement (CCLA) be filled out by every contributor to a SendGrid open source project.
19
+ Before you get started, SendGrid requires that a SendGrid Contributor License Agreement (CLA) be filled out by every contributor to a SendGrid open source project.
20
20
 
21
- Our goal with the CLA and CCLA is to clarify the rights of our contributors and reduce other risks arising from inappropriate contributions. The CLA also clarifies the rights SendGrid holds in each contribution and helps to avoid misunderstandings over what rights each contributor is required to grant to SendGrid when making a contribution. In this way the CLA and CCLA encourage broad participation by our open source community and help us build strong open source projects, free from any individual contributor withholding or revoking rights to any contribution.
21
+ Our goal with the CLA is to clarify the rights of our contributors and reduce other risks arising from inappropriate contributions. The CLA also clarifies the rights SendGrid holds in each contribution and helps to avoid misunderstandings over what rights each contributor is required to grant to SendGrid when making a contribution. In this way the CLA encourages broad participation by our open source community and helps us build strong open source projects, free from any individual contributor withholding or revoking rights to any contribution.
22
22
 
23
- SendGrid does not merge a pull request made against a SendGrid open source project until that pull request is associated with a signed CLA (or CCLA). Copies of the CLA and CCLA are available [here](https://drive.google.com/a/sendgrid.com/file/d/0B0PlcM9qA91LN2VEUTJWU2RIVXc/view).
23
+ SendGrid does not merge a pull request made against a SendGrid open source project until that pull request is associated with a signed CLA. Copies of the CLA are available [here](https://gist.github.com/SendGridDX/98b42c0a5d500058357b80278fde3be8#file-sendgrid_cla).
24
24
 
25
- You may submit your completed [CLA or CCLA](https://drive.google.com/a/sendgrid.com/file/d/0B0PlcM9qA91LN2VEUTJWU2RIVXc/view) to SendGrid at [dx@sendgrid.com](mailto:dx@sendgrid.com). SendGrid will then confirm you are ready to begin making contributions.
25
+ When you create a Pull Request, after a few seconds, a comment will appear with a link to the CLA. Click the link and fill out the brief form and then click the "I agree" button and you are all set. You will not be asked to re-sign the CLA unless we make a change.
26
26
 
27
27
  There are a few ways to contribute, which we'll enumerate below:
28
28
 
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- gemspec
3
+ gemspec
data/README.md CHANGED
@@ -16,6 +16,7 @@ We appreciate your continued support, thank you!
16
16
 
17
17
  * [Installation](#installation)
18
18
  * [Quick Start](#quick_start)
19
+ * [Processing Inbound Email](#inbound)
19
20
  * [Usage](#usage)
20
21
  * [Use Cases](#use_cases)
21
22
  * [Announcements](#announcements)
@@ -151,6 +152,11 @@ puts response.body
151
152
  puts response.headers
152
153
  ```
153
154
 
155
+ <a name="inbound"></a>
156
+ # Processing Inbound Email
157
+
158
+ Please see [our helper](https://github.com/sendgrid/sendgrid-ruby/tree/master/lib/sendgrid/helpers/inbound) for utilizing our Inbound Parse webhook.
159
+
154
160
  <a name="usage"></a>
155
161
  # Usage
156
162
 
@@ -160,7 +166,7 @@ puts response.headers
160
166
  - [How-to: Migration from v2 to v3](https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/how_to_migrate_from_v2_to_v3_mail_send.html)
161
167
  - [v3 Web API Mail Send Helper](https://github.com/sendgrid/sendgrid-python/tree/master/sendgrid/helpers/mail) - build a request object payload for a v3 /mail/send API call.
162
168
 
163
- <a name="use_cases">
169
+ <a name="use_cases"></a>
164
170
  # Use Cases
165
171
 
166
172
  [Examples of common API use cases](https://github.com/sendgrid/sendgrid-ruby/blob/master/USE_CASES.md), such as how to send an email with a transactional template.
@@ -199,5 +205,4 @@ sendgrid-ruby is guided and supported by the SendGrid [Developer Experience Team
199
205
 
200
206
  sendgrid-ruby is maintained and funded by SendGrid, Inc. The names and logos for sendgrid-ruby are trademarks of SendGrid, Inc.
201
207
 
202
- ![SendGrid Logo]
203
- (https://uiux.s3.amazonaws.com/2016-logos/email-logo%402x.png)
208
+ ![SendGrid Logo](https://uiux.s3.amazonaws.com/2016-logos/email-logo%402x.png)
data/config.ru ADDED
@@ -0,0 +1,4 @@
1
+ require './lib/sendgrid/helpers/inbound/app'
2
+
3
+ use Rack::Reloader, 0
4
+ run Main
@@ -0,0 +1,81 @@
1
+ **This helper is a stand alone module to help get you started consuming and processing Inbound Parse data.**
2
+
3
+ ## Table of Contents
4
+
5
+ * [Quick Start for Local Testing with Sample Data](#quick_start_local_sample)
6
+ * [Quick Start for Local Testing with Real Data](#quick_start_local_real)
7
+ * [Code Walkthrough](#code_walkthrough)
8
+ * [Contributing](#contributing)
9
+
10
+ <a name="quick_start_local_sample"></a>
11
+ # Quick Start for Local Testing with Sample Data
12
+
13
+ ```bash
14
+ git clone https://github.com/sendgrid/sendgrid-ruby.git
15
+ cd sendgrid-ruby
16
+ bundle install
17
+ ```
18
+
19
+ Run the Inbound Parse listener in your terminal:
20
+
21
+ ```ruby
22
+ rackup
23
+ ```
24
+
25
+ In another terminal, run the test data sender:
26
+
27
+ ```bash
28
+ cd [path to sendgrid-ruby]
29
+ bundle install
30
+ ruby ./lib/sendgrid/helpers/inbound/send.rb ./lib/sendgrid/helpers/inbound/sample_data/default_data.txt
31
+ ```
32
+
33
+ More sample data can be found [here](https://github.com/sendgrid/sendgrid-ruby/tree/master/sendgrid/helpers/inbound/sample_data).
34
+
35
+ View the results in the first terminal.
36
+
37
+ <a name="quick_start_local_real"></a>
38
+ # Quick Start for Local Testing with Real Data
39
+
40
+ [Setup your MX records.](https://sendgrid.com/docs/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.html#-Setup) Depending on your domain name host, you may need to wait up to 48 hours for the settings to propagate.
41
+
42
+ Run the Inbound Parse listener in your terminal:
43
+
44
+ ```bash
45
+ git clone https://github.com/sendgrid/sendgrid-ruby.git
46
+ cd sendgrid-ruby
47
+ bundle install
48
+ rackup
49
+ ```
50
+
51
+ In another terminal, use [ngrok](https://ngrok.com/) to allow external access to your machine:
52
+ ```bash
53
+ ngrok http 9292
54
+ ```
55
+
56
+ Update your SendGrid Incoming Parse settings: [Settings Page](https://app.sendgrid.com/settings/parse) | [Docs](https://sendgrid.com/docs/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.html#-Pointing-to-a-Hostname-and-URL)
57
+
58
+ - For the HOSTNAME field, use the domain that you changed the MX records (e.g. inbound.yourdomain.com)
59
+ - For the URL field, use the URL generated by ngrok + /inbound, e.g http://XXXXXXX.ngrok.io/inbound
60
+
61
+ Next, send an email to [anything]@inbound.yourdomain.com, then look at the terminal where you started the Inbound Parse listener.
62
+
63
+ <a name="code_walkthrough"></a>
64
+ # Code Walkthrough
65
+
66
+ ## app.rb
67
+
68
+ This module runs a [Sinatra](http://www.sinatrarb.com/) server, that by default (you can change those settings [here](https://github.com/sendgrid/sendgrid-ruby/blob/master/sendgrid/helpers/inbound/config.yml)), listens for POSTs on http://localhost:9292. When the server receives the POST, it parses and prints the key/value data.
69
+
70
+ ## config.yml
71
+
72
+ This module loads application environment variables (located in [config.yml](https://github.com/sendgrid/sendgrid-ruby/blob/master/sendgrid/helpers/inbound/config.yml)).
73
+
74
+ ## send.rb & /sample_data
75
+
76
+ This module is used to send sample test data. It is useful for testing and development, particularly while you wait for your MX records to propagate.
77
+
78
+ <a name="contributing"></a>
79
+ # Contributing
80
+
81
+ If you would like to contribute to this project, please see our [contributing guide](https://github.com/sendgrid/sendgrid-ruby/blob/master/CONTRIBUTING.md). Thanks!
@@ -0,0 +1,20 @@
1
+ require 'sinatra'
2
+ require 'logger'
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ class Main < Sinatra::Base
7
+ configure :production, :development do
8
+ enable :logging
9
+ set :config, YAML.load_file(File.dirname(__FILE__) + '/config.yml')
10
+ end
11
+
12
+ get '/' do
13
+ redirect to('index.html')
14
+ end
15
+
16
+ post settings.config['endpoint'] do
17
+ filtered = params.select {|k, v| settings.config['keys'].include?(k)}
18
+ logger.info JSON.pretty_generate(filtered)
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ # Incoming Parse endpoint for receiver
2
+ endpoint: '/inbound'
3
+
4
+ # List all Incoming Parse fields you would like parsed
5
+ # Reference: https://sendgrid.com/docs/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.html
6
+ keys:
7
+ - from
8
+ - attachments
9
+ - headers
10
+ - text
11
+ - envelope
12
+ - to
13
+ - html
14
+ - sender_ip
15
+ - attachment-info
16
+ - subject
17
+ - dkim
18
+ - SPF
19
+ - charsets
20
+ - content-ids
21
+ - spam_report
22
+ - spam_score
23
+ - email
24
+
25
+ # URL that the sender will POST to
26
+ host: 'http://127.0.0.1:9292/inbound'
@@ -0,0 +1,10 @@
1
+ <html>
2
+ <head>
3
+ <title>SendGrid Incoming Parse</title>
4
+ </head>
5
+ <body>
6
+ <h1>You have successfuly launched the server!</h1>
7
+
8
+ Check out <a href="https://github.com/sendgrid/sendgrid-ruby/tree/master/sendgrid/helpers/inbound">the documentation</a> on how to use this software to utilize the SendGrid Inbound Parse webhook.
9
+ </body>
10
+ </html>
@@ -0,0 +1,58 @@
1
+ --xYzZY
2
+ Content-Disposition: form-data; name="headers"
3
+
4
+ MIME-Version: 1.0
5
+ Received: by 0.0.0.0 with HTTP; Wed, 10 Aug 2016 18:10:13 -0700 (PDT)
6
+ From: Example User <test@example.com>
7
+ Date: Wed, 10 Aug 2016 18:10:13 -0700
8
+ Subject: Inbound Parse Test Data
9
+ To: inbound@inbound.example.com
10
+ Content-Type: multipart/alternative; boundary=001a113df448cad2d00539c16e89
11
+
12
+ --xYzZY
13
+ Content-Disposition: form-data; name="dkim"
14
+
15
+ {@sendgrid.com : pass}
16
+ --xYzZY
17
+ Content-Disposition: form-data; name="to"
18
+
19
+ inbound@inbound.example.com
20
+ --xYzZY
21
+ Content-Disposition: form-data; name="html"
22
+
23
+ <html><body><strong>Hello SendGrid!</body></html>
24
+
25
+ --xYzZY
26
+ Content-Disposition: form-data; name="from"
27
+
28
+ Example User <test@example.com>
29
+ --xYzZY
30
+ Content-Disposition: form-data; name="text"
31
+
32
+ Hello SendGrid!
33
+
34
+ --xYzZY
35
+ Content-Disposition: form-data; name="sender_ip"
36
+
37
+ 0.0.0.0
38
+ --xYzZY
39
+ Content-Disposition: form-data; name="envelope"
40
+
41
+ {"to":["inbound@inbound.example.com"],"from":"test@example.com"}
42
+ --xYzZY
43
+ Content-Disposition: form-data; name="attachments"
44
+
45
+ 0
46
+ --xYzZY
47
+ Content-Disposition: form-data; name="subject"
48
+
49
+ Testing non-raw
50
+ --xYzZY
51
+ Content-Disposition: form-data; name="charsets"
52
+
53
+ {"to":"UTF-8","html":"UTF-8","subject":"UTF-8","from":"UTF-8","text":"UTF-8"}
54
+ --xYzZY
55
+ Content-Disposition: form-data; name="SPF"
56
+
57
+ pass
58
+ --xYzZY--
@@ -0,0 +1,57 @@
1
+ --xYzZY
2
+ Content-Disposition: form-data; name="dkim"
3
+
4
+ {@sendgrid.com : pass}
5
+ --xYzZY
6
+ Content-Disposition: form-data; name="email"
7
+
8
+ MIME-Version: 1.0
9
+ Received: by 0.0.0.0 with HTTP; Wed, 10 Aug 2016 14:44:21 -0700 (PDT)
10
+ From: Example User <test@example.com>
11
+ Date: Wed, 10 Aug 2016 14:44:21 -0700
12
+ Subject: Inbound Parse Test Raw Data
13
+ To: inbound@inbound.inbound.com
14
+ Content-Type: multipart/alternative; boundary=001a113ee97c89842f0539be8e7a
15
+
16
+ --001a113ee97c89842f0539be8e7a
17
+ Content-Type: text/plain; charset=UTF-8
18
+
19
+ Hello SendGrid!
20
+
21
+ --001a113ee97c89842f0539be8e7a
22
+ Content-Type: text/html; charset=UTF-8
23
+ Content-Transfer-Encoding: quoted-printable
24
+
25
+ <html><body><strong>Hello SendGrid!</body></html>
26
+
27
+ --001a113ee97c89842f0539be8e7a--
28
+
29
+ --xYzZY
30
+ Content-Disposition: form-data; name="to"
31
+
32
+ inbound@inbound.inbound.com
33
+ --xYzZY
34
+ Content-Disposition: form-data; name="from"
35
+
36
+ Example User <test@example.com>
37
+ --xYzZY
38
+ Content-Disposition: form-data; name="sender_ip"
39
+
40
+ 0.0.0.0
41
+ --xYzZY
42
+ Content-Disposition: form-data; name="envelope"
43
+
44
+ {"to":["inbound@inbound.inbound.com"],"from":"test@example.com"}
45
+ --xYzZY
46
+ Content-Disposition: form-data; name="subject"
47
+
48
+ Testing with Request.bin
49
+ --xYzZY
50
+ Content-Disposition: form-data; name="charsets"
51
+
52
+ {"to":"UTF-8","subject":"UTF-8","from":"UTF-8"}
53
+ --xYzZY
54
+ Content-Disposition: form-data; name="SPF"
55
+
56
+ pass
57
+ --xYzZY--
@@ -0,0 +1,298 @@
1
+ --xYzZY
2
+ Content-Disposition: form-data; name="dkim"
3
+
4
+ {@sendgrid.com : pass}
5
+ --xYzZY
6
+ Content-Disposition: form-data; name="email"
7
+
8
+ MIME-Version: 1.0
9
+ Received: by 0.0.0.0 with HTTP; Mon, 15 Aug 2016 13:47:21 -0700 (PDT)
10
+ From: Example User <test@example.com>
11
+ Date: Mon, 15 Aug 2016 13:47:21 -0700
12
+ Subject: Inbound Parse Test Raw Data with Attachment
13
+ To: inbound@inbound.inbound.com
14
+ Content-Type: multipart/mixed; boundary=001a1140ffb6f4fc63053a2257e2
15
+
16
+ --001a1140ffb6f4fc63053a2257e2
17
+ Content-Type: multipart/alternative; boundary=001a1140ffb6f4fc5f053a2257e0
18
+
19
+ --001a1140ffb6f4fc5f053a2257e0
20
+ Content-Type: text/plain; charset=UTF-8
21
+
22
+ Hello SendGrid!
23
+
24
+ --001a1140ffb6f4fc5f053a2257e0
25
+ Content-Type: text/html; charset=UTF-8
26
+ Content-Transfer-Encoding: quoted-printable
27
+
28
+ <html><body><strong>Hello SendGrid!</body></html>
29
+
30
+ --001a1140ffb6f4fc5f053a2257e0--
31
+
32
+ --001a1140ffb6f4fc63053a2257e2
33
+ Content-Type: image/jpeg; name="SendGrid.jpg"
34
+ Content-Disposition: attachment; filename="SendGrid.jpg"
35
+ Content-Transfer-Encoding: base64
36
+ X-Attachment-Id: f_irwihell0
37
+
38
+ /9j/4AAQSkZJRgABAQABLAEsAAD/4QDKRXhpZgAATU0AKgAAAAgABwESAAMA
39
+ AAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAEx
40
+ AAIAAAARAAAAcgEyAAIAAAAUAAAAhIdpAAQAAAABAAAAmAAAAAAAAAEsAAAA
41
+ AQAAASwAAAABUGl4ZWxtYXRvciAzLjQuNAAAMjAxNjowODoxMSAxNjowODo1
42
+ NwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAACEqADAAQAAAABAAACFQAAAAD/
43
+ 4Qn2aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVn
44
+ aW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4
45
+ bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAg
46
+ Q29yZSA1LjQuMCI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53
47
+ My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3Jp
48
+ cHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2Jl
49
+ LmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9l
50
+ bGVtZW50cy8xLjEvIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxNi0wOC0xMVQxNjow
51
+ ODo1NyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBJbWFnZVJlYWR5Ij4gPGRj
52
+ OnN1YmplY3Q+IDxyZGY6QmFnLz4gPC9kYzpzdWJqZWN0PiA8L3JkZjpEZXNj
53
+ cmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAg
54
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
55
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
56
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
57
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
58
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
59
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
60
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
61
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
62
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
63
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
64
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
65
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
66
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
67
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
68
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
69
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
70
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
71
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
72
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
73
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
74
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
75
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
76
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
77
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
78
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
79
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
80
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
81
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
82
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
83
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
84
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
85
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
86
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
87
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
88
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
89
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
90
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
91
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
92
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
93
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
94
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
95
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
96
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
97
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
98
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
99
+ ICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3Ij8+AP/tADhQaG90b3Nob3Ag
100
+ My4wADhCSU0EBAAAAAAAADhCSU0EJQAAAAAAENQdjNmPALIE6YAJmOz4Qn7/
101
+ wAARCAIVAhIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQF
102
+ BgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJx
103
+ FDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdI
104
+ SUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKj
105
+ pKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx
106
+ 8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QA
107
+ tREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHB
108
+ CSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldY
109
+ WVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmq
110
+ srO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6
111
+ /9sAQwAcHBwcHBwwHBwwRDAwMERcRERERFx0XFxcXFx0jHR0dHR0dIyMjIyM
112
+ jIyMqKioqKioxMTExMTc3Nzc3Nzc3Nzc/9sAQwEiJCQ4NDhgNDRg5pyAnObm
113
+ 5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm
114
+ 5ubm/90ABAAi/9oADAMBAAIRAxEAPwDpKKKKACiiigAooooAKKKKACiiigAo
115
+ oooAKKKKACiiigAooooAKKKKACiiigDEnkkEzgMep71F5sn94/nTp/8AXP8A
116
+ U1FXWloeZJu7H+bJ/eP50ebJ/eP50yinYm7H+bJ/eP50ebJ/eP50yiiwXY/z
117
+ ZP7x/OjzZP7x/OmUUWC7H+bJ/eP50ebJ/eP50yiiwXY/zZP7x/OjzZP7x/Om
118
+ UUWC7H+bJ/eP50ebJ/eP50yiiwXY/wA2T+8fzo82T+8fzplFFgux/myf3j+d
119
+ Hmyf3j+dMoosF2P82T+8fzo82T+8fzplFFgux/myf3j+dHmyf3j+dMoosF2I
120
+ 0sufvt+dJ5sv99vzNMbrSVVkbpuxJ5sv99vzNHmy/wB9vzNR0U7Id2SebL/f
121
+ b8zR5sv99vzNR0UWQXZJ5sv99vzNHmy/32/M1HRRZBdknmy/32/M0ebL/fb8
122
+ zUdFFkF2SebL/fb8zR5sv99vzNR0UWQXZJ5sv99vzNHmy/32/M1HRRZBdknm
123
+ y/32/M0ebL/fb8zUdFFkF2SebL/fb8zR5sv99vzNR0UWQXZJ5sv99vzNHmy/
124
+ 32/M1HRRZBdknmy/32/M0ebL/fb8zUdFFkF2SebL/fb8zR5sv99vzNR0UWQX
125
+ Z//Q6SiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
126
+ oooAwZ/9c/1NRVLP/rn+pqKuxbHly3YUUUUyQooooAKKKKACiiigAooooAKK
127
+ KKACiiigAooooAKKKKACiiigCJutJSt1pKo3WwUUUUDCiiigAooooAKKKKAC
128
+ iiigAooooAKKKKACiiigAooooAKKKKACiiigD//R6SiiigAooooAKKKKACii
129
+ igAooooAKKKKACiiigAooooAKKKKACiiigAooooAwZ/9c/1NRVLP/rn+pqKu
130
+ xbHly3YUUUUyQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
131
+ CJutJSt1pKo3WwUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
132
+ oAKKKKACiiigD//S6SiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
133
+ KKKKACiiigAooooAwZ/9c/1NRVLP/rn+pqKuxbHly3YUUUUyQooooAKKKKAC
134
+ iiigAooooAKKKKACiiigAooooAKKKKACiiigCJutJSt1pKo3WwUUUUDCiiig
135
+ AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD//T6SiiigAo
136
+ oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAwZ/9c/1N
137
+ RVLP/rn+pqKuxbHly3YUUUUyQooooAKKKKACiiigAooooAKKKKACiiigAooo
138
+ oAKKKKACiiigCJutJSt1pKo3WwUUUUDCiiigAooooAKKKKACiiigAooooAKK
139
+ KKACiiigAooooAKKKKACiiigD//U6SiiigAooooAKKKKACiiigAooooAKKKK
140
+ ACiiigAooooAKKKKACiiigAooooAwZ/9c/1NRVLP/rn+pqKuxbHly3YUUUUy
141
+ QooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCJutJSt1pKo3
142
+ WwUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
143
+ D//V6SiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
144
+ oooAwZ/9c/1NRVLP/rn+pqKuxbHly3YUUUUyQooooAKKKKACiiigAooooAKK
145
+ KKACiiigAooooAKKKKACiiigCJutJSt1pKo3WwUUUUDCiiigAooooAKKKKAC
146
+ iiigAooooAKKKKACiiigAooooAKKKKACiiigD//W6SiiigAooooAKKKKACii
147
+ igAooooAKKKKACiiigAooooAKKKKACiiigAooooAwZ/9c/1NRVLP/rn+pqKu
148
+ xbHly3YUUUUyQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
149
+ CJutJSt1pKo3WwUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
150
+ oAKKKKACiiigD//X6SiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
151
+ KKKKACiiigAooooAwZ/9c/1NRVLP/rn+pqKuxbHly3YUUUUyQooooAKKKKAC
152
+ iiigAooooAKKKKACiiigAooooAKKKKACiiigCJutJSt1pKo3WwUUUUDCiiig
153
+ AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD//Q6SiiigAo
154
+ oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAwZ/9c/1N
155
+ RVLP/rn+pqKuxbHly3YUUUUyQooooAKKKKACiiigAooooAKKKKACiiigAooo
156
+ oAKKKKACiiigCJutJSt1pKo3WwUUUUDCiiigAooooAKKKKACiiigAooooAKK
157
+ KKACiiigAooooAKKKKACiiigD//R6SiiigAooooAKKKKACiiigAooooAKKKK
158
+ ACiiigAooooAKKKKACiiigAooooAwZ/9c/1NRVLP/rn+pqKuxbHly3YUUUUy
159
+ QooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCJutJSt1pKo3
160
+ WwUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
161
+ D//S2i7560m9/WmnqaStbHPdj97+tG9/WmUUWC7H739aN7+tMoosF2P3v60b
162
+ 39aZRRYLsfvf1o3v60yiiwXY/e/rRvf1plFFgux+9/Wje/rTKKLBdj97+tG9
163
+ /WmUUWC7H739aN7+tMoosF2P3v60b39aZRRYLsfvf1o3v60yiiwXZlzEmVvr
164
+ UeTT5f8AWt9ajrdbHI9xcmjJpKKYhcmjJpKKAFyaMmkooAXJoyaSigBcmjJp
165
+ KKAFyaMmkooAXJoyaSigBcmjJpKKAFyaMmkooAXJoyaSigBwAPWlwKB0paBX
166
+ YmBRgUtFAXYmBRgUtFAXYmBRgUtFAXYmBRgUtFAXYmBRgUtFAXYmBRgUtFAX
167
+ YmBRgUtFAXYmBRgUtFAXYmBRgUtFAXYmBRgUtFAXYmBRgUtFAXZ//9PXPU0l
168
+ KeppK1OYKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
169
+ AMqX/Wt9ajqSX/Wt9ajroRyvcKKKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFF
170
+ FABRRRQAUUUUAFFFFADx0paQdKWgkKKKKACiiigAooooAKKKKACiiigAoooo
171
+ AKKKKACiiigAooooAKKKKACiiigD/9TXPU0lKeppK1OYKKKKACiiigAooooA
172
+ KKKKACiiigAooooAKKKKACiiigAooooAKKKKAMqX/Wt9ajqSX/Wt9ajroRyv
173
+ cKKKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFADx0paQ
174
+ dKWgkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
175
+ iigD/9XXPU0lKeppK1OYKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
176
+ igAooooAKKKKAMqX/Wt9ajqSX/Wt9ajroRyvcKKKKBBRRRQAUUUUAFFFFABR
177
+ RRQAUUUUAFFFFABRRRQAUUUUAFFFFADx0paQdKWgkKKKKACiiigAooooAKKK
178
+ KACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9bXPU0lKeppK1OYKKKK
179
+ ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMqX/Wt9ajqS
180
+ X/Wt9ajroRyvcKKKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
181
+ AFFFFADx0paQdKWgkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
182
+ ooooAKKKKACiiigD/9fXPU0lKeppK1OYKKKKACiiigAooooAKKKKACiiigAo
183
+ oooAKKKKACiiigAooooAKKKKAMqX/Wt9ajqSX/Wt9ajroRyvcKKKKBBRRRQA
184
+ UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFADx0paQdKWgkKKKKACi
185
+ iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9DXPU0l
186
+ KeppK1OYKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
187
+ AMqX/Wt9ajqSX/Wt9ajroRyvcKKKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFF
188
+ FABRRRQAUUUUAFFFFADx0paQdKWgkKKKKACiiigAooooAKKKKACiiigAoooo
189
+ AKKKKACiiigAooooAKKKKACiiigD/9HXPU0lKeppK1OYKKKKACiiigAooooA
190
+ KKKKACiiigAooooAKKKKACiiigAooooAKKKKAMqX/Wt9ajqSX/Wt9ajroRyv
191
+ cKKKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFADx0paQ
192
+ dKWgkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
193
+ iigD/9LXPU0lKeppK1OYKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
194
+ igAooooAKKKKAMqX/Wt9ajqSX/Wt9ajroRyvcKKKKBBRRRQAUUUUAFFFFABR
195
+ RRQAUUUUAFFFFABRRRQAUUUUAFFFFADx0paQdKWgkKKKKACiiigAooooAKKK
196
+ KACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9PXPU0lKeppK1OYKKKK
197
+ ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMqX/Wt9ajqS
198
+ X/Wt9ajroRyvcKKKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
199
+ AFFFFADx0paQdKWgkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
200
+ ooooAKKKKACiiigD/9TXPU0lKeppK1OYKKKKACiiigAooooAKKKKACiiigAo
201
+ oooAKKKKACiiigAooooAKKKKAMqX/Wt9ajqSX/Wt9ajroRyvcKKKKBBRRRQA
202
+ UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFADx0paQdKWgkKKKKACi
203
+ iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9WV7mUO
204
+ Rnv6U37TN6/pUMn32+pptdyiuxxNssfaZvX9KPtM3r+lV6KOVdguyx9pm9f0
205
+ o+0zev6VXoo5V2C7LH2mb1/Sj7TN6/pVeijlXYLssfaZvX9KPtM3r+lV6KOV
206
+ dguyx9pm9f0o+0zev6VXoo5V2C7LH2mb1/Sj7TN6/pVeijlXYLssfaZvX9KP
207
+ tM3r+lV6KOVdguyx9pm9f0o+0zev6VXoo5V2C7LH2mb1/Sj7TN6/pVeijlXY
208
+ LssfaZvX9KPtM3r+lV6KOVdguzRSFJFEjdTyad9mi96fD/ql+lS1g27lcqK/
209
+ 2aL3o+zRe9WKKXMw5V2K/wBmi96Ps0XvViijmYcq7Ff7NF70fZoverFFHMw5
210
+ V2K/2aL3o+zRe9WKKOZhyrsV/s0XvR9mi96sUUczDlXYr/Zovej7NF71Yoo5
211
+ mHKuxX+zRe9H2aL3qxRRzMOVdiv9mi96Ps0XvViijmYcq7Ff7NF70fZoverF
212
+ FHMw5V2K/wBmi96Ps0XvViijmYcq7BHZwlcnP50/7FB6H86ni+4KkqHJ9zdU
213
+ 422Kn2KD0P50fYoPQ/nVuilzvuP2cexU+xQeh/Oj7FB6H86t0Uc77h7OPYqf
214
+ YoPQ/nR9ig9D+dW6KOd9w9nHsVPsUHofzo+xQeh/OrdFHO+4ezj2Kn2KD0P5
215
+ 0fYoPQ/nVuijnfcPZx7FT7FB6H86PsUHofzq3RRzvuHs49ip9ig9D+dH2KD0
216
+ P51boo533D2cexU+xQeh/Oj7FB6H86t0Uc77h7OPYqfYoPQ/nR9ig9D+dW6K
217
+ Od9w9nHsVPsUHofzo+xQeh/OrdFHO+4ezj2Kn2KD0P50fYoPQ/nVuijnfcPZ
218
+ x7H/1mSffb6mm06T77fU02u9HCwooooAKKKKACiiigAooooAKKKKACiiigAo
219
+ oooAKKKKACiiigAooooA1of9Uv0qWoof9Uv0qWuZ7mqCiiikAUUUUAFFFFAB
220
+ RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBai+4KkqOL7gqSs3udEdgooo
221
+ pDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9dk
222
+ n32+pptOk++31NNrvRwsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
223
+ igAooooAKKKKANaH/VL9KlqKH/VL9Klrme5qgooopAFFFFABRRRQAUUUUAFF
224
+ FFABRRRQAUUUUAFFFFABRRRQAUUUUAWovuCpKji+4KkrN7nRHYKKKKQwoooo
225
+ AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//QZJ99vqab
226
+ TpPvt9TTa70cLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
227
+ ACiiigDWh/1S/Spaih/1S/Spa5nuaoKKKKQBRRRQAUUUUAFFFFABRRRQAUUU
228
+ UAFFFFABRRRQAUUUUAFFFFAFqL7gqSo4vuCpKze50R2CiiikMKKKKACiiigA
229
+ ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/0WSffb6mm06T77fU
230
+ 02u9HCwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
231
+ 1of9Uv0qWoof9Uv0qWuZ7mqCiiikAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
232
+ AUUUUAFFFFABRRRQBai+4KkqOL7gqSs3udEdgooopDCiiigAooooAKKKKACi
233
+ iigAooooAKKKKACiiigAooooAKKKKACiiigD/9Jkn32+pptOk++31NNrvRws
234
+ KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKANaH/VL9
235
+ KlqKH/VL9Klrme5qgooopAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
236
+ RRRQAUUUUAWovuCpKji+4KkrN7nRHYKKKKQwooooAKKKKACiiigAooooAKKK
237
+ KACiiigAooooAKKKKACiiigAooooA//TZJ99vqabTpPvt9TTa70cLCiiigAo
238
+ oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDWh/1S/Spaih/1
239
+ S/Spa5nuaoKKKKQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
240
+ FFAFqL7gqSo4vuCpKze50R2CiiikMKKKKACiiigAooooAKKKKACiiigAoooo
241
+ AKKKKACiiigAooooAKKKKAP/1GSffb6mm06T77fU02u9HCwooooAKKKKACii
242
+ igAooooAKKKKACiiigAooooAKKKKACiiigAooooA1of9Uv0qWoof9Uv0qWuZ
243
+ 7mqCiiikAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBai+
244
+ 4KkqOL7gqSs3udEdgooopDCiiigAooooAKKKKACiiigAooooAKKKKACiiigA
245
+ ooooAKKKKACiiigD/9Vkn32+pptOk++31NNrvRwsKKKKACiiigAooooAKKKK
246
+ ACiiigAooooAKKKKACiiigAooooAKKKKANaH/VL9KlqKH/VL9Klrme5qgooo
247
+ pAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAWovuCpKji+
248
+ 4KkrN7nRHYKKKKQwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
249
+ iigAooooA//WZJ99vqabTpPvt9TTa70cLCiiigAooooAKKKKACiiigAooooA
250
+ KKKKACiiigAooooAKKKKACiiigDWh/1S/Spaih/1S/Spa5nuaoKKKKQBRRRQ
251
+ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAFqL7gqSo4vuCpKze5
252
+ 0R2CiiikMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
253
+ KAP/12Sffb6mm06T77fU02u9HCwooooAKKKKACiiigAooooAKKKKACiiigAo
254
+ oooAKKKKACiiigAooooA1of9Uv0qWoof9Uv0qWuZ7mqCiiikAUUUUAFFFFAB
255
+ RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBai+4KkqOL7gqSs3udEdgooo
256
+ pDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9DU
257
+ OnxMSdx5pP7Oi/vNWjRV+0l3I5I9jO/s6L+81H9nRf3mrRoo9pLuHs49jO/s
258
+ 6L+81H9nRf3mrRoo9pLuHs49jO/s6L+81H9nRf3mrRoo9pLuHs49jO/s6L+8
259
+ 1H9nRf3mrRoo9pLuHs49jO/s6L+81H9nRf3mrRoo9pLuHs49jO/s6L+81H9n
260
+ Rf3mrRoo9pLuHs49jO/s6L+81H9nRf3mrRoo9pLuHs49jO/s6L+81H9nRf3m
261
+ rRoo9pLuHs49jO/s6L+81H9nRf3mrRoo9pLuHs49jO/s6L+81H9nRf3mrRoo
262
+ 9pLuHs49iBLdUUKCeKd5K+pqWip5mPlRF5K+po8lfU1LRRdhyoi8lfU0eSvq
263
+ aloouw5UReSvqaPJX1NS0UXYcqIvJX1NHkr6mpaKLsOVEXkr6mjyV9TUtFF2
264
+ HKiLyV9TR5K+pqWii7DlRF5K+po8lfU1LRRdhyoi8lfU0eSvqaloouw5UReS
265
+ vqaPJX1NS0UXYcqIvJX1NHkr6mpaKLsOVCKu0YFLRRSKCiiigAooooAKKKKA
266
+ CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//9k=
267
+
268
+ --001a1140ffb6f4fc63053a2257e2--
269
+
270
+ --xYzZY
271
+ Content-Disposition: form-data; name="to"
272
+
273
+ inbound@inbound.inbound.com
274
+ --xYzZY
275
+ Content-Disposition: form-data; name="from"
276
+
277
+ Example User <test@example.com>
278
+ --xYzZY
279
+ Content-Disposition: form-data; name="sender_ip"
280
+
281
+ 0.0.0.0
282
+ --xYzZY
283
+ Content-Disposition: form-data; name="envelope"
284
+
285
+ {"to":["inbound@inbound.inbound.com"],"from":"test@example.com"}
286
+ --xYzZY
287
+ Content-Disposition: form-data; name="subject"
288
+
289
+ Raw Payload
290
+ --xYzZY
291
+ Content-Disposition: form-data; name="charsets"
292
+
293
+ {"to":"UTF-8","subject":"UTF-8","from":"UTF-8"}
294
+ --xYzZY
295
+ Content-Disposition: form-data; name="SPF"
296
+
297
+ pass
298
+ --xYzZY--
@@ -0,0 +1,26 @@
1
+ # A module for sending test SendGrid Inbound Parse messages
2
+ # Usage: ruby ./send.rb [path to file containing test data]
3
+ require 'ruby_http_client'
4
+ require 'yaml'
5
+ require 'optparse'
6
+
7
+ OPTS = {}
8
+ opt = OptionParser.new
9
+ opt.on('--host=HOST') {|v| OPTS[:host] = v}
10
+ argv = opt.parse!(ARGV)
11
+ config = YAML.load_file(File.dirname(__FILE__) + '/config.yml')
12
+ host = OPTS[:host] || config['host']
13
+ client = SendGrid::Client.new(host: host)
14
+ File.open(argv[0]) do |file|
15
+ data = file.read
16
+ headers = {
17
+ 'User-Agent' => 'SendGrid-Test',
18
+ 'Content-Type' => 'multipart/form-data; boundary=xYzZY'
19
+ }
20
+ response = client.post(
21
+ request_body: data, request_headers: headers
22
+ )
23
+ puts response.status_code
24
+ puts response.body
25
+ puts response.headers
26
+ end
@@ -1,3 +1,3 @@
1
1
  module SendGrid
2
- VERSION = '4.0.8'
2
+ VERSION = '4.1.0'
3
3
  end
@@ -16,8 +16,8 @@ Gem::Specification.new do |spec|
16
16
  spec.executables = spec.files.grep(/^bin/) { |f| File.basename(f) }
17
17
  spec.test_files = spec.files.grep(/^(test|spec|features)/)
18
18
  spec.require_paths = ['lib']
19
-
20
19
  spec.add_dependency 'ruby_http_client', '~> 3.0.1'
20
+ spec.add_dependency 'sinatra', '~> 1.4.7'
21
21
  spec.add_development_dependency 'rake', '~> 0'
22
22
  spec.add_development_dependency 'minitest'
23
23
  end
@@ -55,7 +55,7 @@ class TestAPI < MiniTest::Test
55
55
  ')
56
56
  assert_equal(test_headers, sg.request_headers)
57
57
  assert_equal("v3", sg.version)
58
- assert_equal("4.0.8", SendGrid::VERSION)
58
+ assert_equal("4.1.0", SendGrid::VERSION)
59
59
  assert_instance_of(SendGrid::Client, sg.client)
60
60
  end
61
61
 
@@ -1874,7 +1874,7 @@ class TestAPI < MiniTest::Test
1874
1874
  email = "test_url_param"
1875
1875
  headers = JSON.parse('{"X-Mock": 200}')
1876
1876
 
1877
- response = @sg.client.suppression.spam_report._(email).get(request_headers: headers)
1877
+ response = @sg.client.suppression.spam_reports._(email).get(request_headers: headers)
1878
1878
 
1879
1879
  self.assert_equal('200', response.status_code)
1880
1880
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sendgrid-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.8
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elmer Thomas
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-02-18 00:00:00.000000000 Z
13
+ date: 2017-04-06 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ruby_http_client
@@ -26,6 +26,20 @@ dependencies:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
28
  version: 3.0.1
29
+ - !ruby/object:Gem::Dependency
30
+ name: sinatra
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: 1.4.7
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: 1.4.7
29
43
  - !ruby/object:Gem::Dependency
30
44
  name: rake
31
45
  requirement: !ruby/object:Gem::Requirement
@@ -72,6 +86,7 @@ files:
72
86
  - TROUBLESHOOTING.md
73
87
  - USAGE.md
74
88
  - USE_CASES.md
89
+ - config.ru
75
90
  - examples/accesssettings/accesssettings.rb
76
91
  - examples/alerts/alerts.rb
77
92
  - examples/apikeys/apikeys.rb
@@ -100,6 +115,14 @@ files:
100
115
  - examples/whitelabel/whitelabel.rb
101
116
  - lib/sendgrid-ruby.rb
102
117
  - lib/sendgrid/client.rb
118
+ - lib/sendgrid/helpers/inbound/README.md
119
+ - lib/sendgrid/helpers/inbound/app.rb
120
+ - lib/sendgrid/helpers/inbound/config.yml
121
+ - lib/sendgrid/helpers/inbound/public/index.html
122
+ - lib/sendgrid/helpers/inbound/sample_data/default_data.txt
123
+ - lib/sendgrid/helpers/inbound/sample_data/raw_data.txt
124
+ - lib/sendgrid/helpers/inbound/sample_data/raw_data_with_attachments.txt
125
+ - lib/sendgrid/helpers/inbound/send.rb
103
126
  - lib/sendgrid/helpers/mail/README.md
104
127
  - lib/sendgrid/helpers/mail/mail.rb
105
128
  - lib/sendgrid/version.rb
@@ -127,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
150
  version: '0'
128
151
  requirements: []
129
152
  rubyforge_project:
130
- rubygems_version: 2.6.8
153
+ rubygems_version: 2.6.10
131
154
  signing_key:
132
155
  specification_version: 4
133
156
  summary: Official SendGrid Gem