em-apns 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ module EM
2
+ module APNS
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: UTF-8
2
+ require "spec_helper"
3
+ include HelperMethods
4
+ describe "APN" do
5
+ it "receives message" do
6
+ on_request = proc{|args| args.should == {"aps"=>{"alert"=>"test message"}}; EM.stop }
7
+ run_em_apns({request: on_request}) do
8
+ EM::APNS.send_notification("f"*64, alert: "test message")
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,176 @@
1
+ # encoding: UTF-8
2
+ require "spec_helper"
3
+
4
+ describe EventMachine::APNS::Notification do
5
+ let(:token) { "fe9515ba7556cfdcfca6530235c95dff682fac765838e749a201a7f6cf3792e6" }
6
+
7
+ describe "#initialize" do
8
+ it "raises an exception if the token is blank" do
9
+ expect { EM::APNS::Notification.new(nil) }.to raise_error
10
+ expect { EM::APNS::Notification.new("") }.to raise_error
11
+ end
12
+
13
+ it "raises an exception if the token is less than or greater than 32 bytes" do
14
+ expect { EM::APNS::Notification.new("0" * 63) }.to raise_error
15
+ expect { EM::APNS::Notification.new("0" * 65) }.to raise_error
16
+ end
17
+ end
18
+
19
+ describe "#token" do
20
+ it "returns the token" do
21
+ notification = EM::APNS::Notification.new(token)
22
+ notification.token.should == token
23
+ end
24
+ end
25
+
26
+ describe "#payload" do
27
+ it "returns aps properties encoded as JSON" do
28
+ notification = EM::APNS::Notification.new(token, {
29
+ :alert => "Hello world",
30
+ :badge => 10,
31
+ :sound => "ding.aiff"
32
+ })
33
+ payload = JSON.parse(notification.payload)
34
+ payload["aps"]["alert"].should == "Hello world"
35
+ payload["aps"]["badge"].should == 10
36
+ payload["aps"]["sound"].should == "ding.aiff"
37
+ end
38
+
39
+ it "returns custom properties as well" do
40
+ notification = EM::APNS::Notification.new(token, {}, {:line => "I'm super bad"})
41
+ payload = JSON.parse(notification.payload)
42
+ payload["line"].should == "I'm super bad"
43
+ end
44
+
45
+ it "handles string keys" do
46
+ notification = EM::APNS::Notification.new(token,
47
+ {
48
+ "alert" => "Hello world",
49
+ "badge" => 10,
50
+ "sound" => "ding.aiff"
51
+ },
52
+ {
53
+ "custom" => "param"
54
+ }
55
+ )
56
+ payload = JSON.parse(notification.payload)
57
+ payload["aps"]["alert"].should == "Hello world"
58
+ payload["aps"]["badge"].should == 10
59
+ payload["aps"]["sound"].should == "ding.aiff"
60
+ payload["custom"].should == "param"
61
+ end
62
+ end
63
+
64
+ describe "#data" do
65
+ it "returns the enhanced notification in the supported binary format" do
66
+ notification = EM::APNS::Notification.new(token, {:alert => "Hello world"})
67
+ data = notification.data.unpack("cNNnH64na*")
68
+ data[4].should == token
69
+ data[5].should == notification.payload.length
70
+ data[6].should == notification.payload
71
+ end
72
+
73
+ it "handles UTF-8 payloads" do
74
+ string = "✓ Please"
75
+ notification = EM::APNS::Notification.new(token, {:alert => string})
76
+ data = notification.data.unpack("cNNnH64na*")
77
+ data[4].should == token
78
+ data[5].should == [notification.payload].pack("a*").size
79
+ data[6].force_encoding("UTF-8").should == notification.payload
80
+ end
81
+
82
+ it "defaults the identifier and expiry to 0" do
83
+ notification = EM::APNS::Notification.new(token, {:alert => "Hello world"})
84
+ data = notification.data.unpack("cNNnH64na*")
85
+ data[1].should == 0 # Identifier
86
+ data[2].should == 0 # Expiry
87
+ end
88
+ end
89
+
90
+ describe "#validate!" do
91
+ it "raises PayloadTooLarge error if PAYLOAD_MAX_BYTES exceeded" do
92
+ notification = EM::APNS::Notification.new(token, {:alert => "X" * 512})
93
+
94
+ lambda {
95
+ notification.validate!
96
+ }.should raise_error(EM::APNS::Notification::PayloadTooLarge)
97
+ end
98
+ end
99
+
100
+ describe "#identifier=" do
101
+ it "sets the identifier, which is returned in the binary data" do
102
+ notification = EM::APNS::Notification.new(token)
103
+ notification.identifier = 12345
104
+ notification.identifier.should == 12345
105
+
106
+ data = notification.data.unpack("cNNnH64na*")
107
+ data[1].should == notification.identifier
108
+ end
109
+
110
+ it "converts everything to an integer" do
111
+ notification = EM::APNS::Notification.new(token)
112
+ notification.identifier = "12345"
113
+ notification.identifier.should == 12345
114
+ end
115
+
116
+ it "can be set in the initializer" do
117
+ notification = EM::APNS::Notification.new(token, {}, {}, {:identifier => 12345})
118
+ notification.identifier.should == 12345
119
+ end
120
+ end
121
+
122
+ describe "#expiry=" do
123
+ it "sets the expiry, which is returned in the binary data" do
124
+ epoch = Time.now.to_i
125
+ notification = EM::APNS::Notification.new(token)
126
+ notification.expiry = epoch
127
+ notification.expiry.should == epoch
128
+
129
+ data = notification.data.unpack("cNNnH64na*")
130
+ data[2].should == epoch
131
+ end
132
+
133
+ it "can be set in the initializer" do
134
+ epoch = Time.now.to_i
135
+ notification = EM::APNS::Notification.new(token, {}, {}, {:expiry => epoch})
136
+ notification.expiry.should == epoch
137
+ end
138
+ end
139
+
140
+ describe "#truncate_alert!" do
141
+ context "when the data size would exceed the APNS limit" do
142
+ it "truncates the alert" do
143
+ notification = EM::APNS::Notification.new(token, { "alert" => "X" * 300 })
144
+ notification.data.size.should be > EM::APNS::Notification::DATA_MAX_BYTES
145
+
146
+ notification.truncate_alert!
147
+ notification.data.size.should_not be > EM::APNS::Notification::DATA_MAX_BYTES
148
+ parsed_payload = JSON.parse(notification.payload)
149
+ parsed_payload["aps"]["alert"].size.should == 191
150
+ end
151
+
152
+ it "truncates the alert properly when it is JSON serialized into a different size" do
153
+ notification = EM::APNS::Notification.new(token, { "alert" => '"' * 300 })
154
+ notification.truncate_alert!
155
+ parsed_payload = JSON.parse(notification.payload)
156
+ parsed_payload["aps"]["alert"].size.should == 95
157
+ end
158
+
159
+ it "truncates the alert properly for multi-byte Unicode characters" do
160
+ notification = EM::APNS::Notification.new(token, { "alert" => [57352].pack('U') * 500 })
161
+ notification.truncate_alert!
162
+ parsed_payload = JSON.parse(notification.payload)
163
+ parsed_payload["aps"]["alert"].size.should == 63
164
+ end
165
+ end
166
+
167
+ context "when the data size would not exceed the APNS limit" do
168
+ it "does not change the alert" do
169
+ notification = EM::APNS::Notification.new(token, { "alert" => "Hello world" })
170
+ notification.truncate_alert!
171
+ parsed_payload = JSON.parse(notification.payload)
172
+ parsed_payload["aps"]["alert"].should == "Hello world"
173
+ end
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,4 @@
1
+ require "rubygems"
2
+ require "bundler/setup"
3
+ Bundler.require :default, :development
4
+ require "support/helper_methods"
@@ -0,0 +1,941 @@
1
+
2
+
3
+
4
+ <!DOCTYPE html>
5
+ <html>
6
+ <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# githubog: http://ogp.me/ns/fb/githubog#">
7
+ <meta charset='utf-8'>
8
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
9
+ <title>em-apn/spec/support/certs/cert.pem at master · groupme/em-apn</title>
10
+ <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" />
11
+ <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub" />
12
+ <link rel="apple-touch-icon-precomposed" sizes="57x57" href="apple-touch-icon-114.png" />
13
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="apple-touch-icon-114.png" />
14
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="apple-touch-icon-144.png" />
15
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="apple-touch-icon-144.png" />
16
+
17
+
18
+
19
+ <link rel="icon" type="image/x-icon" href="/favicon.png" />
20
+
21
+ <meta content="authenticity_token" name="csrf-param" />
22
+ <meta content="U+XxbKTsZ1fE1meooqyxblQiou85UtNSl0W0Ic7P3PA=" name="csrf-token" />
23
+
24
+ <link href="https://a248.e.akamai.net/assets.github.com/assets/github-d32e243bf8eb8ccb9713860d2989f567c74780f5.css" media="screen" rel="stylesheet" type="text/css" />
25
+ <link href="https://a248.e.akamai.net/assets.github.com/assets/github2-9618739f589609d8af1547d00def64a14f3f4410.css" media="screen" rel="stylesheet" type="text/css" />
26
+
27
+
28
+
29
+ <script src="https://a248.e.akamai.net/assets.github.com/assets/frameworks-cc8431500f70fcd18c6da029472b59d6c39d0d95.js" type="text/javascript"></script>
30
+
31
+ <script defer="defer" src="https://a248.e.akamai.net/assets.github.com/assets/github-5ca52be5e6860ec88fd85ba25eb25e1d719d22ba.js" type="text/javascript"></script>
32
+
33
+
34
+
35
+ <link rel='permalink' href='/groupme/em-apn/blob/f70bb3379844a442e8c363c79f083f57d863f72b/spec/support/certs/cert.pem'>
36
+ <meta property="og:title" content="em-apn"/>
37
+ <meta property="og:type" content="githubog:gitrepository"/>
38
+ <meta property="og:url" content="https://github.com/groupme/em-apn"/>
39
+ <meta property="og:image" content="https://a248.e.akamai.net/assets.github.com/images/gravatars/gravatar-user-420.png?1345673561"/>
40
+ <meta property="og:site_name" content="GitHub"/>
41
+ <meta property="og:description" content="EventMachine'd Apple Push Notifications. Contribute to em-apn development by creating an account on GitHub."/>
42
+
43
+ <meta name="description" content="EventMachine'd Apple Push Notifications. Contribute to em-apn development by creating an account on GitHub." />
44
+
45
+ <link href="https://github.com/groupme/em-apn/commits/master.atom" rel="alternate" title="Recent Commits to em-apn:master" type="application/atom+xml" />
46
+
47
+ </head>
48
+
49
+
50
+ <body class="logged_in page-blob linux vis-public env-production ">
51
+ <div id="wrapper">
52
+
53
+
54
+
55
+
56
+ <div id="header" class="true clearfix">
57
+ <div class="container clearfix">
58
+ <a class="site-logo" href="https://github.com/">
59
+ <img alt="GitHub" class="github-logo-4x" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x.png?1337118066" />
60
+ <img alt="GitHub" class="github-logo-4x-hover" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x-hover.png?1337118066" />
61
+ </a>
62
+
63
+ <a href="/notifications" class="notification-indicator tooltipped downwards" title="You have no unread notifications">
64
+ <span class="mail-status all-read"></span>
65
+ </a>
66
+
67
+
68
+ <div class="topsearch ">
69
+ <form accept-charset="UTF-8" action="/search" id="top_search_form" method="get">
70
+ <a href="/search" class="advanced-search tooltipped downwards" title="Advanced Search"><span class="mini-icon mini-icon-advanced-search"></span></a>
71
+ <div class="search placeholder-field js-placeholder-field">
72
+ <input type="text" class="search my_repos_autocompleter" id="global-search-field" name="q" results="5" spellcheck="false" autocomplete="off" data-autocomplete="my-repos-autocomplete" placeholder="Search&hellip;" data-hotkey="s" />
73
+ <div id="my-repos-autocomplete" class="autocomplete-results">
74
+ <ul class="js-navigation-container"></ul>
75
+ </div>
76
+ <input type="submit" value="Search" class="button">
77
+ <span class="mini-icon mini-icon-search-input"></span>
78
+ </div>
79
+ <input type="hidden" name="type" value="Everything" />
80
+ <input type="hidden" name="repo" value="" />
81
+ <input type="hidden" name="langOverride" value="" />
82
+ <input type="hidden" name="start_value" value="1" />
83
+ </form>
84
+
85
+ <ul class="top-nav">
86
+ <li class="explore"><a href="https://github.com/explore">Explore</a></li>
87
+ <li><a href="https://gist.github.com">Gist</a></li>
88
+ <li><a href="/blog">Blog</a></li>
89
+ <li><a href="http://help.github.com">Help</a></li>
90
+ </ul>
91
+ </div>
92
+
93
+
94
+
95
+
96
+
97
+ <div id="userbox">
98
+ <div id="user">
99
+ <a href="https://github.com/playa"><img height="20" src="https://secure.gravatar.com/avatar/c075d60175a83a2568ae345147459e30?s=140&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png" width="20" /></a>
100
+ <a href="https://github.com/playa" class="name">playa</a>
101
+ </div>
102
+ <ul id="user-links">
103
+ <li>
104
+ <a href="/new" id="new_repo" class="tooltipped downwards" title="Create a New Repo"><span class="mini-icon mini-icon-create"></span></a>
105
+ </li>
106
+ <li>
107
+ <a href="/settings/profile" id="account_settings"
108
+ class="tooltipped downwards"
109
+ title="Account Settings ">
110
+ <span class="mini-icon mini-icon-account-settings"></span>
111
+ </a>
112
+ </li>
113
+ <li>
114
+ <a href="/logout" data-method="post" id="logout" class="tooltipped downwards" title="Sign Out">
115
+ <span class="mini-icon mini-icon-logout"></span>
116
+ </a>
117
+ </li>
118
+ </ul>
119
+ </div>
120
+
121
+
122
+
123
+
124
+ </div>
125
+ </div>
126
+
127
+
128
+
129
+
130
+
131
+ <div class="site hfeed" itemscope itemtype="http://schema.org/WebPage">
132
+ <div class="container hentry">
133
+ <div class="pagehead repohead instapaper_ignore readability-menu">
134
+ <div class="title-actions-bar">
135
+
136
+
137
+
138
+
139
+ <ul class="pagehead-actions">
140
+
141
+
142
+ <li class="subscription">
143
+ <form accept-charset="UTF-8" action="/notifications/subscribe" data-autosubmit="true" data-remote="true" method="post"><div style="margin:0;padding:0;display:inline"><input name="authenticity_token" type="hidden" value="U+XxbKTsZ1fE1meooqyxblQiou85UtNSl0W0Ic7P3PA=" /></div>
144
+ <input id="repository_id" name="repository_id" type="hidden" value="1898066" />
145
+ <div class="context-menu-container js-menu-container js-context-menu">
146
+ <span class="minibutton switcher bigger js-menu-target">
147
+ <span class="js-context-button">
148
+ <span class="mini-icon mini-icon-watching"></span> Watch
149
+ </span>
150
+ </span>
151
+
152
+ <div class="context-pane js-menu-content">
153
+ <a href="javascript:;" class="close js-menu-close"><span class="mini-icon mini-icon-remove-close"></span></a>
154
+ <div class="context-title">Notification status</div>
155
+
156
+ <div class="context-body pane-selector">
157
+ <ul class="js-navigation-container">
158
+ <li class="selector-item js-navigation-item js-navigation-target selected">
159
+ <span class="mini-icon mini-icon-confirm"></span>
160
+ <label>
161
+ <input checked="checked" id="do_included" name="do" type="radio" value="included" />
162
+ <h4>Not watching</h4>
163
+ <p>You will only receive notifications when you participate or are mentioned.</p>
164
+ </label>
165
+ <span class="context-button-text js-context-button-text">
166
+ <span class="mini-icon mini-icon-watching"></span>
167
+ Watch
168
+ </span>
169
+ </li>
170
+ <li class="selector-item js-navigation-item js-navigation-target ">
171
+ <span class="mini-icon mini-icon-confirm"></span>
172
+ <label>
173
+ <input id="do_subscribed" name="do" type="radio" value="subscribed" />
174
+ <h4>Watching</h4>
175
+ <p>You will receive all notifications for this repository.</p>
176
+ </label>
177
+ <span class="context-button-text js-context-button-text">
178
+ <span class="mini-icon mini-icon-unwatch"></span>
179
+ Unwatch
180
+ </span>
181
+ </li>
182
+ <li class="selector-item js-navigation-item js-navigation-target ">
183
+ <span class="mini-icon mini-icon-confirm"></span>
184
+ <label>
185
+ <input id="do_ignore" name="do" type="radio" value="ignore" />
186
+ <h4>Ignored</h4>
187
+ <p>You will not receive notifications for this repository.</p>
188
+ </label>
189
+ <span class="context-button-text js-context-button-text">
190
+ <span class="mini-icon mini-icon-mute"></span>
191
+ Stop ignoring
192
+ </span>
193
+ </li>
194
+ </ul>
195
+ </div>
196
+ </div>
197
+ </div>
198
+ </form>
199
+ </li>
200
+
201
+ <li class="js-toggler-container js-social-container starring-container ">
202
+ <a href="/groupme/em-apn/unstar" class="minibutton js-toggler-target starred" data-remote="true" data-method="post" rel="nofollow">
203
+ <span class="mini-icon mini-icon-star"></span>
204
+ Unstar
205
+ </a><a href="/groupme/em-apn/star" class="minibutton js-toggler-target unstarred" data-remote="true" data-method="post" rel="nofollow">
206
+ <span class="mini-icon mini-icon-star"></span>
207
+ Star
208
+ </a><a class="social-count js-social-count" href="/groupme/em-apn/stargazers">36</a>
209
+ </li>
210
+
211
+ <li>
212
+ <a href="/groupme/em-apn/fork_select" class="minibutton btn-fork js-toggler-target lighter" rel="facebox nofollow">Fork</a><a href="/groupme/em-apn/network" class="social-count">8</a>
213
+ </li>
214
+
215
+
216
+ </ul>
217
+
218
+ <h1 itemscope itemtype="http://data-vocabulary.org/Breadcrumb" class="entry-title public">
219
+ <span class="repo-label"><span>public</span></span>
220
+ <span class="mega-icon mega-icon-public-repo"></span>
221
+ <span class="author vcard">
222
+ <a href="/groupme" class="url fn" itemprop="url" rel="author"> <span itemprop="title">groupme</span>
223
+ </a></span> /
224
+ <strong><a href="/groupme/em-apn" class="js-current-repository">em-apn</a></strong>
225
+ </h1>
226
+ </div>
227
+
228
+
229
+
230
+ <ul class="tabs">
231
+ <li><a href="/groupme/em-apn" class="selected" highlight="repo_sourcerepo_downloadsrepo_commitsrepo_tagsrepo_branches">Code</a></li>
232
+ <li><a href="/groupme/em-apn/network" highlight="repo_network">Network</a>
233
+ <li><a href="/groupme/em-apn/pulls" highlight="repo_pulls">Pull Requests <span class='counter'>1</span></a></li>
234
+
235
+ <li><a href="/groupme/em-apn/issues" highlight="repo_issues">Issues <span class='counter'>1</span></a></li>
236
+
237
+ <li><a href="/groupme/em-apn/wiki" highlight="repo_wiki">Wiki</a></li>
238
+
239
+ <li><a href="/groupme/em-apn/graphs" highlight="repo_graphsrepo_contributors">Graphs</a></li>
240
+
241
+
242
+ </ul>
243
+
244
+ <div class="frame frame-center tree-finder" style="display:none"
245
+ data-tree-list-url="/groupme/em-apn/tree-list/f70bb3379844a442e8c363c79f083f57d863f72b"
246
+ data-blob-url-prefix="/groupme/em-apn/blob/f70bb3379844a442e8c363c79f083f57d863f72b"
247
+ >
248
+
249
+ <div class="breadcrumb">
250
+ <span class="bold"><a href="/groupme/em-apn">em-apn</a></span> /
251
+ <input class="tree-finder-input js-navigation-enable" type="text" name="query" autocomplete="off" spellcheck="false">
252
+ </div>
253
+
254
+ <div class="octotip">
255
+ <p>
256
+ <a href="/groupme/em-apn/dismiss-tree-finder-help" class="dismiss js-dismiss-tree-list-help" title="Hide this notice forever" rel="nofollow">Dismiss</a>
257
+ <span class="bold">Octotip:</span> You've activated the <em>file finder</em>
258
+ by pressing <span class="kbd">t</span> Start typing to filter the
259
+ file list. Use <span class="kbd badmono">↑</span> and
260
+ <span class="kbd badmono">↓</span> to navigate,
261
+ <span class="kbd">enter</span> to view files.
262
+ </p>
263
+ </div>
264
+
265
+ <table class="tree-browser" cellpadding="0" cellspacing="0">
266
+ <tr class="js-header"><th>&nbsp;</th><th>name</th></tr>
267
+ <tr class="js-no-results no-results" style="display: none">
268
+ <th colspan="2">No matching files</th>
269
+ </tr>
270
+ <tbody class="js-results-list js-navigation-container">
271
+ </tbody>
272
+ </table>
273
+ </div>
274
+
275
+ <div id="jump-to-line" style="display:none">
276
+ <h2>Jump to Line</h2>
277
+ <form accept-charset="UTF-8">
278
+ <input class="textfield" type="text">
279
+ <div class="full-button">
280
+ <button type="submit" class="classy">
281
+ Go
282
+ </button>
283
+ </div>
284
+ </form>
285
+ </div>
286
+
287
+
288
+ <div class="tabnav">
289
+
290
+ <span class="tabnav-right">
291
+ <ul class="tabnav-tabs">
292
+ <li><a href="/groupme/em-apn/tags" class="tabnav-tab" highlight="repo_tags">Tags <span class="counter blank">0</span></a></li>
293
+ <li><a href="/groupme/em-apn/downloads" class="tabnav-tab" highlight="repo_downloads">Downloads <span class="counter blank">0</span></a></li>
294
+ </ul>
295
+
296
+ </span>
297
+
298
+ <div class="tabnav-widget scope">
299
+
300
+ <div class="context-menu-container js-menu-container js-context-menu">
301
+ <a href="#"
302
+ class="minibutton bigger switcher js-menu-target js-commitish-button btn-branch repo-tree"
303
+ data-hotkey="w"
304
+ data-master-branch="master"
305
+ data-ref="master">
306
+ <span><i>branch:</i> master</span>
307
+ </a>
308
+
309
+ <div class="context-pane commitish-context js-menu-content">
310
+ <a href="javascript:;" class="close js-menu-close"><span class="mini-icon mini-icon-remove-close"></span></a>
311
+ <div class="context-title">Switch branches/tags</div>
312
+ <div class="context-body pane-selector commitish-selector js-navigation-container">
313
+ <div class="filterbar">
314
+ <input type="text" id="context-commitish-filter-field" class="js-navigation-enable" placeholder="Filter branches/tags" data-filterable />
315
+ <ul class="tabs">
316
+ <li><a href="#" data-filter="branches" class="selected">Branches</a></li>
317
+ <li><a href="#" data-filter="tags">Tags</a></li>
318
+ </ul>
319
+ </div>
320
+
321
+ <div class="js-filter-tab js-filter-branches" data-filterable-for="context-commitish-filter-field" data-filterable-type=substring>
322
+ <div class="no-results js-not-filterable">Nothing to show</div>
323
+ <div class="commitish-item branch-commitish selector-item js-navigation-item js-navigation-target selected">
324
+ <span class="mini-icon mini-icon-confirm"></span>
325
+ <h4>
326
+ <a href="/groupme/em-apn/blob/master/spec/support/certs/cert.pem" class="js-navigation-open" data-name="master" rel="nofollow">master</a>
327
+ </h4>
328
+ </div>
329
+ </div>
330
+
331
+ <div class="js-filter-tab js-filter-tags" style="display:none" data-filterable-for="context-commitish-filter-field" data-filterable-type=substring>
332
+ <div class="no-results js-not-filterable">Nothing to show</div>
333
+ </div>
334
+ </div>
335
+ </div><!-- /.commitish-context-context -->
336
+ </div>
337
+ </div> <!-- /.scope -->
338
+
339
+ <ul class="tabnav-tabs">
340
+ <li><a href="/groupme/em-apn" class="selected tabnav-tab" highlight="repo_source">Files</a></li>
341
+ <li><a href="/groupme/em-apn/commits/master" class="tabnav-tab" highlight="repo_commits">Commits</a></li>
342
+ <li><a href="/groupme/em-apn/branches" class="tabnav-tab" highlight="repo_branches" rel="nofollow">Branches <span class="counter ">1</span></a></li>
343
+ </ul>
344
+
345
+ </div>
346
+
347
+
348
+
349
+
350
+
351
+
352
+
353
+
354
+ </div><!-- /.repohead -->
355
+
356
+ <div id="js-repo-pjax-container" data-pjax-container>
357
+
358
+
359
+
360
+
361
+
362
+ <!-- blob contrib key: blob_contributors:v21:3ffe5bc557adf1a7cd89890a1b0b4bd9 -->
363
+ <!-- blob contrib frag key: views10/v8/blob_contributors:v21:3ffe5bc557adf1a7cd89890a1b0b4bd9 -->
364
+
365
+ <!-- block_view_fragment_key: views10/v8/blob:v21:b6b0086fabdc9098cd87f19552faa510 -->
366
+ <div id="slider">
367
+
368
+ <div class="breadcrumb" data-path="spec/support/certs/cert.pem/">
369
+ <b itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/groupme/em-apn/tree/f70bb3379844a442e8c363c79f083f57d863f72b" class="js-rewrite-sha" itemprop="url"><span itemprop="title">em-apn</span></a></b> / <span itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/groupme/em-apn/tree/f70bb3379844a442e8c363c79f083f57d863f72b/spec" class="js-rewrite-sha" itemscope="url"><span itemprop="title">spec</span></a></span> / <span itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/groupme/em-apn/tree/f70bb3379844a442e8c363c79f083f57d863f72b/spec/support" class="js-rewrite-sha" itemscope="url"><span itemprop="title">support</span></a></span> / <span itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/groupme/em-apn/tree/f70bb3379844a442e8c363c79f083f57d863f72b/spec/support/certs" class="js-rewrite-sha" itemscope="url"><span itemprop="title">certs</span></a></span> / <strong class="final-path">cert.pem</strong> <span class="js-clippy mini-icon mini-icon-clippy " data-clipboard-text="spec/support/certs/cert.pem" data-copied-hint="copied!" data-copy-hint="copy to clipboard"></span>
370
+ </div>
371
+
372
+
373
+ <div class="commit file-history-tease js-blob-contributors-content" data-path="spec/support/certs/cert.pem/">
374
+ <img class="main-avatar" height="24" src="https://secure.gravatar.com/avatar/3969d15a64e76f79cf1038bcf3960ca2?s=140&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png" width="24" />
375
+ <span class="author"><a href="/daveyeu">daveyeu</a></span>
376
+ <time class="js-relative-date" datetime="2011-06-21T12:04:16-07:00" title="2011-06-21 12:04:16">June 21, 2011</time>
377
+ <div class="commit-title">
378
+ <a href="/groupme/em-apn/commit/1107c0a3a85764ed6d026c1b507d08e7ed1b9426" class="message">Refactor EM::APN::Client into an EM::Connection subclass</a>
379
+ </div>
380
+
381
+ <div class="participation">
382
+ <p class="quickstat"><a href="#blob_contributors_box" rel="facebox"><strong>1</strong> contributor</a></p>
383
+
384
+ </div>
385
+ <div id="blob_contributors_box" style="display:none">
386
+ <h2>Users on GitHub who have contributed to this file</h2>
387
+ <ul class="facebox-user-list">
388
+ <li>
389
+ <img height="24" src="https://secure.gravatar.com/avatar/3969d15a64e76f79cf1038bcf3960ca2?s=140&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png" width="24" />
390
+ <a href="/daveyeu">daveyeu</a>
391
+ </li>
392
+ </ul>
393
+ </div>
394
+ </div>
395
+
396
+
397
+ <div class="frames">
398
+ <div class="frame frame-center" data-path="spec/support/certs/cert.pem/" data-permalink-url="/groupme/em-apn/blob/f70bb3379844a442e8c363c79f083f57d863f72b/spec/support/certs/cert.pem" data-title="em-apn/spec/support/certs/cert.pem at master · groupme/em-apn · GitHub" data-type="blob">
399
+
400
+ <div id="files" class="bubble">
401
+ <div class="file">
402
+ <div class="meta">
403
+ <div class="info">
404
+ <span class="icon"><b class="mini-icon mini-icon-text-file"></b></span>
405
+ <span class="mode" title="File Mode">file</span>
406
+ <span>18 lines (17 sloc)</span>
407
+ <span>0.985 kb</span>
408
+ </div>
409
+ <ul class="button-group actions">
410
+ <li>
411
+ <a class="grouped-button file-edit-link minibutton bigger lighter js-rewrite-sha" href="/groupme/em-apn/edit/f70bb3379844a442e8c363c79f083f57d863f72b/spec/support/certs/cert.pem" data-method="post" rel="nofollow" data-hotkey="e">Edit</a>
412
+ </li>
413
+ <li>
414
+ <a href="/groupme/em-apn/raw/master/spec/support/certs/cert.pem" class="minibutton btn-raw grouped-button bigger lighter" id="raw-url">Raw</a>
415
+ </li>
416
+ <li>
417
+ <a href="/groupme/em-apn/blame/master/spec/support/certs/cert.pem" class="minibutton btn-blame grouped-button bigger lighter">Blame</a>
418
+ </li>
419
+ <li>
420
+ <a href="/groupme/em-apn/commits/master/spec/support/certs/cert.pem" class="minibutton btn-history grouped-button bigger lighter" rel="nofollow">History</a>
421
+ </li>
422
+ </ul>
423
+ </div>
424
+ <div class="data type-text">
425
+ <table cellpadding="0" cellspacing="0" class="lines">
426
+ <tr>
427
+ <td>
428
+ <pre class="line_numbers"><span id="L1" rel="#L1">1</span>
429
+ <span id="L2" rel="#L2">2</span>
430
+ <span id="L3" rel="#L3">3</span>
431
+ <span id="L4" rel="#L4">4</span>
432
+ <span id="L5" rel="#L5">5</span>
433
+ <span id="L6" rel="#L6">6</span>
434
+ <span id="L7" rel="#L7">7</span>
435
+ <span id="L8" rel="#L8">8</span>
436
+ <span id="L9" rel="#L9">9</span>
437
+ <span id="L10" rel="#L10">10</span>
438
+ <span id="L11" rel="#L11">11</span>
439
+ <span id="L12" rel="#L12">12</span>
440
+ <span id="L13" rel="#L13">13</span>
441
+ <span id="L14" rel="#L14">14</span>
442
+ <span id="L15" rel="#L15">15</span>
443
+ <span id="L16" rel="#L16">16</span>
444
+ <span id="L17" rel="#L17">17</span>
445
+ </pre>
446
+ </td>
447
+ <td width="100%">
448
+ <div class="highlight"><pre><div class='line' id='LC1'>-----BEGIN CERTIFICATE-----</div><div class='line' id='LC2'>MIICqjCCAhOgAwIBAgIJAO3gD8Fv66MhMA0GCSqGSIb3DQEBBQUAMEMxCzAJBgNV</div><div class='line' id='LC3'>BAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazERMA8GA1UEBxMITmV3IFlvcmsxDjAM</div><div class='line' id='LC4'>BgNVBAoTBUR1bW15MB4XDTExMDYyMTE5MDAyOFoXDTIxMDYxODE5MDAyOFowQzEL</div><div class='line' id='LC5'>MAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcgWW9y</div><div class='line' id='LC6'>azEOMAwGA1UEChMFRHVtbXkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMsR</div><div class='line' id='LC7'>05wNdOiFXil3/r4xGLXc7MYwU2LiZbnXAqaoGnLv3W8cN7i/0i63y8YYITNWm3ji</div><div class='line' id='LC8'>lMiOkj2+TNVE/PiFizFBqhT28V/AsfOsiJrYQ4GXwLwJTsgDGTwAJgov0yPIffhK</div><div class='line' id='LC9'>n9jU7NLNJjhrj0rVD++eNOT8dunvYRlI5S8lJWCNAgMBAAGjgaUwgaIwHQYDVR0O</div><div class='line' id='LC10'>BBYEFISS0qC22So8BtQYTT4n/iLdYnZnMHMGA1UdIwRsMGqAFISS0qC22So8BtQY</div><div class='line' id='LC11'>TT4n/iLdYnZnoUekRTBDMQswCQYDVQQGEwJVUzERMA8GA1UECBMITmV3IFlvcmsx</div><div class='line' id='LC12'>ETAPBgNVBAcTCE5ldyBZb3JrMQ4wDAYDVQQKEwVEdW1teYIJAO3gD8Fv66MhMAwG</div><div class='line' id='LC13'>A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAFBGom218pNCB1zYxhDDtOiYC</div><div class='line' id='LC14'>DyU9rZkLXxMVjSHCvyBtQ3EC/21Zog05LSBMvOHFmfzPbyX/IYxSglJLJlQBzGtP</div><div class='line' id='LC15'>trVx1slmva3/QoKYwAKdAe5oSY8eDqejBpKO12maSGsPwbw3oREmudeWkrFFVAlP</div><div class='line' id='LC16'>hlkmwpq7901kIg4CCe8=</div><div class='line' id='LC17'>-----END CERTIFICATE-----</div></pre></div>
449
+ </td>
450
+ </tr>
451
+ </table>
452
+ </div>
453
+
454
+ </div>
455
+ </div>
456
+ </div>
457
+ </div>
458
+
459
+ </div>
460
+
461
+ <div class="frame frame-loading large-loading-area" style="display:none;" data-tree-list-url="/groupme/em-apn/tree-list/f70bb3379844a442e8c363c79f083f57d863f72b" data-blob-url-prefix="/groupme/em-apn/blob/f70bb3379844a442e8c363c79f083f57d863f72b">
462
+ <img src="https://a248.e.akamai.net/assets.github.com/images/spinners/octocat-spinner-64.gif?1334862346" height="64" width="64">
463
+ </div>
464
+
465
+ </div>
466
+ </div>
467
+ <div class="context-overlay"></div>
468
+ </div>
469
+
470
+ <div id="footer-push"></div><!-- hack for sticky footer -->
471
+ </div><!-- end of wrapper - hack for sticky footer -->
472
+
473
+ <!-- footer -->
474
+ <div id="footer" >
475
+
476
+ <div class="upper_footer">
477
+ <div class="container clearfix">
478
+
479
+ <!--[if IE]><h4 id="blacktocat_ie">GitHub Links</h4><![endif]-->
480
+ <![if !IE]><h4 id="blacktocat">GitHub Links</h4><![endif]>
481
+
482
+ <ul class="footer_nav">
483
+ <h4>GitHub</h4>
484
+ <li><a href="https://github.com/about">About</a></li>
485
+ <li><a href="https://github.com/blog">Blog</a></li>
486
+ <li><a href="https://github.com/features">Features</a></li>
487
+ <li><a href="https://github.com/contact">Contact &amp; Support</a></li>
488
+ <li><a href="https://github.com/training">Training</a></li>
489
+ <li><a href="http://enterprise.github.com/">GitHub Enterprise</a></li>
490
+ <li><a href="http://status.github.com/">Site Status</a></li>
491
+ </ul>
492
+
493
+ <ul class="footer_nav">
494
+ <h4>Clients</h4>
495
+ <li><a href="http://mac.github.com/">GitHub for Mac</a></li>
496
+ <li><a href="http://windows.github.com/">GitHub for Windows</a></li>
497
+ <li><a href="http://eclipse.github.com/">GitHub for Eclipse</a></li>
498
+ <li><a href="http://mobile.github.com/">GitHub Mobile Apps</a></li>
499
+ </ul>
500
+
501
+ <ul class="footer_nav">
502
+ <h4>Tools</h4>
503
+ <li><a href="http://get.gaug.es/">Gauges: Web analytics</a></li>
504
+ <li><a href="http://speakerdeck.com">Speaker Deck: Presentations</a></li>
505
+ <li><a href="https://gist.github.com">Gist: Code snippets</a></li>
506
+
507
+ <h4 class="second">Extras</h4>
508
+ <li><a href="http://jobs.github.com/">Job Board</a></li>
509
+ <li><a href="http://shop.github.com/">GitHub Shop</a></li>
510
+ <li><a href="http://octodex.github.com/">The Octodex</a></li>
511
+ </ul>
512
+
513
+ <ul class="footer_nav">
514
+ <h4>Documentation</h4>
515
+ <li><a href="http://help.github.com/">GitHub Help</a></li>
516
+ <li><a href="http://developer.github.com/">Developer API</a></li>
517
+ <li><a href="http://github.github.com/github-flavored-markdown/">GitHub Flavored Markdown</a></li>
518
+ <li><a href="http://pages.github.com/">GitHub Pages</a></li>
519
+ </ul>
520
+
521
+ </div><!-- /.site -->
522
+ </div><!-- /.upper_footer -->
523
+
524
+ <div class="lower_footer">
525
+ <div class="container clearfix">
526
+ <!--[if IE]><div id="legal_ie"><![endif]-->
527
+ <![if !IE]><div id="legal"><![endif]>
528
+ <ul>
529
+ <li><a href="https://github.com/site/terms">Terms of Service</a></li>
530
+ <li><a href="https://github.com/site/privacy">Privacy</a></li>
531
+ <li><a href="https://github.com/security">Security</a></li>
532
+ </ul>
533
+
534
+ <p>&copy; 2012 <span title="0.11351s from fe13.rs.github.com">GitHub</span> Inc. All rights reserved.</p>
535
+ </div><!-- /#legal or /#legal_ie-->
536
+
537
+ </div><!-- /.site -->
538
+ </div><!-- /.lower_footer -->
539
+
540
+ </div><!-- /#footer -->
541
+
542
+
543
+
544
+ <div id="keyboard_shortcuts_pane" class="instapaper_ignore readability-extra" style="display:none">
545
+ <h2>Keyboard Shortcuts <small><a href="#" class="js-see-all-keyboard-shortcuts">(see all)</a></small></h2>
546
+
547
+ <div class="columns threecols">
548
+ <div class="column first">
549
+ <h3>Site wide shortcuts</h3>
550
+ <dl class="keyboard-mappings">
551
+ <dt>s</dt>
552
+ <dd>Focus site search</dd>
553
+ </dl>
554
+ <dl class="keyboard-mappings">
555
+ <dt>?</dt>
556
+ <dd>Bring up this help dialog</dd>
557
+ </dl>
558
+ </div><!-- /.column.first -->
559
+
560
+ <div class="column middle" style='display:none'>
561
+ <h3>Commit list</h3>
562
+ <dl class="keyboard-mappings">
563
+ <dt>j</dt>
564
+ <dd>Move selection down</dd>
565
+ </dl>
566
+ <dl class="keyboard-mappings">
567
+ <dt>k</dt>
568
+ <dd>Move selection up</dd>
569
+ </dl>
570
+ <dl class="keyboard-mappings">
571
+ <dt>c <em>or</em> o <em>or</em> enter</dt>
572
+ <dd>Open commit</dd>
573
+ </dl>
574
+ <dl class="keyboard-mappings">
575
+ <dt>y</dt>
576
+ <dd>Expand URL to its canonical form</dd>
577
+ </dl>
578
+ </div><!-- /.column.first -->
579
+
580
+ <div class="column last js-hidden-pane" style='display:none'>
581
+ <h3>Pull request list</h3>
582
+ <dl class="keyboard-mappings">
583
+ <dt>j</dt>
584
+ <dd>Move selection down</dd>
585
+ </dl>
586
+ <dl class="keyboard-mappings">
587
+ <dt>k</dt>
588
+ <dd>Move selection up</dd>
589
+ </dl>
590
+ <dl class="keyboard-mappings">
591
+ <dt>o <em>or</em> enter</dt>
592
+ <dd>Open issue</dd>
593
+ </dl>
594
+ <dl class="keyboard-mappings">
595
+ <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt>
596
+ <dd>Submit comment</dd>
597
+ </dl>
598
+ <dl class="keyboard-mappings">
599
+ <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> shift p</dt>
600
+ <dd>Preview comment</dd>
601
+ </dl>
602
+ </div><!-- /.columns.last -->
603
+
604
+ </div><!-- /.columns.equacols -->
605
+
606
+ <div class="js-hidden-pane" style='display:none'>
607
+ <div class="rule"></div>
608
+
609
+ <h3>Issues</h3>
610
+
611
+ <div class="columns threecols">
612
+ <div class="column first">
613
+ <dl class="keyboard-mappings">
614
+ <dt>j</dt>
615
+ <dd>Move selection down</dd>
616
+ </dl>
617
+ <dl class="keyboard-mappings">
618
+ <dt>k</dt>
619
+ <dd>Move selection up</dd>
620
+ </dl>
621
+ <dl class="keyboard-mappings">
622
+ <dt>x</dt>
623
+ <dd>Toggle selection</dd>
624
+ </dl>
625
+ <dl class="keyboard-mappings">
626
+ <dt>o <em>or</em> enter</dt>
627
+ <dd>Open issue</dd>
628
+ </dl>
629
+ <dl class="keyboard-mappings">
630
+ <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt>
631
+ <dd>Submit comment</dd>
632
+ </dl>
633
+ <dl class="keyboard-mappings">
634
+ <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> shift p</dt>
635
+ <dd>Preview comment</dd>
636
+ </dl>
637
+ </div><!-- /.column.first -->
638
+ <div class="column last">
639
+ <dl class="keyboard-mappings">
640
+ <dt>c</dt>
641
+ <dd>Create issue</dd>
642
+ </dl>
643
+ <dl class="keyboard-mappings">
644
+ <dt>l</dt>
645
+ <dd>Create label</dd>
646
+ </dl>
647
+ <dl class="keyboard-mappings">
648
+ <dt>i</dt>
649
+ <dd>Back to inbox</dd>
650
+ </dl>
651
+ <dl class="keyboard-mappings">
652
+ <dt>u</dt>
653
+ <dd>Back to issues</dd>
654
+ </dl>
655
+ <dl class="keyboard-mappings">
656
+ <dt>/</dt>
657
+ <dd>Focus issues search</dd>
658
+ </dl>
659
+ </div>
660
+ </div>
661
+ </div>
662
+
663
+ <div class="js-hidden-pane" style='display:none'>
664
+ <div class="rule"></div>
665
+
666
+ <h3>Issues Dashboard</h3>
667
+
668
+ <div class="columns threecols">
669
+ <div class="column first">
670
+ <dl class="keyboard-mappings">
671
+ <dt>j</dt>
672
+ <dd>Move selection down</dd>
673
+ </dl>
674
+ <dl class="keyboard-mappings">
675
+ <dt>k</dt>
676
+ <dd>Move selection up</dd>
677
+ </dl>
678
+ <dl class="keyboard-mappings">
679
+ <dt>o <em>or</em> enter</dt>
680
+ <dd>Open issue</dd>
681
+ </dl>
682
+ </div><!-- /.column.first -->
683
+ </div>
684
+ </div>
685
+
686
+ <div class="js-hidden-pane" style='display:none'>
687
+ <div class="rule"></div>
688
+
689
+ <h3>Network Graph</h3>
690
+ <div class="columns equacols">
691
+ <div class="column first">
692
+ <dl class="keyboard-mappings">
693
+ <dt><span class="badmono">←</span> <em>or</em> h</dt>
694
+ <dd>Scroll left</dd>
695
+ </dl>
696
+ <dl class="keyboard-mappings">
697
+ <dt><span class="badmono">→</span> <em>or</em> l</dt>
698
+ <dd>Scroll right</dd>
699
+ </dl>
700
+ <dl class="keyboard-mappings">
701
+ <dt><span class="badmono">↑</span> <em>or</em> k</dt>
702
+ <dd>Scroll up</dd>
703
+ </dl>
704
+ <dl class="keyboard-mappings">
705
+ <dt><span class="badmono">↓</span> <em>or</em> j</dt>
706
+ <dd>Scroll down</dd>
707
+ </dl>
708
+ <dl class="keyboard-mappings">
709
+ <dt>t</dt>
710
+ <dd>Toggle visibility of head labels</dd>
711
+ </dl>
712
+ </div><!-- /.column.first -->
713
+ <div class="column last">
714
+ <dl class="keyboard-mappings">
715
+ <dt>shift <span class="badmono">←</span> <em>or</em> shift h</dt>
716
+ <dd>Scroll all the way left</dd>
717
+ </dl>
718
+ <dl class="keyboard-mappings">
719
+ <dt>shift <span class="badmono">→</span> <em>or</em> shift l</dt>
720
+ <dd>Scroll all the way right</dd>
721
+ </dl>
722
+ <dl class="keyboard-mappings">
723
+ <dt>shift <span class="badmono">↑</span> <em>or</em> shift k</dt>
724
+ <dd>Scroll all the way up</dd>
725
+ </dl>
726
+ <dl class="keyboard-mappings">
727
+ <dt>shift <span class="badmono">↓</span> <em>or</em> shift j</dt>
728
+ <dd>Scroll all the way down</dd>
729
+ </dl>
730
+ </div><!-- /.column.last -->
731
+ </div>
732
+ </div>
733
+
734
+ <div class="js-hidden-pane" >
735
+ <div class="rule"></div>
736
+ <div class="columns threecols">
737
+ <div class="column first js-hidden-pane" >
738
+ <h3>Source Code Browsing</h3>
739
+ <dl class="keyboard-mappings">
740
+ <dt>t</dt>
741
+ <dd>Activates the file finder</dd>
742
+ </dl>
743
+ <dl class="keyboard-mappings">
744
+ <dt>l</dt>
745
+ <dd>Jump to line</dd>
746
+ </dl>
747
+ <dl class="keyboard-mappings">
748
+ <dt>w</dt>
749
+ <dd>Switch branch/tag</dd>
750
+ </dl>
751
+ <dl class="keyboard-mappings">
752
+ <dt>y</dt>
753
+ <dd>Expand URL to its canonical form</dd>
754
+ </dl>
755
+ </div>
756
+ </div>
757
+ </div>
758
+
759
+ <div class="js-hidden-pane" style='display:none'>
760
+ <div class="rule"></div>
761
+ <div class="columns threecols">
762
+ <div class="column first">
763
+ <h3>Browsing Commits</h3>
764
+ <dl class="keyboard-mappings">
765
+ <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt>
766
+ <dd>Submit comment</dd>
767
+ </dl>
768
+ <dl class="keyboard-mappings">
769
+ <dt>escape</dt>
770
+ <dd>Close form</dd>
771
+ </dl>
772
+ <dl class="keyboard-mappings">
773
+ <dt>p</dt>
774
+ <dd>Parent commit</dd>
775
+ </dl>
776
+ <dl class="keyboard-mappings">
777
+ <dt>o</dt>
778
+ <dd>Other parent commit</dd>
779
+ </dl>
780
+ </div>
781
+ </div>
782
+ </div>
783
+
784
+ <div class="js-hidden-pane" style='display:none'>
785
+ <div class="rule"></div>
786
+ <h3>Notifications</h3>
787
+
788
+ <div class="columns threecols">
789
+ <div class="column first">
790
+ <dl class="keyboard-mappings">
791
+ <dt>j</dt>
792
+ <dd>Move selection down</dd>
793
+ </dl>
794
+ <dl class="keyboard-mappings">
795
+ <dt>k</dt>
796
+ <dd>Move selection up</dd>
797
+ </dl>
798
+ <dl class="keyboard-mappings">
799
+ <dt>o <em>or</em> enter</dt>
800
+ <dd>Open notification</dd>
801
+ </dl>
802
+ </div><!-- /.column.first -->
803
+
804
+ <div class="column second">
805
+ <dl class="keyboard-mappings">
806
+ <dt>e <em>or</em> shift i <em>or</em> y</dt>
807
+ <dd>Mark as read</dd>
808
+ </dl>
809
+ <dl class="keyboard-mappings">
810
+ <dt>shift m</dt>
811
+ <dd>Mute thread</dd>
812
+ </dl>
813
+ </div><!-- /.column.first -->
814
+ </div>
815
+ </div>
816
+
817
+ </div>
818
+
819
+ <div id="markdown-help" class="instapaper_ignore readability-extra">
820
+ <h2>Markdown Cheat Sheet</h2>
821
+
822
+ <div class="cheatsheet-content">
823
+
824
+ <div class="mod">
825
+ <div class="col">
826
+ <h3>Format Text</h3>
827
+ <p>Headers</p>
828
+ <pre>
829
+ # This is an &lt;h1&gt; tag
830
+ ## This is an &lt;h2&gt; tag
831
+ ###### This is an &lt;h6&gt; tag</pre>
832
+ <p>Text styles</p>
833
+ <pre>
834
+ *This text will be italic*
835
+ _This will also be italic_
836
+ **This text will be bold**
837
+ __This will also be bold__
838
+
839
+ *You **can** combine them*
840
+ </pre>
841
+ </div>
842
+ <div class="col">
843
+ <h3>Lists</h3>
844
+ <p>Unordered</p>
845
+ <pre>
846
+ * Item 1
847
+ * Item 2
848
+ * Item 2a
849
+ * Item 2b</pre>
850
+ <p>Ordered</p>
851
+ <pre>
852
+ 1. Item 1
853
+ 2. Item 2
854
+ 3. Item 3
855
+ * Item 3a
856
+ * Item 3b</pre>
857
+ </div>
858
+ <div class="col">
859
+ <h3>Miscellaneous</h3>
860
+ <p>Images</p>
861
+ <pre>
862
+ ![GitHub Logo](/images/logo.png)
863
+ Format: ![Alt Text](url)
864
+ </pre>
865
+ <p>Links</p>
866
+ <pre>
867
+ http://github.com - automatic!
868
+ [GitHub](http://github.com)</pre>
869
+ <p>Blockquotes</p>
870
+ <pre>
871
+ As Kanye West said:
872
+
873
+ > We're living the future so
874
+ > the present is our past.
875
+ </pre>
876
+ </div>
877
+ </div>
878
+ <div class="rule"></div>
879
+
880
+ <h3>Code Examples in Markdown</h3>
881
+ <div class="col">
882
+ <p>Syntax highlighting with <a href="http://github.github.com/github-flavored-markdown/" title="GitHub Flavored Markdown" target="_blank">GFM</a></p>
883
+ <pre>
884
+ ```javascript
885
+ function fancyAlert(arg) {
886
+ if(arg) {
887
+ $.facebox({div:'#foo'})
888
+ }
889
+ }
890
+ ```</pre>
891
+ </div>
892
+ <div class="col">
893
+ <p>Or, indent your code 4 spaces</p>
894
+ <pre>
895
+ Here is a Python code example
896
+ without syntax highlighting:
897
+
898
+ def foo:
899
+ if not bar:
900
+ return true</pre>
901
+ </div>
902
+ <div class="col">
903
+ <p>Inline code for comments</p>
904
+ <pre>
905
+ I think you should use an
906
+ `&lt;addr&gt;` element here instead.</pre>
907
+ </div>
908
+ </div>
909
+
910
+ </div>
911
+ </div>
912
+
913
+
914
+ <div id="ajax-error-message">
915
+ <span class="mini-icon mini-icon-exclamation"></span>
916
+ Something went wrong with that request. Please try again.
917
+ <a href="#" class="ajax-error-dismiss">Dismiss</a>
918
+ </div>
919
+
920
+ <div id="logo-popup">
921
+ <h2>Looking for the GitHub logo?</h2>
922
+ <ul>
923
+ <li>
924
+ <h4>GitHub Logo</h4>
925
+ <a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip"><img alt="Github_logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/github_logo.png?1334862345" /></a>
926
+ <a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip" class="minibutton btn-download download">Download</a>
927
+ </li>
928
+ <li>
929
+ <h4>The Octocat</h4>
930
+ <a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip"><img alt="Octocat" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/octocat.png?1334862345" /></a>
931
+ <a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip" class="minibutton btn-download download">Download</a>
932
+ </li>
933
+ </ul>
934
+ </div>
935
+
936
+
937
+
938
+ <span id='server_response_time' data-time='0.11635' data-host='fe13'></span>
939
+ </body>
940
+ </html>
941
+