Skip to content
Newer
Older
100644 558 lines (446 sloc) 20.4 KB
d04cc8a @jrus put in everything else
authored
1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
3 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>
5 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6 <title>Cocoa Text System - Usable Selectors</title>
7 <style type="text/css">
8 /* CSS hacked together by Jacob Rus */
9 body {
10 margin:0;
11 background-color: #ccf;
12 padding-left:5%;
13 padding-top:1.5em;
14 padding-bottom:3em;
15 font-family: "Helvetica", sans-serif;
16 }
17
18 #contents {
19 background-color: #FAFFF2;
20 border: .25em #99C solid;
21 width: 80%;
22 max-width: 40em;
23 min-width: 20em;
24 padding-left:2.5em;
25 padding-right:3em;
26 margin:0;
27 }
28
29 #email{
30 font-size:80%;
31 width: 80%;
32 max-width: 40em;
33 min-width: 20em;
34 padding-top:.5em;
35 padding-left:30%;
36 margin:0;
37 float: left;
38 }
39
40 a:link {
41 color: #45B;
42 }
43
44 h1 {
45 color: #337;
46 margin-left:-.7em;
47 }
48
49 h2 {
50 color: #337;
51 margin-left:-.5em;
52 }
53
54 h3 {
55 color: #337;
56 }
57
58 h4 {
59 color: #337;
60 }
61
62 blockquote {
63 margin-left:2em;
64 }
65
66 pre {
67 margin-left:1.5em;
68 margin-right:-1em;
69 padding: .5em;
70 border: 1px #99C dashed;
71 background-color: #eef;
72 }
73
74 code {
75 font-family: "Monaco", "ProFont", "Bitstream Vera Sans Mono", "Andale Sans Mono", "Consolas", monospace;
76 color: #920;
77 }
78
79 }</style>
80 </head><body>
81 <div id="contents">
82 <h1 id="usable_selectors_for_cocoa_key_bindings">Usable Selectors for Cocoa Key Bindings</h1>
83
84 <p>by Jacob Rus <br />
85 Friday, 17 March 2006</p>
86
87 <p>We can use a very wide variety of selectors in our key bindings. Note, if you
88 find more usable selectors, please let me know about them. Thanks.</p>
89
90 <h2 id="generally_applicable_selectors">Generally-applicable selectors</h2>
91
92 <ul>
93 <li><p><code>cancelOperation:</code> &#8212; &#8220;cancel the current operation.&#8221;</p></li>
94 <li><p><code>showContextHelp:</code> &#8212; &#8220;invoke the help system, displaying information
95 relevant to the receiver and its current state. The sender argument is
96 typically the object that invoked this method.&#8221;</p></li>
97 </ul>
98
99 <h3 id="undo_redo">Undo/redo</h3>
100
101 <ul>
102 <li><code>undo:</code></li>
103 <li><p><code>redo:</code></p></li>
104 <li><p><code>breakUndoCoalescing</code> &#8212; this one sets up an undo state. So if some more
105 text is typed, and then undo is invoked, it will come back to this point.</p></li>
106 </ul>
107
108 <h2 id="text_manipulation">Text manipulation</h2>
109
110 <p>These selectors are for inserting, selecting, deleting, and moving text.</p>
111
112 <h3 id="inserting_text">Inserting text</h3>
113
114 <p>In general, these selectors: &#8220;Insert a &#8230; at the insertion point or selection, deleting the selection if there is one&#8221;</p>
115
116 <ul>
117 <li><p>These two also &#8220;end editing if the receiver is a text field&#8221;</p>
118
119 <ul>
120 <li><code>insertTab:</code></li>
121 <li><code>insertNewline:</code></li>
122 </ul></li>
123 <li><p>These selectors should be used to avoid tabbing out of, for instance, a
124 form field</p>
125
126 <ul>
127 <li><code>insertTabIgnoringFieldEditor:</code></li>
128 <li><code>insertNewlineIgnoringFieldEditor:</code></li>
129 </ul></li>
130 <li><p><code>insertLineBreak:</code></p></li>
131 <li><code>insertParagraphSeparator:</code></li>
132 <li><p><code>insertContainerBreak:</code></p></li>
133 <li><p><code>insertBacktab:</code> &#8212; &#8220;handle a &#8216;backward tab&#8217;&#8221;</p></li>
134 <li><p><code>insertText:</code> &#8212; my favorite selector, &#8220;insert a string at the insertion
135 point or selection, deleting the selection if there is one.&#8221;</p></li>
136 </ul>
137
138 <h3 id="deleting_text">Deleting text</h3>
139
140 <p>This group of selectors simply wipes text off the face of the planet.</p>
141
142 <ul>
143 <li><p><code>delete:</code> &#8212; &#8220;deletes the selected text only&#8221;</p></li>
144 <li><p><code>deleteBackward:</code> </p></li>
145 <li><code>deleteForward:</code></li>
146 <li><code>deleteWordBackward:</code> </li>
147 <li><p><code>deleteWordForward:</code></p></li>
148 <li><p><code>deleteBackwardByDecomposingPreviousCharacter:</code> &#8212; &#8220;If the previous
149 character is canonically decomposable, try to delete only the last
150 character in the grapheme cluster (for example, deleting “a”+ “´” results
151 in “a”)&#8221;</p></li>
152 </ul>
153
154 <h3 id="killing_and_yanking_text">Killing and yanking text</h3>
155
156 <p>These selectors delete text, but also put it onto the kill ring (which means that it can be &#8220;yanked back later&#8221;):</p>
157
158 <ul>
159 <li><code>deleteToBeginningOfLine:</code> </li>
160 <li><p><code>deleteToEndOfLine:</code></p></li>
161 <li><p><code>deleteToBeginningOfParagraph:</code> </p></li>
162 <li><p><code>deleteToEndOfParagraph:</code></p></li>
163 <li><p><code>deleteToMark:</code> &#8212; &#8220;Delete all items from the insertion point to a
164 previously placed mark, including the selection itself if not empty.&#8221;</p></li>
165 </ul>
166
167 <p>This one brings back text:</p>
168
169 <ul>
170 <li><code>yank:</code> &#8212; &#8220;Replaces the insertion point or selection with text from the
171 kill buffer.&#8221;</li>
172 </ul>
173
174 <h3 id="change_the_case_of_the_selected_text">Change the case of the selected text</h3>
175
176 <p>&#8220;change the case of a letter or letters in the selection, perhaps by opening a panel with capitalization options or by cycling through possible case combinations.&#8221;</p>
177
178 <ul>
179 <li><code>changeCaseOfLetter:</code></li>
180 </ul>
181
182 <p>&#8220;set the case of the word or words surrounding the insertion point or
183 selection, expanding the selection if necessary&#8221;</p>
184
185 <ul>
186 <li><code>lowercaseWord:</code></li>
187 <li><code>uppercaseWord:</code></li>
188 <li><code>capitalizeWord:</code></li>
189 </ul>
190
191 <h3 id="moving_the_insertion_point">Moving the insertion point</h3>
192
193 <p>&#8220;move the selection or insertion point one element or character&#8221;</p>
194
195 <ul>
196 <li><code>moveBackward:</code> </li>
197 <li><code>moveForward:</code></li>
198 <li><code>moveLeft:</code> </li>
199 <li><code>moveRight:</code></li>
200 <li><code>moveUp:</code></li>
201 <li><code>moveDown:</code></li>
202 </ul>
203
204 <p>&#8220;move the selection or insertion point one word&#8230;&#8221;</p>
205
206 <ul>
207 <li><code>moveWordBackward:</code></li>
208 <li><code>moveWordForward:</code></li>
209 <li><code>moveWordLeft:</code></li>
210 <li><code>moveWordRight:</code></li>
211 </ul>
212
213 <p>&#8220;move the selection to&#8230; or the insertion point to&#8230;&#8221;</p>
214
215 <ul>
216 <li><code>moveToBeginningOfLine:</code></li>
217 <li><code>moveToEndOfLine:</code></li>
218 <li><code>moveToBeginningOfParagraph:</code></li>
219 <li><code>moveToEndOfParagraph:</code></li>
220 <li><code>moveToBeginningOfDocument:</code></li>
221 <li><code>moveToEndOfDocument:</code></li>
222 </ul>
223
224 <p>&#8220;scroll the receiver&#8230; one page in its scroll view, also moving the insertion
225 point to the top of the newly displayed page.&#8221;</p>
226
227 <ul>
228 <li><code>pageUp:</code></li>
229 <li><code>pageDown:</code></li>
230 </ul>
231
232 <h3 id="scroll_the_text_view">Scroll the text view</h3>
233
234 <p>&#8220;scroll the receiver&#8230; in its scroll view, without changing the selection&#8221;</p>
235
236 <ul>
237 <li><code>scrollLineUp:</code></li>
238 <li><code>scrollLineDown:</code></li>
239 <li><code>scrollPageUp:</code></li>
240 <li><code>scrollPageDown:</code></li>
241 </ul>
242
243 <p>&#8220;scroll the selection, whatever it is, inside its visible area.&#8221;</p>
244
245 <ul>
246 <li><code>centerSelectionInVisibleArea:</code></li>
247 </ul>
248
249 <h3 id="move_the_insertion_point_and_modify_the_selection">Move the insertion point and modify the selection</h3>
250
251 <p>&#8220;expand or reduce either end of the selection by one element or character&#8221;</p>
252
253 <ul>
254 <li><code>moveBackwardAndModifySelection:</code></li>
255 <li><code>moveForwardAndModifySelection:</code></li>
256 <li><code>moveLeftAndModifySelection:</code></li>
257 <li><code>moveRightAndModifySelection:</code></li>
258 <li><code>moveUpAndModifySelection:</code></li>
259 <li><code>moveDownAndModifySelection:</code></li>
260 </ul>
261
262 <p>&#8220;expand or reduce either end of the selection&#8230; by one whole word&#8221;</p>
263
264 <ul>
265 <li><code>moveWordBackwardAndModifySelection:</code></li>
266 <li><code>moveWordForwardAndModifySelection:</code></li>
267 <li><code>moveWordLeftAndModifySelection:</code></li>
268 <li><code>moveWordRightAndModifySelection:</code></li>
269 </ul>
270
271 <p>Apparently some of the options are undocumented, but work just fine</p>
272
273 <ul>
274 <li><code>moveToBeginningOfDocumentAndModifySelection:</code></li>
275 <li><code>moveToEndOfDocumentAndModifySelection:</code></li>
276 <li><code>moveToBeginningOfLineAndModifySelection:</code></li>
277 <li><code>moveToEndOfLineAndModifySelection:</code></li>
278 <li><code>moveToBeginningOfParagraphAndModifySelection:</code></li>
279 <li><code>moveToEndOfParagraphAndModifySelection:</code></li>
280 <li><code>pageUpAndModifySelection:</code></li>
281 <li><code>pageDownAndModifySelection:</code></li>
282 </ul>
283
284 <h3 id="select_text">Select text</h3>
285
286 <p>&#8220;select&#8230;&#8221;</p>
287
288 <ul>
289 <li><code>selectAll:</code></li>
290 <li><code>selectLine:</code></li>
291 <li><code>selectParagraph:</code></li>
292 <li><code>selectWord:</code> &#8212; &#8220;extend the selection to the nearest word boundaries
293 outside it (up to, but not including, word delimiters).&#8221;</li>
294 <li><code>selectToMark:</code> &#8212; &#8220;select all items from the insertion point or selection
295 to a previously placed mark, including the selection itself if not empty.&#8221;</li>
296 </ul>
297
298 <h3 id="working_with_marks">Working with marks</h3>
299
300 <ul>
301 <li><p><code>setMark:</code> &#8212; &#8220;set a mark at the insertion point or selection, which is
302 used by deleteToMark: and selectToMark:&#8221;</p></li>
303 <li><p><code>swapWithMark:</code> &#8212; &#8220;swap the mark and the selection or insertion point, so
304 that what was marked is now the selection or insertion point, and what was
305 the insertion point or selection is now the mark.&#8221;</p></li>
306 <li><p><code>selectToMark:</code> &#8212; &#8220;select all items from the insertion point or selection
307 to a previously placed mark, including the selection itself if not empty.&#8221;</p></li>
308 <li><p><code>deleteToMark:</code> &#8212; &#8220;delete all items from the insertion point to a
309 previously placed mark, including the selection itself if not empty.&#8221;</p></li>
310 </ul>
311
312 <h3 id="other_text_editing_options">Other text editing options</h3>
313
314 <ul>
315 <li><p><code>complete:</code> &#8212; &#8220;complete an operation in progress or a partially
316 constructed element.&#8221;</p></li>
317 <li><p><code>indent:</code> &#8212; &#8220;indent the selection or the insertion point if there is no
318 selection.&#8221;</p></li>
319 <li><p><code>transpose:</code> &#8212; &#8220;Transposes the characters to either side of the insertion
320 point and advances the insertion point past both of them. Does nothing to
321 a selected range of text.&#8221;</p></li>
322 <li><p><code>transposeWords:</code> &#8212; &#8220;Transposes the words to either side of the insertion
323 point and advances the insertion point past both of them. Does nothing to
324 a selected range of text.&#8221;</p></li>
325 </ul>
326
327 <h3 id="cut_copy_paste">Cut/Copy/Paste</h3>
328
329 <ul>
330 <li><p><code>copy:</code> &#8212; &#8220;copies the selected text onto the general pasteboard, in as
331 many formats as the receiver supports.&#8221;</p></li>
332 <li><p><code>cut:</code> &#8212; &#8220;deletes the selected text and places it onto the general
333 pasteboard, in as many formats as the receiver supports.&#8221;</p></li>
334 <li><p><code>paste:</code> &#8212; &#8220;pastes text from the general pasteboard at the insertion
335 point or over the selection.&#8221;</p></li>
336 <li><p><code>pasteAsPlainText:</code> &#8212; &#8220;inserts the contents of the pasteboard into the
337 receiver’s text as plain text, in the manner of insertText:.&#8221;</p></li>
338 <li><p><code>pasteAsRichText:</code> &#8212; &#8220;inserts the contents of the pasteboard into the
339 receiver’s text as rich text, maintaining its attributes.&#8221;</p></li>
340 <li><p>Copy/paste fonts:</p>
341
342 <ul>
343 <li><p><code>copyFont:</code> &#8212; &#8220;copies the font information for the first character of
344 the selection (or for the insertion point) onto the font pasteboard,
345 as NSFontPboardType.&#8221;</p></li>
346 <li><p><code>pasteFont:</code> &#8212; &#8220;pastes font information from the font pasteboard onto
347 the selected text or insertion point of a rich text object, or over
348 all text of a plain text object.&#8221;</p></li>
349 </ul></li>
350 <li><p>Copy/paste ruler:</p>
351
352 <ul>
353 <li><p><code>copyRuler:</code> &#8212; &#8220;copies the paragraph style information for first
354 selected paragraph onto the ruler pasteboard, as NSRulerPboardType,
355 and expands the selection to paragraph boundaries.&#8221;</p></li>
356 <li><p><code>pasteRuler:</code> &#8212; &#8220;pastes paragraph style information from the ruler
357 pasteboard onto the selected paragraphs of a rich text object.&#8221;</p></li>
358 </ul></li>
359 </ul>
360
361 <h2 id="text_styles_and_formatting_mostly_applies_to_rich_text">Text Styles and formatting (mostly applies to rich text)</h2>
362
363 <h3 id="set_the_text_alignment">Set the text alignment</h3>
364
365 <p>&#8220;applies &#8230; alignment to selected paragraphs (or all text if the receiver is
366 a plain text object)&#8221;</p>
367
368 <ul>
369 <li><code>alignCenter:</code></li>
370 <li><code>alignLeft:</code></li>
371 <li><code>alignRight:</code></li>
372 <li><code>alignJustified:</code></li>
373 </ul>
374
375 <p>&#8220;changes the base writing direction of a paragraph, for languages like Hebrew
376 and Arabic, for example.&#8221;</p>
377
378 <ul>
379 <li><code>toggleBaseWritingDirection:</code></li>
380 <li><code>changeBaseWritingDirectionToRTL:</code></li>
381 <li><code>changeBaseWritingDirectionToLTR:</code></li>
382 </ul>
383
384 <h3 id="superscript_subscript">Superscript/subscript</h3>
385
386 <ul>
387 <li><p><code>superscript:</code> &#8212; &#8220;applies a superscript attribute to selected text (or
388 all text if the receiver is a plain text object), raising its baseline
389 offset by a predefined amount.&#8221;</p></li>
390 <li><p><code>subscript:</code> &#8212; &#8220;applies a subscript attribute to selected text (or all
391 text if the receiver is a plain text object), lowering its baseline offset
392 by a predefined amount.&#8221;</p></li>
393 <li><p><code>unscript:</code> &#8212; &#8220;removes any superscripting or subscripting from selected
394 text (or all text if the receiver is a plain text object).&#8221;</p></li>
395 </ul>
396
397 <h3 id="underline_outline">Underline/outline</h3>
398
399 <ul>
400 <li><p><code>underline:</code> &#8212; &#8220;underlines selected text for a rich text object, or all
401 text for a plain text object.&#8221;</p></li>
402 <li><p><code>outline:</code></p></li>
403 </ul>
404
405 <h3 id="baseline_kerning_ligatures">Baseline, kerning, ligatures</h3>
406
407 <p>Set the baseline of the text.</p>
408
409 <ul>
410 <li><p><code>lowerBaseline:</code> &#8212; &#8220;lowers the baseline offset of selected text by 1 point,
411 or of all text if the receiver is a plain text view.&#8221;</p></li>
412 <li><p><code>raiseBaseline:</code> &#8212; &#8220;raises the baseline offset of selected text by 1 point,
413 or of all text if the receiver is a plain text view.&#8221;</p></li>
414 </ul>
415
416 <p>Set the kerning to be used for the text.</p>
417
418 <ul>
419 <li><p><code>useStandardKerning:</code> &#8212; &#8220;cause the receiver to use pair kerning data for
420 the glyphs in its selection, or for all glyphs if the receiver is a plain
421 text view.&#8221;</p></li>
422 <li><p><code>turnOffKerning:</code> &#8212; &#8220;cause the receiver to use nominal glyph spacing for
423 the glyphs in its selection, or for all glyphs if the receiver is a plain
424 text view.&#8221;</p></li>
425 <li><p><code>loosenKerning:</code> &#8212; &#8220;increase the space between glyphs in the receiver’s
426 selection, or in all text if the receiver is a plain text view.&#8221;</p></li>
427 <li><p><code>tightenKerning:</code> &#8212; &#8220;decrease the space between glyphs in the receiver’s
428 selection, or for all glyphs if the receiver is a plain text view.&#8221;</p></li>
429 </ul>
430
431 <p>Tell the selection whether to use standard ligatures, or all ligatures.</p>
432
433 <ul>
434 <li><p><code>useStandardLigatures:</code> &#8212; &#8220;cause the receiver to use the standard
435 ligatures available for the fonts and languages used when setting text,
436 for the glyphs in the selection if the receiver is a rich text view, or
437 for all glyphs if it’s a plain text view.&#8221;</p></li>
438 <li><p><code>turnOffLigatures:</code> &#8212; &#8220;cause the receiver to use only required ligatures
439 when setting text, for the glyphs in the selection if the receiver is a
440 rich text view, or for all glyphs if it’s a plain text view.&#8221;</p></li>
441 <li><p><code>useAllLigatures:</code> &#8212; &#8220;cause the receiver to use all ligatures available
442 for the fonts and languages used when setting text, for the glyphs in the
443 selection if the receiver is a rich text view, or for all glyphs if it’s a
444 plain text view.&#8221;</p></li>
445 <li><p><code>toggleTraditionalCharacterShape:</code> &#8212; &#8220;toggle the
446 NSCharacterShapeAttibuteName attribute at the current selection.&#8221;</p></li>
447 </ul>
448
449 <h3 id="open_up_useful_panels_for_text_formatting">Open up useful panels for text formatting</h3>
450
451 <ul>
452 <li><p><code>orderFrontLinkPanel:</code> &#8212; &#8220;bring forward a panel allowing the user to
453 manipulate links in the text view.&#8221;</p></li>
454 <li><p><code>orderFrontListPanel:</code> &#8212; &#8220;bring forward a panel allowing the user to
455 manipulate text lists in the text view.&#8221;</p></li>
456 <li><p><code>orderFrontSpacingPanel:</code> &#8212; &#8220;bring forward a panel allowing the user to
457 manipulate text line heights, interline spacing, and paragraph spacing, in
458 the text view.</p></li>
459 <li><p><code>orderFrontTablePanel:</code> &#8212; &#8220;bring forward a panel allowing the user to
460 manipulate text tables in the text view.&#8221;</p></li>
461 </ul>
462
463 <h2 id="spelling_and_speech">Spelling and speech</h2>
464
465 <p>Check the spelling of the text view:</p>
466
467 <ul>
468 <li><p><code>toggleContinuousSpellChecking:</code> &#8212; &#8220;toggle whether continuous spell
469 checking is enabled for the receiver.&#8221;</p></li>
470 <li><p>Perform spell checking. If I remember, the first one of these simply
471 selects a misspelled word. The second one opens the spelling panel, and
472 the third one tells the spelling system to ignore the selected word. I&#8217;m
473 not positive of that however.</p>
474
475 <ul>
476 <li><p><code>checkSpelling:</code> &#8212; &#8220;search for a misspelled word in the receiver’s
477 text.&#8221;</p></li>
478 <li><p><code>showGuessPanel:</code> &#8212; &#8220;open the Spelling panel, allowing the user to
479 make a correction during spell checking.&#8221;</p></li>
480 <li><p><code>ignoreSpelling:</code></p></li>
481 </ul></li>
482 </ul>
483
484 <p>OS X Speech synthesis:</p>
485
486 <ul>
487 <li><p><code>startSpeaking:</code> &#8212; &#8220;speak the selected text, or all text if no
488 selection.&#8221;</p></li>
489 <li><p><code>stopSpeaking:</code> &#8212; &#8220;stop the speaking of text.&#8221;</p></li>
490 </ul>
491
492 <h2 id="window_and_document_options">Window and document options</h2>
493
494 <h3 id="printing">Printing</h3>
495
496 <ul>
497 <li><p><code>printDocument:</code> &#8212; &#8220;bring up print sheet&#8221;</p></li>
498 <li><p><code>runPageLayout:</code> &#8212; the same thing happens as when the user chooses the
499 Page Setup menu command.</p></li>
500 </ul>
501
502 <h3 id="closing_saving_reverting_documents">Closing, saving, reverting documents</h3>
503
504 <p>These do the same as the menu options of the same name:</p>
505
506 <ul>
507 <li><p><code>save:</code></p></li>
508 <li><p><code>saveAs:</code></p></li>
509 <li><p><code>saveTo:</code></p></li>
510 <li><p><code>revert:</code></p></li>
511 <li><p><code>performClose:</code> &#8212; &#8220;simulate the user clicking the close button by
512 momentarily highlighting the button and then closing the window.&#8221;</p></li>
513 </ul>
514
515 <!--
516
517 * `new:`
518
519 * `openDocument:`
520
521 * `saveAllDocuments:`
522
523 * `clearRecentDocuments:` - "empty the recent documents list for the
524 application."
525 -->
526
527 <h3 id="window_manipulations">Window manipulations</h3>
528
529 <p>These three simulate clicking the little gem buttons in the top left corner of
530 the window. Note that <code>close:</code>, etc. are also usable selectors, but not
531 advisable, as they act slightly differently. Most importantly, <code>close:</code>
532 doesn&#8217;t prompt the user to save changes to unsaved documents, so data loss is
533 possible if it is used:</p>
534
535 <ul>
536 <li><code>performClose:</code></li>
537 <li><code>performMiniaturize:</code></li>
538 <li><code>performZoom:</code></li>
539 </ul>
540
541 <p>These change window ordering or position:</p>
542
543 <ul>
544 <li><p><code>center</code> &#8212; &#8220;set the window’s location to the center of the screen.&#8221;</p></li>
545 <li><p><code>orderBack:</code> &#8212; move the window behind all the other windows, without
546 changing either the key window or the main window.</p></li>
547 <li><p><code>orderFront:</code> &#8212; move the window in front of all the other windows,
548 without changing either the key window or the main window.</p></li>
549 </ul>
550
551 <p>This one hides the application:</p>
552
553 <ul>
554 <li><code>hide:</code> &#8212; &#8220;Hide all the application’s windows, and the next application
555 in line is activated.&#8221;</li>
556 </ul>
557 </div>
558 <div id="email">Anything I can improve? Send me an email: jacobolus AT gmail</div></body></html>
Something went wrong with that request. Please try again.