First Monday

Free Source as Free Thought: Architecting Free Standards

As we build cyberspace, it is up to us, as individuals, not to promote illiteracy and proprietary standards that shut out those who fail to purchase computer programs from a specific vendor. It has become fashionable to blame others, such as Microsoft, for creating what is known as the "dark ages of computing". However, I suggest that we can and should look to ourselves as the source of the problem. In this article, I propose the "public park" analogy as a first point of departure from current critical thinking, and as a framework with which to better understand possible conflict of interest in government and education. Moreover, in the age of Personal Cybernetics (personal electronics, wearable computing,, etc.), this issue will become all the more important. When "technology as extensions of mind and body" is no longer a metaphor, will we have already sold our heart and soul for software of a particular corporation, or will our thoughts be free?


Public Schools
The Right Way to Pay Taxes
Applying for a Grant Proposal
Conclusion: Selling our Souls for Software


Amid the recent U.S. Department of Justice versus Microsoft battle, now is as good a time as any to reflect on the issue of public space [1].

Rather than point an accusing finger at Microsoft, perhaps we should look to ourselves as the source of blame.

By adopting "standards" that require the purchase of a particular brand of software, we have ourselves created a monopoly situation.

Imagine, if you will, a specially constructed public park, specially designed and fenced in, so that its gates would only open to those wearing Levi's brand blue jeans. Those wearing clothes manufactured by other vendors would not be allowed into the park. And those who made their own clothes, whether by their own loom, or from cloth they purchased themselves, would also be denied access to this public park. Handicapped individuals who needed to modify their clothing, e.g. someone with a broken leg in a cast who cut a slit into one pant leg, would also be denied access to the park. Now these people who are denied access to this park have still paid taxes. They've funded the construction of the park, and they pay for its maintenance, but they cannot use the park because they have not purchased Levi's brand blue jeans. Or in the case of the handicapped individuals, access is denied because they've reverse-engineered or modified their Levi's jeans, making them incompatible with the software running on the park's gates.

Such a situation sounds ludicrous, or disturbing at best, but that's essentially the current state of many "public" U.S. government-run Web sites. For example, I recently visited a Web site to obtain forms for starting a business, and these forms appear to require that I purchase special software. Even the government-operated Web site from which I obtained forms for application to a government sponsored research program provides the forms only in a proprietary format for which special software needs to be purchased to fill out the forms.

Applying for a U.S. Patent? Well then you'll need to purchase a copy of acroexch (Adobe Acrobat Exchange) to fill out the forms, since they're in the proprietary Adobe Acrobat format.

If you're visually challenged, you can forget about entering this so-called public space, even though you may have paid taxes to built it.

Many visually challenged computer users build their own special computers and write their own software, often coming up with innovative ways to "surf the Web", like running the output of lynx through a text to speech converter, or designing a custom Web browser that eliminates headache-inducing frames and reorganizes pages, filtering content and outputting with large font sizes.

Instead of attacking software vendors, we need to look to ourselves as the source of blame. We need to require our governments to make our public spaces accessible to all of us. Specifically any government Web page should be required to provide all electronic forms and documents in file formats accessible to all, using standards that are fully disclosed.

We should simply begin by requiring ourselves, and by extension, those we have elected to govern us, to use only formats for which there exist a scientific basis of total disclosure, and which can be read, written, and worked on with freely obtainable and fully disclosed (in source form) software.

By extension, our publicly funded institutes, such as universities, as well as organizations doing publicly funded work, could be required to use file formats and other standards that are in the public domain.

It would only be fair that our tax dollars go toward building public spaces that all of us can access, and public fora in which all of us can participate.

Such accessibility, in and of itself, would go a long way toward making the corporate world more open. By adopting open standards in our public spaces, the corporate world would likely follow. This may well go much further toward solving the monopoly of some software in the marketplace.


In response to my early drafts of this article, the following analogy was proposed:

  The government requires you to fill out a form. they send you a piece of
  paper to fill in (document file)... You try writing on it with pens and
  pencils but nothing works. you are required to buy a special pen 
  (software)... After paying for the pen and trying it out you discover that
  it won't work unless you buy a special desk to write on (computer)...
   ---Josh Mayo. Ballina NSW, Australia.

Now, as a matter of reversalism, perhaps we should fill out forms in such a way that the government can't read them unless the government purchases a special software package from each of us. We could do this very easily by encrypting our forms, and then selling the government the keys to decrypt each form we send. Perhaps we could submit our tax forms this way.

Public Schools

It takes some effort to learn how to read and write, to learn basic mathematics, and to master various trades that might, for example, involve learning how to use specialized machinery.

Why should a computer be any different? It seems that there are various companies trying to sell a "user friendly" vision of computers - to create a computing environment where the user doesn't need to think.

We could say the same thing about learning how to read and write. Instead of literacy, we could simply have talking signs everywhere, and multimedia televised bookware. The Internet could replace television, and books as well. If everyone wore a "user friendly" computer, the computer could even read signs to us, so we'd never have to learn how to read. Just point and click! Unless you're a software "developer".

There's something seriously wrong with this vision. It's a bit like having only a few elite individuals with the ability to read and write, and keeping everyone else illiterate. Why not plant the seeds for everyone to contribute to humankind's knowledge? It is this distinction between "developer" and end user - this notion of a "software development kit", that needs to be put to rest.

When our public schools adopt proprietary "user friendly" computers, which are tied to a particular commercial vendor, we're tying our children's education to proprietary standards.

Imagine that instead of teaching children how to read and write, we teach them only how to understand the world through some specific brand of language interpreter, in which the language would change over time, so that those taught this system would become dependent on commercially sold updates. In some ways this is like a drug dependency, e.g. something needed in order to function.

In the coming era of personal cybernetics, we will need to learn a new set of basic skills. If all we learn is how to put on our "user friendly" eyeglasses, pre-loaded with advertisements, and multimedia spectacles, we may simply become addicted to a mind-numbing thought-free existence.

The Right Way to Pay Taxes

Richard Stallman, wrote in the February 1997 issue of the Communications of the ACM (volume 40, number 2) on "The Right to Read", about the right to access of knowledge.

Is there a right to pay taxes?

I did a Web search on electronic tax filing, and found a government site,, that explains how to file tax electronically. There are ten links from this page, and nine of them are to corporate Web sites with .com domains. Nine out of ten links to corporate Web sites, such as the Quicken TaxCenter. Even links like TaxWeb, and "State Tax Links" are corporate sites. One of the sites, entitled "Electronic Filing FAQ", which I must assume is the government's definitive electronic filing reference since that appears to be their only link on the subject, states:

   ...prepare a tax return using a
   personal computer and transmit the electronic image of the tax return
   to an IRS approved transmitter.

   Tax returns can be transmitted to the IRS only by approved
   If you are transmitting from your PC to an IRS
   approved transmitter, you are paying for the software that permitted
   you to perform this function.  The IRS itself does not charge a fee to
   receive a tax return electronically.
   Aproved IRS transmitters can purchase software from a variety of
   vendors to transmit tax returns directly to IRS computers.
   You are permitted to purchase commercial software that forwards your
   tax return, and the returns of immediate household members, to an IRS
   approved transmitter.

You can purchase software to file your tax return. In order to run the software you purchase, you also need to purchase the operating system that the tax software was written to run on.

If you're a self-made individual (e.g. running a computer you designed and built yourself with an operating system you wrote yourself), you're denied access to this public space on the Internet - the public space of paying taxes.

Why can't the government provide the forms in formats that are freely obtainable by everyone, such as GNUX (GNU + Linux)-compatible formats like LaTeX, TeX, HTML, or the like? Or alternatively just make ascii text submission acceptable, since there's no real compelling need for individuals to include plots, graphs, and integral or summation signs, or any complicated mathematical symbols in their tax returns. A straightforward ascii text e-mail submission with a PGP signature might be quite sufficient.

Applying for a Grant Proposal

Let's take a look at another example of Internet public space. Since we can't give the government money without buying special software, perhaps we can ask the U.S. government for funds. So let's take a look at the National Science Foundation (NSF), as a typical example of public space.

On the NSF Web site, forms are available in two formats:

  Available Formats

          NSF forms are available in the following electronic formats:

         1. Microsoft Word 6.0 for Windows
         2. PostScript
  Which Format Should You Use?

          If you have Microsoft Word version 6.0, then you should use the
          Word formats. They are designed so that you can easily "fill in
          the blanks."

          If you cannot use these word processing formats, you _may_ find
          the PostScript formats useful, although, in general, they
          demand more computer expertise on your part. You can print
          blank forms by sending the PostScript files to a PostScript
          printer, but if you want to "fill in" the form, you'll need an
          ASCII editor to make changes to the PostScript files.
          Instructions for making these changes are included as comments
          in the files.

So the quick answer is use Microsoft Word 6.0 for Windows, or edit the PostScript file by hand. Now editing the PostScript file by hand wouldn't be so bad, if it had been written by hand. Editing PostScript files by hand is a bit like editing a program written in assembly language. PostScript is the language of the printer, in much the same way that assembly language is the language of the assembler - only one step removed from the machine instructions ("machine language") of the computer.

But when I take a look at the PostScript file, I can see that it's not likely written by hand. It looks more like the output of Microsoft Word, poorly written and somewhat obfuscated PostScript. Editing this PostScript file is a bit like editing an executable task image output from a very bad compiler, and not at all like editing a program written carefully in assembly language.

For example, in the form there is space to enter "Gender". Yet a simple UNIX/GNUX command like "grep -i gender" returns nothing. Many of the words are all broken up letter by letter, making the form difficult to read.

The PostScript follows below, in Appendix A. I welcome any NSF representative to step forward and explain how to follow the instructions regarding the use of "an ASCII editor to make changes to the PostScript files". It would also be useful to point out the location of the "Instructions for making these changes are included as comments in the files", within the more than thirty thousand lines of PostScript code that are provided on the first page, and within more than ten thousand lines of PostScript code provided on at least the two subsequent pages, for those who do not use Microsoft Word 6.0 for Windows.

Upon further investigation, I discovered that in previous years, NSF PostScript was somewhat well written, and not too difficult to edit by hand (roughly only ten thousand lines of PostScript instructions total). More recently, it has gotten much worse. In addition to being much longer, text strings are broken up substantially, and there doesn't appear to be any useful comments to assist the applicant.

An important difference:


(the above is for the original), and

%%Title: Microsoft Word - 99form1207.doc

(the above is for the more recent).

By the way, I tried to get more information from, but:

bash$ finger
[]connect: Connection timed out
bash$ ping nsf.govemail 
no answer from

Excerpt from NSF grant application form created in 1991:

%%CreationDate:  1991
%%For: NSF
%%Title: NSF Forms
%%BoundingBox: 0 0 612 792
%%DocumentNeededResources: font Helvetica
%%+ font Helvetica-Bold
%%+ font Times-Bold
%%DocumentSuppliedResources: procset eps 1.00 0
%%Pages: 1
%%PageOrder: Ascend
%%Orientation: Portrait

%               HOW TO USE THIS FILE
% This is an "NSF-style Smart Form" file.  It contains printer
% instructions (in the PostScript language) to place data (that you enter
% below) in the correct areas on the printed form, that is, it will "fill
% in" the form with the data you enter.  
% Draw the lines.  First the horizontal line then the vertical lines.
% Start from the top and work down.
0.8 setlinewidth

0.0 cm 21.2 cm width hLine
0.0 cm 10.2 cm width hLine
0.0 cm  6.4 cm width hLine
0.0 cm 5.35 cm width hLine

/FontHeight 12.5 def HB setfont
Indent width add 2 div height 0.3 cm add

/FontHeight 9.3 def H setfont
/startx Indent def      /starty height 0 cm sub def 
/LS startx def     /RS  width 0.30 cm sub  def 
startx starty moveto
(Submit only ONE copy of this form with your proposal. Attach it on top of the cover page of the copy of your proposal) nextLineJustify

/RS  10.70 cm  def 
(that bears the original signatures.  Leave the back of the page blank.) nextLineJustify
/FontHeight 9.3 def HO setfont
/LS 10.70 cm  def     /RS  width 0.30 cm sub  def 
(  Do not include this form with any of the other) justifyText
/starty starty 0.20 cm add
(copies of your proposal, as this may compromise the) nextLine
( confidentiality of the information.) show
/FontHeight 9.3 def H setfont

/starty 23.35 cm def
/LS startx def     /RS  width 0.30 cm sub  def 
(Please check the appropriate answers to each question for all principal investigator(s)/project director(s) listed on the) nextLineJustify
(cover page, using the same order in which they were listed there:)

The following is an excerpt from a NSF grant application form created in 1998. I wonder if there is a staff member of NSF who can follow their own advice and meaningfully edit this file using an ASCII text editor):

%%Title: Microsoft Word - 99form1207.doc
%%Creator: ADOBEPS4.DRV Version 4.10
%%CreationDate: 10/08/98 16:06:42
%%For: quest
%%BoundingBox: 12 15 599 782 
%%Pages: (atend)
%%PageOrder: Ascending
%%DocumentNeededFonts: (atend)
%%DocumentSuppliedFonts: (atend)
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%ViewingOrientation: 1 0 0 1

%%BeginFeature: *JobPatchFile 2
/filterLineCapBugCTM where {pop false} {true} ifelse
statusdict begin version cvi 2014 eq revision 1.1 lt end and and
{ userdict begin
 /sysdictSc systemdict /scale get def
 /sysdictSa systemdict /setstrokeadjust get def
 /sysdictLc systemdict /setlinecap get def
 /sysdictIm systemdict /initmatrix get def
 /sysdictCc systemdict /concat get def
 /sysdictSm systemdict /setmatrix get def
 /filterLineCapBugCTM matrix def
 /filterLCBCTM {
	currentstrokeadjust currentlinecap 2 eq and
		filterLineCapBugCTM currentmatrix
		dup dup 0 get abs exch 3 get abs ne
		exch dup 1 get abs exch 2 get abs ne or
		{1 sysdictLc} if
	} if
 } bind def
 /scale {sysdictSc filterLCBCTM} bind def
 /setlinecap {sysdictLc filterLCBCTM} bind def
 /setstrokeadjust {sysdictSa filterLCBCTM} bind def
 /initmatrix {sysdictIm filterLCBCTM} bind def
 /concat {sysdictCc filterLCBCTM} bind def
 /setmatrix {sysdictSm filterLCBCTM} bind def
/sysdictSc /sysdictSa /sysdictLc
/sysdictIm /sysdictCc /sysdictSm
6 {userdict exch undef} repeat
} if 
} stopped cleartomark
%%BeginProcSet: AdobePS_Win_ErrorHandler 4.1 0
/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop
false setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type
/stringtype ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def
currentpoint/toy exch def/tox exch def 1 setgray newpath tox toy 2 sub moveto
0 ty rlineto tx 0 rlineto 0 ty neg rlineto closepath fill tox toy moveto 0
setgray show}bind def/nl{currentpoint exch pop lmargin exch moveto 0 -10
rmoveto}def/=={/cp 0 def typeprint nl}def/typeprint{dup type exec}readonly def
/lmargin 72 def/rmargin 72 def/tprint{dup length cp add rmargin gt{nl/cp 0 def
}if dup length cp add/cp exch def prnt}readonly def/cvsprint{=string cvs
tprint( )tprint}readonly def/integertype{cvsprint}readonly def/realtype{
cvsprint}readonly def/booleantype{cvsprint}readonly def/operatortype{(--)
tprint =string cvs tprint(-- )tprint}readonly def/marktype{pop(-mark- )tprint}
readonly def/dicttype{pop(-dictionary- )tprint}readonly def/nulltype{pop
(-null- )tprint}readonly def/filetype{pop(-filestream- )tprint}readonly def
/savetype{pop(-savelevel- )tprint}readonly def/fonttype{pop(-fontid- )tprint}
readonly def/nametype{dup xcheck not{(/)tprint}if cvsprint}readonly def
/stringtype{dup rcheck{(\()tprint tprint(\))tprint}{pop(-string- )tprint}
ifelse}readonly def/arraytype{dup rcheck{dup xcheck{({)tprint{typeprint}forall
(})tprint}{([)tprint{typeprint}forall(])tprint}ifelse}{pop(-array- )tprint}
ifelse}readonly def/packedarraytype{dup rcheck{dup xcheck{({)tprint{typeprint}
(-packedarray- )tprint}ifelse}readonly def/courier/Courier findfont 10
scalefont def end errordict/handleerror{systemdict begin $error begin $brkpage
begin newerror{/newerror false store vmstatus pop pop 0 ne{grestoreall}if
showpage initgraphics courier setfont lmargin 720 moveto(ERROR: )prnt
errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt $error/ostack
known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==}repeat}if
systemdict/showpage get exec(%%[ Error: )print errorname =print
(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}
dup 0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where
{pop/setpacking where{pop oldpack setpacking}if}if
%%BeginProcSet: AdobePS_Res_Emul 4.1 0
/defineresource where{pop}{userdict begin/defineresource{userdict/Resources 2
copy known{get begin}{15 dict dup begin put}ifelse exch readonly exch
currentdict 1 index known not{dup 30 dict def}if load 3 -1 roll 2 index put
end}bind readonly def/findresource{userdict/Resources get exch get exch get}
bind readonly def/resourceforall{pop pop pop pop}bind readonly def
/resourcestatus{userdict/Resources 2 copy known{get exch 2 copy known{get exch
known{0 -1 true}{pop pop false}ifelse}{pop pop pop false}ifelse}{pop pop false
}ifelse}bind readonly def end}ifelse
%%BeginResource: procset AdobePS_Win_Driver 2.0 0
/AdobePS_Win_Driver 250 dict dup begin
%%BeginResource: file AdobePS_FatalError 4.1 0
/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div
cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def
/VM? {vmstatus exch sub exch pop gt { [
(This job requires more memory than is available in this printer.) 100 500
(Try one or more of the following, and then print again:) 100 485
(In the PostScript dialog box, click Optimize For Portability.) 115 470
(In the Device Options dialog box, make sure the Available Printer Memory is accurate.) 115 455
(Reduce the number of fonts in the document.) 115 440
(Print the document in parts.) 115 425
12 /Times-Roman showpage
(%%[ PrinterError: Low Printer VM ]%%) =
true FatalErrorIf}if} bind def
%%BeginResource: file AdobePS_Win_Utils 4.1 0
/|/def load def/,/load load |/~/exch , |/?/ifelse , |/!/pop , |/`/begin , |/^
/index , |/@/dup , |/+/translate , |/$/roll , |/U/userdict , |/M/moveto , |/-
/rlineto , |/&/currentdict , |/:/gsave , |/;/grestore , |/F/false , |/T/true ,
|/N/newpath , |/E/end , |/Ac/arc , |/An/arcn , |/A/ashow , |/D/awidthshow , |
/C/closepath , |/V/div , |/O/eofill , |/L/fill , |/I/lineto , |/-C/rcurveto ,
|/-M/rmoveto , |/+S/scale , |/Ji/setfont , |/Lc/setlinecap , |/Lj/setlinejoin
, |/Lw/setlinewidth , |/S/show , |/LH/showpage , |/K/stroke , |/W/widthshow ,
|/R/rotate , |/b{bind |}bind |/bd{bind |}bind |/xd{~ |}bd/ld{, |}bd/lw/Lw ld
/lc/Lc ld/lj/Lj ld/sg/setgray ld/L2? F/languagelevel where{! languagelevel 2
ge{! T}if}if |/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b
/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !
}b/self & |/reinitialize{[/TextInit/GraphInit/UtilsInit counttomark{@ where{
self eq}{F}?{cvx exec}{!}?}repeat cleartomark}b/initialize{`{/ADO_mxRot ~ |
/TextInitialised? F | reinitialize E}{U/Pscript_Win_Data 230 dict @ ` put
/ADO_mxRot ~ |/TextInitialised? F | reinitialize}?}b/terminate{!{& self eq{
exit}{E}?}loop E}b/suspend/terminate , |/resume{` Pscript_Win_Data `}b/snap{
transform 0.25 sub round 0.25 add ~ 0.25 sub round 0.25 add ~ itransform}b
/dsnap{dtransform round ~ round ~ idtransform}b U<04>cvn{}put/setjn{{
statusdict/jobname known{statusdict/jobname 3 -1 $ put}if}stopped cleartomark}
b/solid{[]0 setdash}b/setdsh{0 setdash}b/colspRefresh{}b/rp{4 2 $ M 1 ^ 0 - 0
countdictstack ~ sub @ 0 gt{{E}repeat}{!}?}bind |
userdict /Level2ImagesError [
(This job contains a bitmapped image that can be printed only on) 100 500
(PostScript(R) Level 2 printers.  Please send this file to a PostScript) 100 485
(Level 2 printer, or print your document again with the correct printer) 100 470
(selected.) 100 455
12 /Times-Roman
] put
%%BeginResource: file AdobePS_Win_Utils_L1 4.1 0
L2? not g{/rf{N rp L}b/fx{1 1 dtransform @ 0 ge{1 sub 1}{1 add -0.25}? 3 -1 $
@ 0 ge{1 sub 1}{1 add -0.25}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{
4 -2 $ snap + +S fx rf}b/rs{N rp C K}b/rc{N rp clip N}b/sg{setgray}b/sco{
%%BeginResource: file AdobePS_Win_Utils_L2 4.1 0
L2? g{/colspA/DeviceGray |/colspABC/DeviceRGB |/setAorABC{{colspA}{colspABC}?
setcolorspace}b/rf/rectfill , |/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5
}? 3 -1 $ @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $
idtransform}b/BZ{4 -2 $ snap + +S fx rf}b/rs/rectstroke , |/rc/rectclip , |/sg
{@ @ setcolor}b/sco{setcolor}b/colspRefresh{colspABC setcolorspace}b/sgco{{sg
}{sco}?}b/UtilsInit{F setglobal}b/resourcestatus where{!/ColorRendering
/ProcSet resourcestatus{! ! T}{F}?}{F}? not{3 dict `/GetHalftoneName{
currenthalftone @/HalftoneName known{/HalftoneName get}{!/none}?}b
/GetPageDeviceName{currentpagedevice @/PageDeviceName known{/PageDeviceName
get @ null eq{!/none}if}{!/none}?}b/GetSubstituteCRD{!/DefaultColorRendering
/ColorRendering resourcestatus{! !/DefaultColorRendering}{
(DefaultColorRendering*){cvn exit}127 string/ColorRendering resourceforall}?}b
/ColorRendering & E/defineresource where{!/ProcSet defineresource !}{! !}?}if
/buildcrdname{/ColorRendering/ProcSet findresource ` mark GetHalftoneName @
type @/nametype ne ~/stringtype ne and{!/none}if(.)GetPageDeviceName @ type @
/nametype ne ~/stringtype ne and{!/none}if(.)5 ^ 0 5 -1 1{^ length add}for
string 6 1 $ 5 ^ 5{~ 1 ^ cvs length 1 ^ length 1 ^ sub getinterval}repeat !
cvn 3 1 $ ! ! E}b/definecolorrendering{~ buildcrdname ~/ColorRendering
defineresource !}b/findcolorrendering where{!}{/findcolorrendering{
buildcrdname @/ColorRendering resourcestatus{! ! T}{/ColorRendering/ProcSet
findresource ` GetSubstituteCRD E F}?}b}?/selectcolorrendering{
findcolorrendering !/ColorRendering findresource setcolorrendering}b
%%BeginResource: file AdobePS_Win_Encoding 4.1 0
/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi 18
bullets StandardEncoding 32 95 getinterval aload ! 3 bullets/quotesinglbase
/guilsinglleft/OE 4 bullets/quoteleft/quoteright/quotedblleft/quotedblright
/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe 2 bullets
/udieresis/yacute/thorn/ydieresis]| ANSIEncoding @ 39/quotesingle put 96/grave
put/ANSIEncodingOld ANSIEncoding 256 array copy | ANSIEncodingOld @[138 153
154 169 172 174 177 178 179 181 185 188 189 190 208 215 221 222 240 247 253
254]{/bullet put @}forall 166/bar put 176/ring put
%%BeginResource: file AdobePS_Win_Text 4.1 0
/TextInit{TextInitialised? not{/Pscript_Windows_Font & |/TextInitialised? T |
/fM[1 0 0 -1 0 0]|/mFM matrix |/iMat[1 0 0.212557 neg 1 0 0]|}if}b/xUP null |
/yUP null |/uW null |/xSP null |/ySP null |/sW null |/copyfont{1 ^ length add
dict `{1 ^/FID ne{|}{! !}?}forall & E}b/rF{3 copyfont @ `/Encoding
ANSIEncoding &/CharStrings known{CharStrings/Eth known not{! ANSIEncodingOld}
if}if | E}b/mF{findfont ~{@/Encoding get @ StandardEncoding eq{! T}{{
ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get
StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{rF}{0 copyfont}? 2 ^ ~
definefont fM 5 4 -1 $ put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $
put}b/xF{scalefont Pscript_Windows_Font 3 1 $ put}b/xMF{mFM astore makefont
Pscript_Windows_Font 3 1 $ put}b/xF2/scalefont , |/xMF2{mFM astore makefont}b
/sLT{: Lw -M currentpoint snap M 0 - 0 Lc K ;}b/sSU{N/uW ~ |/yUP ~ |/xUP ~ |}b
/sU{xUP yUP uW sLT}b/sST{N/sW ~ |/ySP ~ |/xSP ~ |}b/sT{xSP ySP sW sLT}b/sR{: +
R 0 0 M}b/sRxy{: matrix astore concat 0 0 M}b/eR/; , |/AddOrigFP{{&/FontInfo
known{&/FontInfo get length 5 add}{5}? dict `/WinCharSet ~ |/OrigFontType ~ |
/OrigFontStyle ~ |/OrigFontName ~ | & E/FontInfo ~ |}{! ! ! !}?}b
%%BeginResource: file AdobePS_Win_Text_Bold 4.1 0
/mBF{@ 2 copyfont `/FontName ~ | 0 FontMatrix idtransform ! &/PaintType known{
PaintType 0 eq{/PaintType 2 |/StrokeWidth ~ |}{PaintType 1 eq PaintType 2 eq
or PaintType 3 eq or &/StrokeWidth known and{StrokeWidth add/StrokeWidth ~ |}{
!}?}?}{!}? @ & E definefont Pscript_Windows_Font 3 1 $ put}b/xBF{
Pscript_Windows_Font ` 1 ^/FontName get 1 ^ scalefont 3 1 $ scalefont 2 copy ~
| ~ ! | E}b/xMBF{mFM astore Pscript_Windows_Font ` 1 ^/FontName get 1 ^
makefont 3 1 $ makefont 2 copy ~ | ~ ! | E}b/xBF2{/sB0 ~ mBF/sB1 sB0 3 -1 $
xBF sB1}b/xMBF2{/sB0 ~ mBF mFM astore/sB1 sB0 3 -1 $ xMBF sB1}b/sB{:
Pscript_Windows_Font currentfont get Ji @ S ; S}b/asB{: Pscript_Windows_Font
currentfont get Ji 3 copy A ; A}b/wsB{: Pscript_Windows_Font currentfont get
Ji 4 copy W ; W}b/awsB{: Pscript_Windows_Font currentfont get Ji 6 copy D ; D}
b/sBT3{: @ S ; 1 1 -M S}b/asBT3{: 3 copy A ; 1 1 -M A}b/wsBT3{: 4 copy W ; 1 1
-M W}b/awsBT3{: 6 copy D ; 1 1 -M D}b/mIF{iMat 4 3 -1 $ put iMat makefont
Pscript_Windows_Font 3 1 $ put}b
%%BeginResource: file AdobePS_Win_Graphics 4.1 0
/SavedCTM null |/CTMsave{/SavedCTM SavedCTM currentmatrix |}b/CTMrestore{
SavedCTM setmatrix}b/mp null |/ADO_mxRot null |/GDIHMatrix null |
/GDIHPatternDict 22 dict | GDIHPatternDict `/PatternType 1 |/PaintType 2 |
/Reps L2?{1}{5}? |/XStep 8 Reps mul |/YStep XStep |/BBox[0 0 XStep YStep]|
/TilingType 1 |/PaintProc{` 1 Lw[]0 setdash PaintData , exec E}b/FGnd null |
/BGnd null |/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b
/HS_BDiagonal{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep
XStep YStep gt{XStep}{YStep}? |/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8
Reps mul + K}b/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag
{Reps{0 0 M MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps
mul + 0 YStep M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M
MaxXYStep @ neg - 0 8 +}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E
/makehatch{GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix
GDIHPatternDict matrix mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0/HS_Horizontal
makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal makehatch}b/h3{
/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5/HS_DiagCross
makehatch}b/GDIBWPatternDict 17 dict @ `/PatternType 1 |/PaintType L2?{1}{2}?
|/RepsV L2?{1}{6}? |/RepsH L2?{1}{5}? |/BBox[0 0 RepsH 1]|/TilingType 1 |
/XStep 1 |/YStep 1 |/Height 8 RepsV mul |/Width 8 |/mx[Width 0 0 Height neg 0
Height]|/FGnd null |/BGnd null |/SetBGndFGnd L2?{{BGnd null ne{BGnd aload !
sgco BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if FGnd null ne{FGnd aload ! sgco}if}
}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx PaintData imagemask
Width 0 +}repeat E}b E |/GDIBWPatternMx null |/pfprep{save 4 1 $
/PatternOfTheDay 4 1 $ GDIBWPatternDict `/PaintData ~ |/BGnd ~ |/FGnd ~ | E
CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict matrix mp CTMrestore ~ !}b
/hrf null |/prf{pfprep ~ 6 1 $ 5 hrf restore}b/GraphInit{GDIHMatrix null eq{
/SavedCTM matrix | : ADO_mxRot concat 0 0 snap + : 0.48 @ GDIHPatternDict `
YStep mul ~ XStep mul ~ dsnap YStep V ~ XStep V ~ E +S/GDIHMatrix matrix
currentmatrix readonly | ; : 0.24 -0.24 +S GDIBWPatternDict ` Width Height E
dsnap +S/GDIBWPatternMx matrix currentmatrix readonly | ; ;}if}b/cirp{360 0 An
C}b/ellp{CTMsave + +S 0.5 0 M 0 0 0.5 360 0 An C CTMrestore}b/rrp{/rad ~ |/y2
rad arct x2 y2 x2 y1 rad arct x2 y1 x1 y1 rad arct C}b/RRp{CTMsave + +S/dyS ~
|/dxS ~ | dxS 2 V 0 M 0 0 0 dyS 0.5 arct 0 dyS dxS dyS 0.5 arct dxS dyS dxS 0
0.5 arct dxS 0 0 0 0.5 arct C CTMrestore}b
%%BeginResource: file AdobePS_Win_Graphics_L1 4.1 0
L2? not g{/arct{arcto ! ! ! !}b/GDIpattfill{@ ` BGnd null ne PaintType 2 eq
and{: BGnd aload ! sgco fEOFill{O}{L}? ; FGnd aload ! U/fGray 2 ^ put{2}{4}?
-1 $}if E @ patterncalc : 4 ^/PaintType get 2 eq{fGray{6 -1 $ sg}{8 -3 $ sco}?
}if fEOFill{eoclip}{clip}? N patternfill ; N}b/hrf{/fGray 1 ^ 6 eq | -4 $ N rp
C/fEOFill F | GDIpattfill}b/hfMain{/fEOFill ~ |/fGray ~ | GDIpattfill}b/hf{T
hfMain}b/hfW{F hfMain}b/hs{currentpoint strokepath M hfW}b/pfMain{/fEOFill ~ |
pfprep GDIpattfill restore N}b/pf{T pfMain}b/pfW{F pfMain}b/ps{currentpoint
strokepath M pfW}b/mpstr 1 string |/mp{~ @ length 12 add dict copy `
/PatternCTM matrix currentmatrix |/PatternMatrix ~ |/PatWidth XStep mpstr
length mul |/PatHeight YStep |/FontType 3 |/Encoding 256 array | 3 string 0 1
255{Encoding ~ @ 3 ^ cvs cvn put}for !/FontMatrix matrix |/FontBBox BBox |
/BuildChar{! @ ` XStep 0 FontBBox aload ! setcachedevice/PaintProc , E : exec
;}b & E ~ @ 3 -1 $ definefont}b/patterncalc{` : PatternCTM setmatrix
PatternMatrix concat BBox aload ! ! ! + pathbbox ; PatHeight V ceiling 4 1 $
PatWidth V ceiling 4 1 $ PatHeight V floor 4 1 $ PatWidth V floor 4 1 $ 2 ^
sub cvi abs ~ 3 ^ sub cvi abs ~ 4 2 $ PatHeight mul ~ PatWidth mul ~ E}b
/patternfill{5 -1 $ @ ` Ji PatternCTM setmatrix PatternMatrix concat 0 2 ^ 2 ^
M 0 1 mpstr length 1 sub{1 ^ mpstr 3 1 $ put}for ! 2 ^{currentpoint 5 ^{mpstr
S}repeat YStep add M}repeat ! ! ! ! E}b}e
%%BeginResource: file AdobePS_Win_Graphics_L2 4.1 0
L2? g{/mp/makepattern , |/hrf{6 eq setAorABC setpattern rectfill}b/hf{
setAorABC setpattern O}b/hfW{setAorABC setpattern L}b/hs{setAorABC setpattern
K}b/pf{pfprep setpattern O restore N}b/pfW{pfprep setpattern L restore N}b/ps{
pfprep setpattern K restore N}b}e
%%BeginResource: file AdobePS_Win_BW_Images 4.1 0
/iw 0 |/ih 0 |/im_save 0 |/s 0 |/polarity 0 |/smoothflag 0 |/mystring 0 |/bpc
0 |/setup1asciiproc{[currentfile mystring/readhexstring cvx/! cvx]cvx bind}b
/setup1binaryproc{[currentfile mystring/readstring cvx/! cvx]cvx bind}b
/setup2asciiproc{currentfile/ASCII85Decode filter/RunLengthDecode filter}b
/setup2binaryproc{currentfile/RunLengthDecode filter}b/mycolorspace{colspABC}|
/myimagedict{/myimagedict 10 dict | myimagedict @ `/ImageType 1 |
/MultipleDataSource F | E}b/imageprocarray[/setup1binaryproc/setup1asciiproc
]|/Q{/im_save save | sgco imageprocarray ~ get/s ~ , |/polarity ~ |/smoothflag
rf}b/X{/im_save save | imageprocarray ~ get/s ~ , |/polarity ~ |/smoothflag ~
| snap +/dx 2 ^ |/dy 1 ^ | +S/mystring ~ string |/bpc ~ |/ih ~ |/iw ~ |}b/Z{
im_save restore}b L2? g{/Y{sgco myimagedict @ `/Width iw |/Height ih |/Decode
polarity{[1 0]}{[0 1]}? |/ImageMatrix[iw 0 0 ih 0 0]|/DataSource s |
/BitsPerComponent 1 |/Interpolate smoothflag | E imagemask}bd}e
%%BeginResource: file AdobePS_Win_BW_Images_L1 4.1 0
L2? not g{/setup2asciiproc{[/Level2ImagesError , aload ! T FatalErrorIf}b
/setup2binaryproc/setup2asciiproc , |/Y{sgco iw ih polarity[iw 0 0 ih 0 0]s
%%BeginResource: file AdobePS_Win_Co_Images_L1 4.1 0
L2? not g{/testsystemdict{where{systemdict eq{T}{F}?}{F}?}b/c 1 |/colorimage
where{! T}{F}?{/c 0 statusdict `/processcolors where{! ! processcolors}{
/deviceinfo where{! deviceinfo/Colors known{!{deviceinfo/Colors get}}if}if}? E
| c 0 ne{/colorimage testsystemdict/setcolortransfer testsystemdict
/currentcolortransfer testsystemdict/currentcmykcolor testsystemdict and and
and not{/c 0 |}if}if}if c @ 1 ne ~ @ 3 ne ~ 4 ne and and{/c 0 |}if c 1 eq g{
/expandbw{expandfactor mul round cvi bwclut ~ get 255 V}b/doclutimage{!/bwclut
currenttransfer ~]cvx bind settransfer iw ih bpc[iw 0 0 ih 0 0]s image}b}e c @
3 eq ~ 4 eq or g{/nullproc{{}}|/concatutil{/exec , 7 -1 $/exec ,}b/defsubclut{
1 add getinterval |}b/spconcattransfer{/Dclut ~ |/Cclut ~ |/Bclut ~ |/Aclut ~
|/ncompute ~ , | currentcolortransfer[{Aclut ncompute}concatutil]cvx[{Bclut
ncompute}concatutil]cvx[{Cclut ncompute}concatutil]cvx[{Dclut ncompute}
concatutil]cvx setcolortransfer}b/setuprgbcluts{/bit3x rgbclut length 3 sub |
/bit1x bit3x 3 idiv |/rclut rgbclut |/gclut rclut 1 bit3x defsubclut/bclut
rclut 2 bit3x defsubclut}b}e c 3 eq g{/3compute{~ bit3x mul round cvi get 255
V}b/doclutimage{/rgbclut ~ | ! setuprgbcluts/3compute rclut gclut bclut @
spconcattransfer iw ih bpc[iw 0 0 ih 0 0][s/exec ,/@ , @]cvx nullproc nullproc
T 3 colorimage}b}e c 4 eq g{/ftoint{1 ~ sub 255 mul round cvi}b/stuffclut{
cmykindex 3 -1 $ put}b/4compute{~ bit4x mul round cvi get 255 V}b
/invalidcolortable? T |/computecmykclut{setuprgbcluts/bit4x rgbclut length 3
idiv 4 mul 4 sub |/cmykclut bit4x 4 add string |/cclut cmykclut |/mclut cclut
1 bit4x defsubclut/yclut cclut 2 bit4x defsubclut/kclut cclut 3 bit4x
defsubclut/cmykindex 0 | 0 1 bit1x{@/cmykindex ~ bit1x ~ sub 4 mul | 3 mul @
rclut ~ get 255 V ~ @ gclut ~ get 255 V ~ bclut ~ get 255 V setrgbcolor
currentcmykcolor ftoint kclut stuffclut ftoint yclut stuffclut ftoint mclut
stuffclut ftoint cclut stuffclut}for}b/doclutimage{/rgbclut ~ | !
invalidcolortable?{computecmykclut}if/4compute cclut mclut yclut kclut
spconcattransfer iw ih bpc[iw 0 0 ih 0 0][s/exec ,/@ , @ @]cvx nullproc
nullproc nullproc T 4 colorimage}b}e c 0 eq g{/a{3 mul 3 getinterval
putinterval ~ 3 add ~ 3 copy}b/8lookup/a , |/4lookup{/byte 1 ^ | -4 bitshift a
byte 15 and a}b/2lookup{/byte 1 ^ | -6 bitshift a byte -4 bitshift 3 and a
byte -2 bitshift 3 and a byte 3 and a}b/colorexpand{mystringexp 0 rgbclut 3
copy 7 -1 $/mylookup , forall ! ! ! ! !}b/createexpandstr{/mystringexp ~
mystring length mul string |}b/doclutimage{/rgbclut ~ | !/mylookup bpc 8 eq{3
createexpandstr/8lookup}{bpc 4 eq{6 createexpandstr/4lookup}{12
createexpandstr/2lookup}?}? , | iw ih bpc[iw 0 0 ih 0 0][s/exec ,/colorexpand
,/exec ,]cvx F 3 colorimage}b}e/colorimage where{! T}{F}? g{/do24image{iw ih 8
[iw 0 0 ih 0 0]s F 3 colorimage}b}DefIf_El{/rgbtogray{/str ~ |/len str length
|/smlen len 3 idiv |/rstr str |/gstr str 1 len 1 sub getinterval |/bstr str 2
len 2 sub getinterval | str @ 0 1 smlen 1 sub{@ 3 mul rstr 1 ^ get 0.3 mul
gstr 2 ^ get 0.59 mul add bstr 3 -1 $ get 0.11 mul add round cvi put @}for ! 0
smlen getinterval}b/do24image{iw ih 8[iw 0 0 ih 0 0][s/exec ,/rgbtogray ,/exec
,]cvx bind image}b}e/doNimage{bpc 24 eq{do24image}{iw ih bpc[iw 0 0 ih 0 0]s
%%BeginResource: file AdobePS_Win_Co_Images_L2 4.1 0
L2? g{/doclutimage{/rgbclut ~ | ! bpc @ 8 eq{! 255}{4 eq{15}{3}?}?/hival ~ |[
/Indexed colspABC hival rgbclut]setcolorspace myimagedict @ `/Width iw |
/Height ih |/Decode[0 hival]|/ImageMatrix[iw 0 0 ih 0 0]|/DataSource s |
/BitsPerComponent bpc |/Interpolate smoothflag | E image}b/doCMYKclutimage{
/CMYKclut ~ | ! bpc @ 8 eq{! 255}{4 eq{15}{3}?}?/hival ~ |[/Indexed/DeviceCMYK
hival CMYKclut]setcolorspace myimagedict @ `/Width iw |/Height ih |/Decode[0
hival]|/ImageMatrix[iw 0 0 ih 0 0]|/DataSource s |/BitsPerComponent bpc |
/Interpolate smoothflag | E image}b/doNimage{bpc 24 eq{colspABC}{colspA}?
setcolorspace myimagedict @ `/Width iw |/Height ih |/Decode bpc 24 eq{[0 1 0 1
0 1]}{[0 1]}? |/ImageMatrix[iw 0 0 ih 0 0]|/DataSource s |/BitsPerComponent
bpc 24 eq{8}{bpc}? |/Interpolate smoothflag | E image}b/doCMYKimage{
/DeviceCMYK setcolorspace myimagedict @ `/Width iw |/Height ih |/Decode[0 1 0
1 0 1 0 1]|/ImageMatrix[iw 0 0 ih 0 0]|/DataSource s |/BitsPerComponent 8 |
/Interpolate smoothflag | E image}b}e
%%BeginResource: file AdobePS_Win_Type3_Hdr 4.1 0
/GreNewFont{11 dict dup 3 1 roll def dup begin 9 1 roll AddOrigFP/FontType 3
def/FontMatrix exch def/FontBBox exch def/Encoding G00GFFEncoding def
/CharProcs 257 dict def CharProcs/.notdef{}put/Metrics 257 dict def Metrics
/.notdef 3 -1 roll put/BuildChar{/char exch def/fontdict exch def/charname
fontdict/Encoding get char get def fontdict/Metrics get charname 2 copy known{
get aload pop}{pop/.notdef get aload pop}ifelse setcachedevice fontdict begin
Encoding char get CharProcs exch 2 copy known{get}{pop/.notdef get}ifelse end
exec}def end definefont pop}def/AddChar{begin CharProcs 3 1 roll put Metrics 3
1 roll put end}def/CopyT3Hdr{findfont dup maxlength dict begin{1 index/FID ne{
def}{pop pop}ifelse}forall currentdict end dup 3 1 roll def dup begin 4 1 roll
/FontType 3 def/FontMatrix exch def/FontBBox exch def/CharProcs 257 dict def
CharProcs/.notdef{}put/Metrics 257 dict def Metrics/.notdef 3 -1 roll put end
definefont pop}def
%%BeginResource: file AdobePS_Win_Type1_Hdr 4.1 0
/Type1Hdr{14 dict ` AddOrigFP/FontName ~ |/PaintType ~ |/FontType 1 |
/FontMatrix[1 3 ^ V 0 0 1 6 ^ V 0 0]| !/Encoding G00GFFEncoding | ! !/FontBBox
{0 0 0 0}| & E currentfile eexec}bind |/CopyT1Hdr{findfont @ maxlength dict `{
1 ^/FID ne{1 ^/CharStrings ne{|}{@ maxlength dict `{1 ^/.notdef ne{! !}{|}?}
forall & E |}?}{! !}?}forall & E `/FontName ~ |/PaintType ~ |/FontType 1 |
/FontMatrix[1 3 ^ V 0 0 1 6 ^ V 0 0]| ! ! !/FontBBox{0 0 0 0}| FontName & E
definefont !}bind |
%%BeginResource: file AdobePS_Win_RLE 4.1 0
/pp 1 string |/ss 1 string |/rledecodebinary{/DC 0 |/BC 0 |{DC mystring length
ge{exit}if currentfile ss readstring ! 0 get/BC ~ | BC 127 le{/BC BC 1 add |
DC 1 DC BC add 1 sub{mystring ~ currentfile ss readstring ! 0 get put}for}{/BC
257 BC sub | currentfile ss readstring ! 0 get/pp ~ | DC 1 DC BC add 1 sub{
mystring ~ pp put}for}?/DC DC BC add |}loop mystring}b/rledecodeascii{/DC 0 |
/BC 0 |{DC mystring length ge{exit}if currentfile ss readhexstring ! 0 get/BC
readhexstring ! 0 get put}for}{/BC 257 BC sub | currentfile ss readhexstring !
0 get/pp ~ | DC 1 DC BC add 1 sub{mystring ~ pp put}for}?/DC DC BC add |}loop
mystring}b/setup1asciidecodeproc{[/rledecodeascii cvx]cvx bind}b
/setup1binarydecodeproc{[/rledecodebinary cvx]cvx bind}b
%%BeginResource: file AdobePS_Win_Type0_Hdr 4.1 0
/Type02Hdr{25 dict ` AddOrigFP/Encoding ~ |/FDepVector ~ |/WMode ~ |/FontName
& E definefont !}bind |/Type06Hdr{25 dict ` AddOrigFP/SubsVector ~ |/Encoding
6 |/FontMatrix[1 0 0 1 0 0]| FontName & E definefont !}bind |/Type09Hdr{25
dict ` AddOrigFP/Encoding ~ |/FDepVector ~ |/CMap ~ |/WMode ~ |/FontName ~ |
/PaintType ~ |/FontType 0 |/FMapType 9 |/FontMatrix[1 0 0 1 0 0]| FontName & E
definefont !}bind |
%%BeginResource: file AdobePS_Win_Compat 4.1 0
userdict/AdobePS_Win_Compat 13 dict dup begin/bd{bind def}bind def/ld{load def
}bd/CB{pop pop pop pop}bind def/B{pop pop pop pop}bind def/$x matrix def/SS{
/pagesave save def}bind def/RS{/pagesave where{pop pagesave restore}{$x matrix
invertmatrix concat}ifelse}bind def/ANSIVec[0/grave 1/acute 2/circumflex 3
/tilde 4/macron 5/breve 6/dotaccent 7/dieresis 8/ring 9/cedilla 10
/hungarumlaut 11/ogonek 12/caron 13/dotlessi 39/quotesingle 96/grave 124/bar
130/quotesinglbase 131/florin 132/quotedblbase 133/ellipsis 134/dagger 135
/daggerdbl 136/circumflex 137/perthousand 138/Scaron 139/guilsinglleft 140/OE
145/quoteleft 146/quoteright 147/quotedblleft 148/quotedblright 149/bullet 150
/endash 151/emdash 152/tilde 153/trademark 154/scaron 155/guilsinglright 156
/oe 159/Ydieresis 160/space 161/exclamdown 164/currency 165/yen 166/brokenbar
167/section 168/dieresis 169/copyright 170/ordfeminine 171/guillemotleft 172
/logicalnot 173/hyphen 174/registered 175/macron 176/degree 177/plusminus 178
/twosuperior 179/threesuperior 180/acute 181/mu 182/paragraph 183
/periodcentered 184/cedilla 185/onesuperior 186/ordmasculine 187
/guillemotright 188/onequarter 189/onehalf 190/threequarters 191/questiondown
192/Agrave 193/Aacute 194/Acircumflex 195/Atilde 196/Adieresis 197/Aring 198
/AE 199/Ccedilla 200/Egrave 201/Eacute 202/Ecircumflex 203/Edieresis 204
/Igrave 205/Iacute 206/Icircumflex 207/Idieresis 208/Eth 209/Ntilde 210/Ograve
211/Oacute 212/Ocircumflex 213/Otilde 214/Odieresis 215/multiply 216/Oslash
217/Ugrave 218/Uacute 219/Ucircumflex 220/Udieresis 221/Yacute 222/Thorn 223
/germandbls 224/agrave 225/aacute 226/acircumflex 227/atilde 228/adieresis 229
/aring 230/ae 231/ccedilla 232/egrave 233/eacute 234/ecircumflex 235/edieresis
236/igrave 237/iacute 238/icircumflex 239/idieresis 240/eth 241/ntilde 242
/ograve 243/oacute 244/ocircumflex 245/otilde 246/odieresis 247/divide 248
/oslash 249/ugrave 250/uacute 251/ucircumflex 252/udieresis 253/yacute 254
/thorn 255/ydieresis]def currentdict{dup type/operatortype eq{[exch]cvx def}{
pop pop}ifelse}forall/initialize{currentdict exch begin begin}bind def
/terminate{/@FL where not{pop end end}{pop}ifelse}bind def/suspend/terminate
load def/resume/initialize load def/M/moveto load def end put/Courier findfont

Conclusion: Selling our Souls for Software

The "public park analogy" has been presented as a metaphor for understanding the virus of purchased language.

In many ways we've been "speaking" languages to which we've purchased rights to "speak". What makes this situation particularly viral is the manner in which it requires those who want to converse with us to also purchase rights to the proprietary languages we've chosen. In this way, the "spoken" Word is a virus, infecting everyone we interact with, and infecting the archives of our own "thoughts". Although we make these choices as individuals, there is a further conflict of interest when we collectively make these choices, by way of government Internet presence or through our educational systems. Rather than blaming the corporations, we should be blaming ourselves. Collectively (e.g. as a government) we could go a lot further simply by not infecting the materials we disseminate with any virus, and by refusing to accept any material infected with a virus, than we might go by trying to cast the blame upon others through lengthy and expensive antitrust lawsuits, or the like.

About the Author

Steve G. Mann, considered to be the inventor of the so-called "wearable computer" (WearComp) and EyeTap video camera and reality mediator (WearCam), is currently a faculty member at University of Toronto, Department of Electrical and Computer Engineering. Dr. Mann has been working on his WearComp invention for more than 20 years, dating back to his high school days in the 1970s. He brought his inventions and ideas to the Massachusetts Institute of Technology in 1991, starting, what was to later become the MIT Wearable Computing Project. He received his PhD degree from MIT in 1997. He is also the inventor of the chirplet transform, a new mathematical framework for signal processing. Mann was both the initiator and Publications Chair of the first IEEE International Symposium on Wearable Computing (ISWC97). He also chaired the first Special Issue on Wearable Computing in Personal Technologies Journal, and has given numerous Keynote Addresses on the subject, including the Keynote at the first International Conference on Wearable Computing, the Keynote at the Virtual Reality conference, and the Keynote at the McLuhan Conference on Culture and Technology.


1. This paper is based, in part, on portions of the author's after dinner banquet address, "EYE AM A CAMERA", presented at the FOCUS99 Symposium, May 24-25, 1999.

Editorial history

Paper received 17 December 1999; accepted for publication 27 December 1999; revision received 8 January 2000; revision received 9 January 2000

Contents Index

Copyright ©2000, First Monday

Free Source as Free Thought: Architecting Free Standards by Steve Mann
First Monday, volume 5, number 1 (January 2000),