// -- macro declarations: start reading with first headline +BC:\B<\C<__body__>>

+CX:\C<\X<__body__>>

+ILLT:\LOCALTOC{type=linked depth=1}

// -- end of "preface"

=0.452

It turned out that 0.451 was still untestable under new developer releases of \C<perl> (5.9.5) and above because \C<strict> was changed to use \C<caller>.

Many thanks to Andreas König who figured out which exact developer version change caused the new behaviour, for starting a dialog with the core team and for suggesting a patch to work around the new behaviour of \C<strict> under \C<Safe> control.

The suggested patch is applied in this update.

This update affects the test suite \I<only>.

=0.451

This version is similar to 0.45 in function, it fixes the test suite on UNIX systems. Thanks to Andreas König who triggered me to publish this fix.

=0.45

=Fixes

=0.44

\ILLT

=Features

=Fixes

=0.43

\ILLT

==Features

\ILLT

===Import filter API for the INCLUDE and EMBED tags

PerlPoint supports import filters for other formats since package version 0.38, via tag option \C<ifilter>:

\\INCLUDE{type=pp ifilter='pod2pp' file="file.pod"}

Nevertheless, this could be simplified. With the new option C<import> this can be written as

\\INCLUDE{type=pp import=pod file="file.pod"}

, given a module \C<PerlPoint::Import::POD> is installed (note: see the \C<Pod::PerlPoint> distribution for this module). The import module API is new and requires the module to define a function \C<importFilter()>, with the same interface as functions for \C<ifilter>. In fact, \C<import=pod> is a shortcut for \C<ifilter="PerlPoint::Import::POD">.

With \C<\\INCLUDE>, the import option can use the \I<source file extension> as the source format. This is enforced by using a true numeric value for this option, instead of a string:

\\INCLUDE{type=pp import=1 file="file.pod"}

When both \C<import> and \C<ifilter> are used together \C<import> is ignored.

===Automatic import of entire files

The new standard import filter API is used to allow automatic import of source files in other formats. Import is requested by the special prefix \C<IMPORT:>, like in

> perlpoint ... \B<IMPORT:>source.pod

With the prefix, PerlPoint treats the file extension (\C<pod>) as the name of the source format, searches for the related import module (\C<PerlPoint::Import::\B<POD>>, again the format is all uppercased in the module name by convention) and invokes it automatically.

This feature applies to all existing converters automatically.

===Misc

=0.42

The main intention of this update is to allow the production of better structured results (like correct XHTML). On the way to there, fixes and improvements were made.

There should be no incompatibility with 0.41.

\ILLT

==Features

==Fixes

==Misc

=0.41

This is a light update performed with the introduction of \C<PP::Template::TT2>. No adaptations should be required except for the name change from \C<pp2tdo> to \C<perlpoint>.

As \CX<pp2tdo> is intended to be one converter for many formats, it is now renamed to \CX<perlpoint>. It does \I<not> mean other \C<pp2...> converters are out of support in any way which they are not. The idea just came up when thinking about a binary package built with pp (from \C<PAR>), for which a name of "perlpoint" seems appropriate and memorable.

==Features

==Fixes

==Misc

=0.40

This update has two parts.

First, it is a feature update. It has a few incompatible changes (see below), but should require only slight adaptations of existing converters. All converters should continue to run or should be adapted soon (as I know there is an adapted Converters package on the way).

Second, 0.40 introduces an extended framework, which in this release is in \I<beta state> because of lacking tests and incomplete docs. Nevertheless, it is well tested in production and should be save to use.

Read on for all the details!

\LOCALTOC

==Features

There are lots of new features, most of all an extended framework which should make it much easier to write converters.

The new parts are just \I<extensions> of the "old" framework which remains in action (and is used by the new parts), so converters using the traditional interface should continue to run.

==Extended framework

This version introduces a new converter, \BC<pp2tdo> ("template driven output"), and a new part of the module framework, the \C<PerlPoint::Generator> hierarchy, which implement a very generic and general converter approach.

See the new section "The formatter approach" in "Writing converters" for details about this new model.

Here are a few highlights:

===New SDF generator

As a reference implementation, the functionality of \C<pp2sdf> was reimplemented in the generator model. To produce SDF this way, invoke \C<pp2tdo> with option \C<-target SDF>.

===First pure XML generator(s)

Well, we already had the demo converter that produced XML for PPresenter, but now a \I<common> implementation is available, implemented with the new generator approach. To produce XML, invoke \C<pp2tdo> with option \C<-target XML>.

Best of all, if the result does not meet your needs, it is easy to control entity translation by options. If this is not sufficient, it is easy to write a modified converter by subclassing \C<PerlPoint::Generator::XML>. See \C<PerlPoint::Generator::XML::Default> for an example and "Writing converters" for instructions.

Various formatters are available to produce XHTML, paged XHTML and AxPoint. These are published as standalone CPAN packages, watch the PerlPoint namespace or the project side on SourceForge.

===Further reading

To learn more about the new features and generators, please read via \C<perldoc>

... and have a look at the example template provided in the \C<demos> subtree.

==Incompatibel changes for users

$__pod2pp__empty__=

${__pod2pp__empty__}Converted POD text ...

To work around this, use the new optional dot start for text paragraphs:

.Converted POD text ...

And please install an updated version of Pod::PerlPoint, please ;-)

==Incompatible changes of the converter API

==Tutorial

Beginning with this release, a tutorial is part of the package. Being in an early state till it already describes the PerlPoint basics. Please have a look. Comments are appreciated.

==Various

.Text begins.

This is mostly useful when \I<generating> PerlPoint from other sources, to make sure the first characters of the converted text will not be interpreted as special PerlPoint characters.

==Bugfixes

$empty=

${empty}Text starts here ...

To work around this, use the new optional dot start for text paragraphs instead:

.Text starts here ...

=0.39

This update moves a tag (\C<\\X>) from converter definitions to the basic tags. To make use of the new functionality, you need to update to adapted converters. Alternativelely and as a workaround, go to the definition lib, e.g. \C<PerlPoint::Tags::HTML>, and delete the definition of the \C<\\X> tag. (Please note that full support of the new index features \I<needs> updated converters.)

==Bugfixes

==Changes

==Features

===Index based references

Introducing new "index based references". What's this? Imagine a document collection by many authors. It would be nice to cross link related articles. This requires knowledge of all the document parts and would usually be arranged by an informed document manager, or by using technologies like Topic Maps or the like. In any case, it takes time.

But what if the collection is frequently updated, or when it is impossible to instrument them for Topic Maps or similar technologies, or if there is neither person nor time to investigate all the stuff in detail? Then you could use this (still experimental) feature of \I<index based references>.

The idea is that index entries point to documents/chapters with substantial information about the index entry. Documents/chapters matching in their index entries are probably content related. In linking to other documents or chapters speaking about the same indexed issues, or to a relevant percentage of the base documents (indexed) issues, one can build cross references automatically.

To do so, the package now provides a new base tag \BC<INDEXRELATIONS> which builds a list of related pages. Options specify if the keyword base should be filled with entries from the start chapter only, or shall include all subchapters. Likewise, one can specify if only the index entries at other \I<startup> pages should be taken into account, or if \I<all their subchapters> should be scanned, too. Finally, there's an option to configure a minimal match threshold (absolutely or by percentage).

Converters can take the provided chapter list and present them as they like.

The appropriate tests and docs were added.

==Docs

=0.38

This is maintenance update for paragraph filters. If you are using paragraph filters, it is strongly recommended to upgrade.

But hopefully the new features make it worth to update for others, too ;-) The POD input feature, for example. Or any language you like. Read below.

There are no incompatibilities between \REF{name="0.37"}<0.37> and 0.38. All PerlPoint sources which passed 0.37 should pass 0.38 as well. All converters should continue to work.

==Bugfixes

==Changes

==pp2sdf

=0.37

This is a maintenance update. It can replace version 0.36 transparently except for verbatim block paragraph filters and \C<pp2sdf> output handling. See next section for details.

==Incompatible changes

==Bugfixes

==Features

\LOCALTOC{type=linked}

===Document streams

Robert Inder asked how to achieve an HTML layout where notes are placed below the slide context. When we discussed several ideas, I thought it might be useful to have a general solution which I called \I<"document streams">. Thanks, Robert!

So what is a document stream? Consider the following layout:


| header navigation |
  |                                   |
  |              Title                |
  |                                   |
  | Introduction text, points etc.    |
  |                                   |
  -------------------------------------
  |                 |                 |
  | Here we are     | Here we are     |
  | talking about   | talking about   |
  | subtheme 1.     | subtheme 2.     |
  |                 |                 |
  -------------------------------------
  |               notes               |
  -------------------------------------
  |         trailer navigation        |

The kernel parts can be easily generalized into a more abstract scheme:


  |                                   |
  |            main stream            |
  |                                   |
  -------------------------------------
  |                 |                 |
  |  item 1 stream  |  item 2 stream  |
  |                 |                 |
  -------------------------------------
  |              stream 3             |

This may be used in many ways - to compare software or hardware items, to place reader hints besides a main text, to write about the lifes of two or more individuals and present certain life parts in parallel, and so on.

But how to distinguish document streams in a PerlPoint document? Well, here are the simple rules:

Converters need to add docstream support, so currently only \C<pp2sdf> provides a first (reference) implementation. \I<It is completely up to a converter how it supports and "translates" document streams.> But to implement generally useful methods in the framework, the parser can be set up to transform all docstream entry points into headlines (at a sublevel of the current headline level) or to ignore all document streams at all (except of the main stream).

More, docstreams can be skipped more selectively as well: the parsers \C<run()> method provides a new parameter \BC<docstreams2skip> to pass the parts to be ignored. When an ignored docstream is entered, all subsequent document parts till the next entry point (or headline) are completely ignored (including conditions - take care).

Finally, \I<headline> start directives now provide a list of docstreams used in this certain chapter - allowing converter authors to adapt the chapters layout dynamically. See "Writing converters" for details.

===\\INCLUDE

Now it's easy to use a central repository of (macro / variable / code / filter / document) libraries:

Pathes specified via \C<-includelib> (or the internal representation \C<libpath>, respectively) are searched \I<before> pathes specified via \C<PERLPOINTLIB>.

===Cache

===pp2sdf

===Misc

? flagSet('a') or flagSet('b') or flagSet('all')

new

? flagSet(qw(a b all))

=0.36

This is a major update - in the sense that it modifies a lot of internals, especially stream handling. Nevertheless, it's almost completely compatible with earlier versions of the package (and the few \REF{name="Summary: Incompatible changes" type=linked}<incompatible changes> most likely do \I<not> affect existing converters).

So \I<this version should run whereever 0.35 could be used.>

While working on this version, I began to make use of the modified internals myself. As a result, there are various new \I<visible> features as well. See section "\REF{name="Visible Changes" type=linked}" below for all details. Internals are described in chapter "\REF{name=Internals type=linked}".

\I<Please note that there's a new dependancy to run the installation tests because I switched to \BC<Test::More>> (included in CPAN package \C<Test::Simple> - do \I<not> install the still available standalone distribution of \C<Test::More>). You may have to update \C<Test::Harness> as well.

==Bugfixes

==Internals

This chapter can be safely skipped by "pure" PerlPoint users which might like to continue with chapter "\REF{name="0.36 | Visible Changes" type=linked}".

This chapter describes these news:

\LOCALTOC{type=linked}

===PerlPoint::Backend, stream format

\B<\I<The format of the intermediate stream was changed.>> I do not know of any direct stream access in a converter, but \I<if> anyone did access the stream directly, he will need to adapt his code. Code using \C<PerlPoint::Backend> does \I<not> need to be adapted.

The stream is still a stream basically, but with additional structural hints stored in parallel, which are currently a stream of headline index numbers. This way I hope to stay with the performance advantages of a stream while enabling things like chapter inspection and arbitrary chapter navigation.

For example, \C<pp2html> 0.11 in fact needs to process the stream twice because it needs the whole picture of the headline structure when building slides. Now it would be possible to inspect headlines in the first pass \I<only>, and to process \I<all> tokens in the 2nd pass then. This is a common task - \C<pp2html> might be modified or not, but future converters can definitely make use of this. (And there's an even better and faster way now to grab the TOC, see below.)

To make use of the new structure, \C<PerlPoint::Backend> provides several new methods:

The new backend method \BC<toc()> uses the new features to provide a table of contents. If called for a certain chapter, all subchapters are listed. The reported depth can be limited.

# get the complete \I<table of contents> $toc=$backend->\B<toc>;

# get a list of all \I<current subchapters> $subchapters=$backend->toc($backend->currentChapterNr);

# get a list of the subchapters \I<one level below the # current one> (do not list the complete tree, if there # are more levels)
$subchapters=$backend->toc($backend->currentChapterNr, \B<1>);

All backend extensions are documented both in \C<PerlPoint::Backend>'s POD and in the converter tutorial. Hopefully.

===More stream enhancements

===New finish hook to complete tags

With the new tag declarations by module introduced by version \REF{name="0.34" type=linked}, it became possible to hook into tag parsing. Now there's another hook to \I<complete> a tag \I<after> parsing - this means, when all input informations are available.

The new \C<\\REF> macro makes use of this feature to verify links and to complete itself by linked content.

The new hook interface is quite similar to parsing hooks except that it does not provide informations only available at parsing time (like the tag body). See \C<PerlPoint::Tags> for a detailed doc.

===New hook return codes PARSING_IGNORE and PARSING_ERASE

Tag \I<parsing> hooks can return two new codes:

Finish hooks can return these codes as well, with exactly the same effect. (The tag remains streamed (as well as its body), but will be bypassed by the backend.) See \C<PerlPoint::Tags> for a detailed doc.

===Hooks can now be interchanged

It is now possible to use hooks of a "foreign" tag (declared by another tag module) in your own tag hooks. This helps to emulate other tags, for example if an \I<old interface> (tag and option names) shall be preserved but the \I<new functionality> shall be used. To invoke a foreign hook, call \C<PerlPoint::Tags::call()> anywhere in your own hook, passing tag name, hook type and parameters, like so:

$rc=PerlPoint::Tags::call('TAG', 'hook', @_);

If the tag is not registered, or has no hook of the specified type, an undefined value is supplied, otherwise the return code of the invoked function.

===New anchor management

The parser can relieve converters from anchor management partially now. This is an \I<offer>.

This is the complete management for now. The parsers collection is \I<not> made part of the stream. It's just a help to verify links at parsing time, and to insert named values into the stream.

The new \C<\\REF> macro uses the parsers anchor collection to resolve values not available at parsing time, like sequence numbers generated by the new \C<\\SEQ> tag.

Again: with this feature (and tag finish hooks), it becomes easy to reference strings defined \I<later> than the reference.

===Summary: Incompatible changes

Various incompatible modifications might have been mentioned before, but it might be useful to have a check list:

==Visible Changes

While the modified internals are especially of converter authors interest and do not affect existing documents, there are already \I<new> features in this version implemented on base of the new internals which \I<might> find your interest and help you in writing documents. These new features include:

\LOCALTOC{type=linked}

Please see the \REF{name="0.36 | Misc" type=linked}<"Misc"> section below for more visible changes which are not based on the modified internals.

===More active content: tags and macros can be made optional

If a tag or macro has an option \BC<cnd>, the parser treats this option as a \I<condition> to activate the tag/macro or not. The condition is evaluated as Active Content. If Active Content is disabled, the condition defaults to "false".

\\IMAGE{cnd="$illustrate" src="piegraph.gif"}

Unfortunately, because it is done via option, only tags and macros \I<providing> options can be made conditional. So,

\\I{cnd="$italics"}<conditionally italic text>

cannot be written because of a parsing error. That's bad. If anyone has an idea for a well fitting general solution, please let me know.

(Hint for converter authors: the condition option is stripped off of the options hash if the condition (and therefore the tag) turns out to be valid. You cannot evaluate it yourself again.)

===New basic tag \\LOCALTOC

\BC<\\LOCALTOC> inserts all subsections of the current chapter (in requested depth). Simply say:

=Parent chapter

In this chapter:

\B<\\LOCALTOC>

==Subchapter 1

===Subchapter 1.1

==Subchapter 2

, and a converter will produce results according to \I<this> source:

=Parent chapter

In this chapter:

\B<* Subchapter 1>

\B<* Subchapter 1.1>

\B<* Subchapter 2>

==Subchapter 1

==Subchapter 2

I missed something like this tag for a long time, indeed. Think of all the empty pages produced by headlines which just collect various subchapters, but without own text.

It is possible to limit the subhierarchy depth taken into account (suppress the display of subchapter 1.1 in the example above by setting \C<depth> to 1), to format the produced list in various ways (ordered, unordered, with chapter numbers) and even to make the chapter titles hyperlinks to their related chapters (if supported by the target format).

The transformation has to be done \I<by the converters>. As I know, the tag shall be supported by \C<\PP::Converters> 0.12. For now, you may get an impression by using \C<pp2sdf> which as a reference implementation is already supporting \C<\\LOCALTOC>.

===New basic tag \\SEQ

Generates the next value of a certain sequence "type" which is declared by option:

\\SEQ{type=example}, \\SEQ{type=example}, \\SEQ{type=example}

will produce \C<1, 2, 3>, while

\\SEQ{type=example}, \\SEQ{type=image}, \\SEQ{type=table}

results in \C<1, 1, 1> (provided no sequence was started before).

It is possible to name the generated number, which makes it easy to reference it. Naming is done by option \BC<name>.

\SEQ{type=image name="Blue water"}

(Note: Converter authors have to deal with this tag a special way because the number is passed by a generated tag \I<option>, not by tag body. Nevertheless, it's quite simple, see \C<pp2html> for an example and "Writing converters" for a description.)

===New basic tag \\REF

This is intended to be a very general reference tag. We already have several reference tags, mostly introduced by \C<pp2html> - this one is intended to continue their tradition a generalized (and generally available) way and is implemented on base of new parser features (see \REF{name="0.36 | Internals | New anchor management" type=linked}<"anchor management"> above).

There's a complete doc. Here's an overview:

===New basic tag \\FORMAT

This is another generalized tag, this time in the tradition of \C<pp2html>'s tags which configure the rendering of examples. \C<\\FORMAT> is just a container which can be filled by various options which represent the settings to made.

\\FORMAT{\B<align=left>}

This should make all following text paragraphs and table cells left justified, until the end of the document or another alignment setting is made. So the meaning of \C<\\FORMAT> is to configure \I<default> formattings.

As formatting is very target language specific, each converter can define valid settings it accepts and evaluates. C<\\FORMAT> may then be used to make settings interpreted by \I<various> converters \I<at once>:

// this example uses imaginary settings \\FORMAT{\B<html_xxx=2 sdf_xxx=5>}

Nevertheless, certain configurations may have a common meaning. I encourage converter authors to establish conventions. The first conventional setting established is \C<align> which shall accept the values \C<left>, \C<center>, \C<justify> and \C<right>.

This tag was invented after Carlos Malvar suggested we could offer justification. Thanks, Carlos.

===New basic tag \\HIDE

This tag removes all its contents. This makes sense if used together with a tag condition.

\\HIDE{cnd="$hideSecrets"}<\SECRETS>

===New basic tag \\STOP

Another tag that makes most sense if used with tag conditions. It raises a syntactical error and thereby stops document processing immediately. So, to check if the used parser version meets the needs of your up to date document, write

\\STOP{cnd="\$PARSERVERSION<0.36"}

===New type of active contents: paragraph filters

Carlos Malvar asked me for automatic example highlightning. Thinking about how users could afford automatic highlightning without having to support various example languages by PerlPoint directly, I thought a general solution might meet such needs. So now users can declare \I<paragraph filters> which means they declare that certain paragraphs should be passed to a specified piece of code when parsed. This is, obviously, Active Content. The filters results must be valid PerlPoint which will then be reparsed.

So finally those filters are there. Here is a complete example to demonstrate how this feature can be used. The example document contains a verbatim block of Perl code, which is made a block by a user filter. The simple filter marks all Perl comments bold (using a straight forward comment detection).

// define the paragraph filter
\\EMBED{lang=perl}

sub formatComments
{
# $main::pfilterText is used to
pass the paragraph content
$main::
pfilterText=~s/(.+)$/\\\\B<$1>/mg; $main::_pfilterText;
}

\\END_EMBED

Now, an example in a verbatim block paragraph:

\B<||formatComments||><<EOM

# 1st comment
This is my example. # 2nd comment

Continued.

# another comment
$c=5+10;

EOM

Example completed.

Please note the preamble which installs the filter to use.

Here is another filter that automatically numbers example lines:

sub filter2
{
# init line counter
my $c;

# transform example text
my $t=$main::_pfilterText;
$t=~s/^([ \t]*)/join('', ' ', ++$c, ": $1")/mge;

# provide result
$t;
}

Filters can be chained by using a single pipe character:

||markComments\B<|>numberLines||<<EOM

...

EOM

To try this successfully, Active Content has to be enabled (converter option \C<-active>). If Active Content is disabled, filters cannot be installed. (Copy the example from a converters result, not from this Changelog source to avoid backslash trouble.)

Paragraph filters can be assigned to almost all types of paragraphs, not only verbatim blocks. But because they work after a paragraph is processed, they make no sense for paragraphs which do not produce output directly. So filters are not allowed for conditions, alias definitions and variable assignments (for grammatical reasons filters \I<can> be assigned to the last mentioned paragraph type, but I hope to fix this in future releases).

There is no loop check currently. If a filter produces a filtered paragraph, things might end in an endless loop.

As always, feedback is highly appreciated. Documentation and tests are planned to be added.

==pp2sdf

==New demo converter pp2ppresenter

The first XML converter is here, producing input for PPresenter's XML interface. PPresenter is a Perl/Tk presentation software by Mark Overmeer, with an XML interface by Johan Vromans. See ppresenter.org for details about this software.

This demo is not complete yet, but I hope Mark will take it over ;-)

The XML generation is by no means perfect, but a first proof of XML generation from PerlPoint. Suggestions are very welcome, as there are various more presenters using XML.

As with all demos feel free to make this a starting point of an own converter. Just let us know.

==Docs

==Misc

          \B<org.: \\IM{src="blibblub.gif"}
          exp.: \\B<\\C<\\I<\\IMAGE{src "blibblub.gif"}\>\>\>
                                   ^
          _________________________|>

=0.35

This is a minor update, but it is strongly recommended. You will especially enjoy it in case you are running perl 5.00503 or Windows (or both ;-).

==Bugfixes

==Features

==Docs

=0.34

\B<This is a major release.> It needs adapted translators. Old fashioned converters will stop working after installation of package version 0.34.

==Bugfixes

      My tag \\I<encloses
      line breaks>.

\I<formerly transformed into>

E: My tag {{I:encloses
E: line breaks}}.

\I<is now made the valid SDF code>

E: My tag {{I:encloses\B<}}>
E: \B<{{I:>line breaks}}.

==Features

===Tags and macros

? flagSet(overviewMode)

\\B<Short Overview>

This document will give you an impression.

// ready in overview mode
\B<\\READY>

? 1

// usual document

===Performance

===Cache

===Docs

===Tables

===Variables

? varValue('\B<SOURCELEVEL>')==1

$München=Munich

He comes from $München.

===Active contents

===Misc

<<EOE

# up to 0.34
\I<\<>
\B<5\<=\>10>

# with 0.34 and above
\I<<>
\B<5<=\>10>

EOE

? exists $PerlPoint->{userSettings}{myFlag}

new

? \B<flagSet(>myFlag\B<)>

? \B<varValue(>'privateVar'\B<)> eq 'confidental'

==pp2sdf

=0.33

==Bugfixes

==Features

==pp2sdf

=0.32

==Bugfixes

==Features

=0.31

==Bugfixes

==Features

\\INCLUDE{type=pp file="macros.pp" \B<smart=1>}

==pp2sdf

Remember: think twice.

=0.30

==Bugfixes

>

<

==Features

This is \\\\no_tag, be sure!

This is \\no_tag, be sure!

This is \\\\NO_TAG, be sure!

==Internals

==pp2sdf

=0.29

==Features

<<EOE

\I<$var-\>{key}>
\I<\B<$var-\>{key}>>
EOE

<<EOE

\I<$var-\>{key}>
\MACRO<\I<$var-\\\>{key}>>
\MACRO<\MACRO<\I<$var-\\\\\\\>{key}>>> EOE

<<EOE

\I<$var-\>{key}>
\I<\B<$var-\>{key}>>

\MACRO<\I<$var-\>{key}>>
\MACRO<\MACRO<\I<$var-\>{key}>>>
EOE

==pp2sdf

=0.28

=0.27

=0.26

==Bugfixes

==Features

\\INCLUDE{type=pp file="\B<subdir/>subdoc.pp"}

\\INCLUDE{type=pp file="subdoc.pp"}

==pp2sdf

=0.25

=0.24

=0.23

=0.22

=0.21

=0.20

=0.19

=0.18

=0.17

=0.16

=0.15

=0.14

=0.13

=0.12

=0.11

=0.10

=0.09