summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes 'josch' Schauer <josch@debian.org>2019-01-27 13:56:24 +0100
committerJohannes 'josch' Schauer <josch@debian.org>2019-01-27 13:56:33 +0100
commit6ce553563bc795f389f639a3a8cdfe356de71441 (patch)
treeda4c9ede3087ca534d93bc1ac5a14f044f036600
parentbbefa170378553e5a6e0d72e4d52328b61f3e8ac (diff)
new upstream version 6.0
-rw-r--r--.dockerignore93
-rw-r--r--.gitignore128
-rw-r--r--.travis.yml327
-rw-r--r--CHANGELOG220
-rw-r--r--COPYING53
-rw-r--r--COPYING.LESSER165
-rw-r--r--ChangeLog231
-rw-r--r--Dockerfile22
-rw-r--r--Doxyfile2397
-rw-r--r--LICENSE827
-rw-r--r--LICENSE.FuzzyLite634
-rw-r--r--NEWS321
-rw-r--r--README.md642
-rw-r--r--THANKS22
-rw-r--r--appveyor.yml40
-rw-r--r--documentation/ui/figure.R491
-rw-r--r--documentation/ui/figure/bell.svg260
-rw-r--r--documentation/ui/figure/binary.svg261
-rw-r--r--documentation/ui/figure/concave.svg253
-rw-r--r--documentation/ui/figure/cosine.svg260
-rw-r--r--documentation/ui/figure/discrete.svg310
-rw-r--r--documentation/ui/figure/gaussian.svg260
-rw-r--r--documentation/ui/figure/gaussianProduct.svg264
-rw-r--r--documentation/ui/figure/piShape.svg260
-rw-r--r--documentation/ui/figure/power.svg227
-rw-r--r--documentation/ui/figure/ramp.svg261
-rw-r--r--documentation/ui/figure/rectangle.svg260
-rw-r--r--documentation/ui/figure/sShape.svg260
-rw-r--r--documentation/ui/figure/sigmoid.svg261
-rw-r--r--documentation/ui/figure/sigmoidDifference.svg260
-rw-r--r--documentation/ui/figure/sigmoidProduct.svg252
-rw-r--r--documentation/ui/figure/spike.svg260
-rw-r--r--documentation/ui/figure/terms.svg4955
-rw-r--r--documentation/ui/figure/trapezoid.svg260
-rw-r--r--documentation/ui/figure/triangle.svg260
-rw-r--r--documentation/ui/figure/zShape.svg260
-rw-r--r--documentation/ui/footer.html22
-rw-r--r--documentation/ui/header.html77
-rw-r--r--documentation/ui/image/android-chrome-144x144.pngbin0 -> 6532 bytes
-rw-r--r--documentation/ui/image/android-chrome-192x192.pngbin0 -> 8956 bytes
-rw-r--r--documentation/ui/image/android-chrome-36x36.pngbin0 -> 1735 bytes
-rw-r--r--documentation/ui/image/android-chrome-48x48.pngbin0 -> 2280 bytes
-rw-r--r--documentation/ui/image/android-chrome-72x72.pngbin0 -> 3171 bytes
-rw-r--r--documentation/ui/image/android-chrome-96x96.pngbin0 -> 4447 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon-114x114.pngbin0 -> 6890 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon-120x120.pngbin0 -> 7417 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon-144x144.pngbin0 -> 8862 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon-152x152.pngbin0 -> 9766 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon-180x180.pngbin0 -> 11090 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon-57x57.pngbin0 -> 3699 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon-60x60.pngbin0 -> 3861 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon-72x72.pngbin0 -> 4563 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon-76x76.pngbin0 -> 5054 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon-precomposed.pngbin0 -> 12911 bytes
-rw-r--r--documentation/ui/image/apple-touch-icon.pngbin0 -> 11090 bytes
-rw-r--r--documentation/ui/image/browserconfig.xml12
-rw-r--r--documentation/ui/image/favicon-16x16.pngbin0 -> 813 bytes
-rw-r--r--documentation/ui/image/favicon-32x32.pngbin0 -> 1502 bytes
-rw-r--r--documentation/ui/image/favicon-96x96.pngbin0 -> 4447 bytes
-rw-r--r--documentation/ui/image/favicon.icobin0 -> 15086 bytes
-rw-r--r--documentation/ui/image/manifest.json41
-rw-r--r--documentation/ui/image/mstile-144x144.pngbin0 -> 6557 bytes
-rw-r--r--documentation/ui/image/mstile-150x150.pngbin0 -> 6806 bytes
-rw-r--r--documentation/ui/image/mstile-310x150.pngbin0 -> 7390 bytes
-rw-r--r--documentation/ui/image/mstile-310x310.pngbin0 -> 14321 bytes
-rw-r--r--documentation/ui/image/mstile-70x70.pngbin0 -> 4487 bytes
-rw-r--r--documentation/ui/image/safari-pinned-tab.svg28
-rw-r--r--documentation/ui/stylesheet.css0
-rw-r--r--examples/application/CMakeLists.txt140
-rwxr-xr-xexamples/application/clean.sh1
-rw-r--r--examples/application/compile.bat24
-rwxr-xr-xexamples/application/compile.sh25
-rw-r--r--examples/application/src/main.cpp16
-rw-r--r--examples/examples.R16
-rwxr-xr-xexamples/examples.matbin1062107 -> 0 bytes
-rw-r--r--examples/hybrid/ObstacleAvoidance.R86
-rw-r--r--examples/hybrid/ObstacleAvoidance.cpp75
-rw-r--r--examples/hybrid/ObstacleAvoidance.fcl49
-rw-r--r--examples/hybrid/ObstacleAvoidance.fis43
-rw-r--r--examples/hybrid/ObstacleAvoidance.fld1025
-rw-r--r--examples/hybrid/ObstacleAvoidance.fll43
-rw-r--r--examples/hybrid/ObstacleAvoidance.java86
-rw-r--r--examples/hybrid/ObstacleAvoidance.pdfbin0 -> 45584 bytes
-rw-r--r--examples/hybrid/tipper.R109
-rw-r--r--examples/hybrid/tipper.cpp92
-rw-r--r--examples/hybrid/tipper.fcl66
-rw-r--r--examples/hybrid/tipper.fis57
-rw-r--r--examples/hybrid/tipper.fld1025
-rw-r--r--examples/hybrid/tipper.fll63
-rw-r--r--examples/hybrid/tipper.java103
-rw-r--r--examples/hybrid/tipper.pdfbin0 -> 32309 bytes
-rw-r--r--examples/mamdani/AllTerms.R111
-rw-r--r--examples/mamdani/AllTerms.cpp164
-rw-r--r--examples/mamdani/AllTerms.fcl4
-rw-r--r--examples/mamdani/AllTerms.fis5
-rw-r--r--examples/mamdani/AllTerms.fld2051
-rw-r--r--examples/mamdani/AllTerms.fll10
-rw-r--r--examples/mamdani/AllTerms.java125
-rw-r--r--examples/mamdani/AllTerms.pdfbin0 -> 24280 bytes
-rw-r--r--examples/mamdani/Laundry.R91
-rw-r--r--examples/mamdani/Laundry.cpp105
-rw-r--r--examples/mamdani/Laundry.fcl20
-rw-r--r--examples/mamdani/Laundry.fis51
-rw-r--r--examples/mamdani/Laundry.fld2051
-rw-r--r--examples/mamdani/Laundry.fll31
-rw-r--r--examples/mamdani/Laundry.java106
-rw-r--r--examples/mamdani/Laundry.pdfbin0 -> 30166 bytes
-rw-r--r--examples/mamdani/ObstacleAvoidance.R57
-rw-r--r--examples/mamdani/ObstacleAvoidance.cpp49
-rw-r--r--examples/mamdani/ObstacleAvoidance.fcl34
-rw-r--r--examples/mamdani/ObstacleAvoidance.fis32
-rw-r--r--examples/mamdani/ObstacleAvoidance.fld1025
-rw-r--r--examples/mamdani/ObstacleAvoidance.fll25
-rw-r--r--examples/mamdani/ObstacleAvoidance.java60
-rw-r--r--examples/mamdani/ObstacleAvoidance.pdfbin0 -> 25210 bytes
-rw-r--r--examples/mamdani/SimpleDimmer.R60
-rw-r--r--examples/mamdani/SimpleDimmer.cpp66
-rw-r--r--examples/mamdani/SimpleDimmer.fcl4
-rw-r--r--examples/mamdani/SimpleDimmer.fis9
-rw-r--r--examples/mamdani/SimpleDimmer.fld2051
-rw-r--r--examples/mamdani/SimpleDimmer.fll10
-rw-r--r--examples/mamdani/SimpleDimmer.java57
-rw-r--r--examples/mamdani/SimpleDimmer.pdfbin0 -> 22872 bytes
-rw-r--r--examples/mamdani/SimpleDimmerChained.R85
-rw-r--r--examples/mamdani/SimpleDimmerChained.cpp70
-rw-r--r--examples/mamdani/SimpleDimmerChained.fcl51
-rw-r--r--examples/mamdani/SimpleDimmerChained.fis46
-rw-r--r--examples/mamdani/SimpleDimmerChained.fld1025
-rw-r--r--examples/mamdani/SimpleDimmerChained.fll14
-rw-r--r--examples/mamdani/SimpleDimmerChained.java81
-rw-r--r--examples/mamdani/SimpleDimmerChained.pdfbin0 -> 42431 bytes
-rw-r--r--examples/mamdani/SimpleDimmerInverse.R85
-rw-r--r--examples/mamdani/SimpleDimmerInverse.cpp105
-rw-r--r--examples/mamdani/SimpleDimmerInverse.fcl4
-rw-r--r--examples/mamdani/SimpleDimmerInverse.fis46
-rw-r--r--examples/mamdani/SimpleDimmerInverse.fld2051
-rw-r--r--examples/mamdani/SimpleDimmerInverse.fll14
-rw-r--r--examples/mamdani/SimpleDimmerInverse.java84
-rw-r--r--examples/mamdani/SimpleDimmerInverse.pdfbin0 -> 41795 bytes
-rw-r--r--examples/mamdani/octave/investment_portfolio.R67
-rw-r--r--examples/mamdani/octave/investment_portfolio.cpp84
-rw-r--r--examples/mamdani/octave/investment_portfolio.fcl4
-rw-r--r--examples/mamdani/octave/investment_portfolio.fis5
-rw-r--r--examples/mamdani/octave/investment_portfolio.fld2051
-rw-r--r--examples/mamdani/octave/investment_portfolio.fll11
-rw-r--r--examples/mamdani/octave/investment_portfolio.java77
-rw-r--r--examples/mamdani/octave/investment_portfolio.pdfbin0 -> 19163 bytes
-rw-r--r--examples/mamdani/octave/mamdani_tip_calculator.R90
-rw-r--r--examples/mamdani/octave/mamdani_tip_calculator.cpp105
-rw-r--r--examples/mamdani/octave/mamdani_tip_calculator.fcl4
-rw-r--r--examples/mamdani/octave/mamdani_tip_calculator.fis7
-rw-r--r--examples/mamdani/octave/mamdani_tip_calculator.fld2051
-rw-r--r--examples/mamdani/octave/mamdani_tip_calculator.fll15
-rw-r--r--examples/mamdani/octave/mamdani_tip_calculator.java98
-rw-r--r--examples/mamdani/octave/mamdani_tip_calculator.pdfbin0 -> 31675 bytes
-rw-r--r--examples/original/mamdani/AllTerms.fll9
-rw-r--r--examples/original/mamdani/Laundry.fll9
-rw-r--r--examples/original/mamdani/SimpleDimmer.fll9
-rw-r--r--examples/original/mamdani/SimpleDimmerInverse.fll11
-rw-r--r--examples/original/mamdani/octave/investment_portfolio.fll9
-rw-r--r--examples/original/mamdani/octave/mamdani_tip_calculator.fll11
-rw-r--r--examples/original/takagi-sugeno/SimpleDimmer.fll7
-rw-r--r--examples/original/takagi-sugeno/approximation.fll11
-rw-r--r--examples/original/takagi-sugeno/octave/cubic_approximator.fll7
-rw-r--r--examples/original/takagi-sugeno/octave/heart_disease_risk.fll7
-rw-r--r--examples/original/takagi-sugeno/octave/linear_tip_calculator.fll7
-rw-r--r--examples/original/takagi-sugeno/octave/sugeno_tip_calculator.fll11
-rw-r--r--examples/original/tsukamoto/tsukamoto.fll15
-rw-r--r--examples/takagi-sugeno/ObstacleAvoidance.R57
-rw-r--r--examples/takagi-sugeno/ObstacleAvoidance.cpp49
-rw-r--r--examples/takagi-sugeno/ObstacleAvoidance.fcl33
-rw-r--r--examples/takagi-sugeno/ObstacleAvoidance.fis32
-rw-r--r--examples/takagi-sugeno/ObstacleAvoidance.fld1025
-rw-r--r--examples/takagi-sugeno/ObstacleAvoidance.fll25
-rw-r--r--examples/takagi-sugeno/ObstacleAvoidance.java60
-rw-r--r--examples/takagi-sugeno/ObstacleAvoidance.pdfbin0 -> 25090 bytes
-rw-r--r--examples/takagi-sugeno/SimpleDimmer.R60
-rw-r--r--examples/takagi-sugeno/SimpleDimmer.cpp66
-rw-r--r--examples/takagi-sugeno/SimpleDimmer.fcl4
-rw-r--r--examples/takagi-sugeno/SimpleDimmer.fis13
-rw-r--r--examples/takagi-sugeno/SimpleDimmer.fld2051
-rw-r--r--examples/takagi-sugeno/SimpleDimmer.fll10
-rw-r--r--examples/takagi-sugeno/SimpleDimmer.java57
-rw-r--r--examples/takagi-sugeno/SimpleDimmer.pdfbin0 -> 22975 bytes
-rw-r--r--examples/takagi-sugeno/approximation.R119
-rw-r--r--examples/takagi-sugeno/approximation.cpp146
-rw-r--r--examples/takagi-sugeno/approximation.fcl4
-rw-r--r--examples/takagi-sugeno/approximation.fis15
-rw-r--r--examples/takagi-sugeno/approximation.fld2051
-rw-r--r--examples/takagi-sugeno/approximation.fll18
-rw-r--r--examples/takagi-sugeno/approximation.java127
-rw-r--r--examples/takagi-sugeno/approximation.pdfbin0 -> 65783 bytes
-rw-r--r--examples/takagi-sugeno/octave/cubic_approximator.R84
-rw-r--r--examples/takagi-sugeno/octave/cubic_approximator.cpp110
-rw-r--r--examples/takagi-sugeno/octave/cubic_approximator.fcl4
-rw-r--r--examples/takagi-sugeno/octave/cubic_approximator.fis13
-rw-r--r--examples/takagi-sugeno/octave/cubic_approximator.fld2051
-rw-r--r--examples/takagi-sugeno/octave/cubic_approximator.fll10
-rw-r--r--examples/takagi-sugeno/octave/cubic_approximator.java89
-rw-r--r--examples/takagi-sugeno/octave/cubic_approximator.pdfbin0 -> 24950 bytes
-rw-r--r--examples/takagi-sugeno/octave/heart_disease_risk.R84
-rw-r--r--examples/takagi-sugeno/octave/heart_disease_risk.cpp112
-rw-r--r--examples/takagi-sugeno/octave/heart_disease_risk.fcl4
-rw-r--r--examples/takagi-sugeno/octave/heart_disease_risk.fis11
-rw-r--r--examples/takagi-sugeno/octave/heart_disease_risk.fld2051
-rw-r--r--examples/takagi-sugeno/octave/heart_disease_risk.fll11
-rw-r--r--examples/takagi-sugeno/octave/heart_disease_risk.java83
-rw-r--r--examples/takagi-sugeno/octave/heart_disease_risk.pdfbin0 -> 16865 bytes
-rw-r--r--examples/takagi-sugeno/octave/linear_tip_calculator.R67
-rw-r--r--examples/takagi-sugeno/octave/linear_tip_calculator.cpp84
-rw-r--r--examples/takagi-sugeno/octave/linear_tip_calculator.fcl4
-rw-r--r--examples/takagi-sugeno/octave/linear_tip_calculator.fis11
-rw-r--r--examples/takagi-sugeno/octave/linear_tip_calculator.fld2051
-rw-r--r--examples/takagi-sugeno/octave/linear_tip_calculator.fll11
-rw-r--r--examples/takagi-sugeno/octave/linear_tip_calculator.java77
-rw-r--r--examples/takagi-sugeno/octave/linear_tip_calculator.pdfbin0 -> 18236 bytes
-rw-r--r--examples/takagi-sugeno/octave/sugeno_tip_calculator.R119
-rw-r--r--examples/takagi-sugeno/octave/sugeno_tip_calculator.cpp144
-rw-r--r--examples/takagi-sugeno/octave/sugeno_tip_calculator.fcl4
-rw-r--r--examples/takagi-sugeno/octave/sugeno_tip_calculator.fis11
-rw-r--r--examples/takagi-sugeno/octave/sugeno_tip_calculator.fld2051
-rw-r--r--examples/takagi-sugeno/octave/sugeno_tip_calculator.fll19
-rw-r--r--examples/takagi-sugeno/octave/sugeno_tip_calculator.java125
-rw-r--r--examples/takagi-sugeno/octave/sugeno_tip_calculator.pdfbin0 -> 41451 bytes
-rw-r--r--examples/tsukamoto/tsukamoto.R126
-rw-r--r--examples/tsukamoto/tsukamoto.cpp143
-rw-r--r--examples/tsukamoto/tsukamoto.fcl4
-rw-r--r--examples/tsukamoto/tsukamoto.fis13
-rw-r--r--examples/tsukamoto/tsukamoto.fld2051
-rw-r--r--examples/tsukamoto/tsukamoto.fll22
-rw-r--r--examples/tsukamoto/tsukamoto.java138
-rw-r--r--examples/tsukamoto/tsukamoto.pdfbin0 -> 85574 bytes
-rw-r--r--fuzzylite.pngbin2883 -> 262929 bytes
-rw-r--r--fuzzylite.svg42
-rw-r--r--fuzzylite/CMakeLists.txt163
-rw-r--r--fuzzylite/FL_HEADERS21
-rw-r--r--fuzzylite/FL_SOURCES23
-rw-r--r--fuzzylite/FL_TESTS16
-rw-r--r--fuzzylite/build.bat35
-rwxr-xr-xfuzzylite/build.sh42
-rw-r--r--fuzzylite/fl/Benchmark.h400
-rw-r--r--fuzzylite/fl/Complexity.h297
-rw-r--r--fuzzylite/fl/Console.h143
-rw-r--r--fuzzylite/fl/Engine.h428
-rw-r--r--fuzzylite/fl/Exception.h110
-rw-r--r--fuzzylite/fl/Headers.h49
-rw-r--r--fuzzylite/fl/Operation.h1011
-rw-r--r--fuzzylite/fl/activation/Activation.h95
-rw-r--r--fuzzylite/fl/activation/First.h104
-rw-r--r--fuzzylite/fl/activation/General.h73
-rw-r--r--fuzzylite/fl/activation/Highest.h86
-rw-r--r--fuzzylite/fl/activation/Last.h103
-rw-r--r--fuzzylite/fl/activation/Lowest.h87
-rw-r--r--fuzzylite/fl/activation/Proportional.h71
-rw-r--r--fuzzylite/fl/activation/Threshold.h183
-rw-r--r--fuzzylite/fl/defuzzifier/Bisector.h47
-rw-r--r--fuzzylite/fl/defuzzifier/Centroid.h48
-rw-r--r--fuzzylite/fl/defuzzifier/Defuzzifier.h59
-rw-r--r--fuzzylite/fl/defuzzifier/IntegralDefuzzifier.h62
-rw-r--r--fuzzylite/fl/defuzzifier/LargestOfMaximum.h50
-rw-r--r--fuzzylite/fl/defuzzifier/MeanOfMaximum.h49
-rw-r--r--fuzzylite/fl/defuzzifier/SmallestOfMaximum.h49
-rw-r--r--fuzzylite/fl/defuzzifier/WeightedAverage.h51
-rw-r--r--fuzzylite/fl/defuzzifier/WeightedAverageCustom.h77
-rw-r--r--fuzzylite/fl/defuzzifier/WeightedDefuzzifier.h81
-rw-r--r--fuzzylite/fl/defuzzifier/WeightedSum.h51
-rw-r--r--fuzzylite/fl/defuzzifier/WeightedSumCustom.h78
-rw-r--r--fuzzylite/fl/factory/ActivationFactory.h46
-rw-r--r--fuzzylite/fl/factory/CloningFactory.h198
-rw-r--r--fuzzylite/fl/factory/ConstructionFactory.h180
-rw-r--r--fuzzylite/fl/factory/DefuzzifierFactory.h56
-rw-r--r--fuzzylite/fl/factory/FactoryManager.h131
-rw-r--r--fuzzylite/fl/factory/FunctionFactory.h44
-rw-r--r--fuzzylite/fl/factory/HedgeFactory.h32
-rw-r--r--fuzzylite/fl/factory/SNormFactory.h32
-rw-r--r--fuzzylite/fl/factory/TNormFactory.h32
-rw-r--r--fuzzylite/fl/factory/TermFactory.h32
-rw-r--r--fuzzylite/fl/fuzzylite.h341
-rw-r--r--fuzzylite/fl/hedge/Any.h47
-rw-r--r--fuzzylite/fl/hedge/Extremely.h53
-rw-r--r--fuzzylite/fl/hedge/Hedge.h56
-rw-r--r--fuzzylite/fl/hedge/HedgeFunction.h82
-rw-r--r--fuzzylite/fl/hedge/Not.h43
-rw-r--r--fuzzylite/fl/hedge/Seldom.h48
-rw-r--r--fuzzylite/fl/hedge/Somewhat.h44
-rw-r--r--fuzzylite/fl/hedge/Very.h42
-rw-r--r--fuzzylite/fl/imex/CppExporter.h139
-rw-r--r--fuzzylite/fl/imex/Exporter.h52
-rw-r--r--fuzzylite/fl/imex/FclExporter.h79
-rw-r--r--fuzzylite/fl/imex/FclImporter.h32
-rw-r--r--fuzzylite/fl/imex/FisExporter.h87
-rw-r--r--fuzzylite/fl/imex/FisImporter.h47
-rw-r--r--fuzzylite/fl/imex/FldExporter.h218
-rw-r--r--fuzzylite/fl/imex/FllExporter.h119
-rw-r--r--fuzzylite/fl/imex/FllImporter.h48
-rw-r--r--fuzzylite/fl/imex/Importer.h53
-rw-r--r--fuzzylite/fl/imex/JavaExporter.h124
-rw-r--r--fuzzylite/fl/imex/RScriptExporter.h246
-rw-r--r--fuzzylite/fl/norm/Norm.h56
-rw-r--r--fuzzylite/fl/norm/SNorm.h36
-rw-r--r--fuzzylite/fl/norm/TNorm.h35
-rw-r--r--fuzzylite/fl/norm/s/AlgebraicSum.h49
-rw-r--r--fuzzylite/fl/norm/s/BoundedSum.h45
-rw-r--r--fuzzylite/fl/norm/s/DrasticSum.h50
-rw-r--r--fuzzylite/fl/norm/s/EinsteinSum.h46
-rw-r--r--fuzzylite/fl/norm/s/HamacherSum.h46
-rw-r--r--fuzzylite/fl/norm/s/Maximum.h46
-rw-r--r--fuzzylite/fl/norm/s/NilpotentMaximum.h47
-rw-r--r--fuzzylite/fl/norm/s/NormalizedSum.h44
-rw-r--r--fuzzylite/fl/norm/s/SNormFunction.h81
-rw-r--r--fuzzylite/fl/norm/s/UnboundedSum.h52
-rw-r--r--fuzzylite/fl/norm/t/AlgebraicProduct.h47
-rw-r--r--fuzzylite/fl/norm/t/BoundedDifference.h46
-rw-r--r--fuzzylite/fl/norm/t/DrasticProduct.h50
-rw-r--r--fuzzylite/fl/norm/t/EinsteinProduct.h47
-rw-r--r--fuzzylite/fl/norm/t/HamacherProduct.h46
-rw-r--r--fuzzylite/fl/norm/t/Minimum.h45
-rw-r--r--fuzzylite/fl/norm/t/NilpotentMinimum.h48
-rw-r--r--fuzzylite/fl/norm/t/TNormFunction.h81
-rw-r--r--fuzzylite/fl/rule/Antecedent.h150
-rw-r--r--fuzzylite/fl/rule/Consequent.h116
-rw-r--r--fuzzylite/fl/rule/Expression.h93
-rw-r--r--fuzzylite/fl/rule/Rule.h264
-rw-r--r--fuzzylite/fl/rule/RuleBlock.h194
-rw-r--r--fuzzylite/fl/term/Accumulated.h94
-rw-r--r--fuzzylite/fl/term/Activated.h84
-rw-r--r--fuzzylite/fl/term/Aggregated.h212
-rw-r--r--fuzzylite/fl/term/Bell.h80
-rw-r--r--fuzzylite/fl/term/Binary.h132
-rw-r--r--fuzzylite/fl/term/Concave.h84
-rw-r--r--fuzzylite/fl/term/Constant.h57
-rw-r--r--fuzzylite/fl/term/Cosine.h75
-rw-r--r--fuzzylite/fl/term/Discrete.h245
-rw-r--r--fuzzylite/fl/term/Function.h312
-rw-r--r--fuzzylite/fl/term/Gaussian.h74
-rw-r--r--fuzzylite/fl/term/GaussianProduct.h101
-rw-r--r--fuzzylite/fl/term/Linear.h151
-rw-r--r--fuzzylite/fl/term/PiShape.h105
-rw-r--r--fuzzylite/fl/term/Ramp.h101
-rw-r--r--fuzzylite/fl/term/Rectangle.h74
-rw-r--r--fuzzylite/fl/term/SShape.h81
-rw-r--r--fuzzylite/fl/term/Sigmoid.h88
-rw-r--r--fuzzylite/fl/term/SigmoidDifference.h90
-rw-r--r--fuzzylite/fl/term/SigmoidProduct.h91
-rw-r--r--fuzzylite/fl/term/Spike.h70
-rw-r--r--fuzzylite/fl/term/Term.h136
-rw-r--r--fuzzylite/fl/term/Trapezoid.h94
-rw-r--r--fuzzylite/fl/term/Triangle.h84
-rw-r--r--fuzzylite/fl/term/ZShape.h80
-rw-r--r--fuzzylite/fl/variable/InputVariable.h48
-rw-r--r--fuzzylite/fl/variable/OutputVariable.h214
-rw-r--r--fuzzylite/fl/variable/Variable.h254
-rw-r--r--fuzzylite/fuzzylite.doxygen1781
-rw-r--r--fuzzylite/fuzzylite.pc.in4
-rw-r--r--fuzzylite/src/Benchmark.cpp460
-rw-r--r--fuzzylite/src/Complexity.cpp283
-rw-r--r--fuzzylite/src/Console.cpp809
-rw-r--r--fuzzylite/src/Engine.cpp418
-rw-r--r--fuzzylite/src/Exception.cpp89
-rw-r--r--fuzzylite/src/Operation.cpp477
-rw-r--r--fuzzylite/src/activation/First.cpp122
-rw-r--r--fuzzylite/src/activation/General.cpp77
-rw-r--r--fuzzylite/src/activation/Highest.cpp120
-rw-r--r--fuzzylite/src/activation/Last.cpp121
-rw-r--r--fuzzylite/src/activation/Lowest.cpp122
-rw-r--r--fuzzylite/src/activation/Proportional.cpp91
-rw-r--r--fuzzylite/src/activation/Threshold.cpp170
-rw-r--r--fuzzylite/src/defuzzifier/Bisector.cpp59
-rw-r--r--fuzzylite/src/defuzzifier/Centroid.cpp66
-rw-r--r--fuzzylite/src/defuzzifier/IntegralDefuzzifier.cpp31
-rw-r--r--fuzzylite/src/defuzzifier/LargestOfMaximum.cpp48
-rw-r--r--fuzzylite/src/defuzzifier/MeanOfMaximum.cpp53
-rw-r--r--fuzzylite/src/defuzzifier/SmallestOfMaximum.cpp50
-rw-r--r--fuzzylite/src/defuzzifier/WeightedAverage.cpp119
-rw-r--r--fuzzylite/src/defuzzifier/WeightedAverageCustom.cpp117
-rw-r--r--fuzzylite/src/defuzzifier/WeightedDefuzzifier.cpp130
-rw-r--r--fuzzylite/src/defuzzifier/WeightedSum.cpp116
-rw-r--r--fuzzylite/src/defuzzifier/WeightedSumCustom.cpp112
-rw-r--r--fuzzylite/src/factory/ActivationFactory.cpp42
-rw-r--r--fuzzylite/src/factory/CloningFactory.cpp135
-rw-r--r--fuzzylite/src/factory/ConstructionFactory.cpp114
-rw-r--r--fuzzylite/src/factory/DefuzzifierFactory.cpp31
-rw-r--r--fuzzylite/src/factory/FactoryManager.cpp72
-rw-r--r--fuzzylite/src/factory/FunctionFactory.cpp129
-rw-r--r--fuzzylite/src/factory/HedgeFactory.cpp27
-rw-r--r--fuzzylite/src/factory/SNormFactory.cpp29
-rw-r--r--fuzzylite/src/factory/TNormFactory.cpp27
-rw-r--r--fuzzylite/src/factory/TermFactory.cpp31
-rw-r--r--fuzzylite/src/fuzzylite.cpp101
-rw-r--r--fuzzylite/src/hedge/Any.cpp35
-rw-r--r--fuzzylite/src/hedge/Extremely.cpp30
-rw-r--r--fuzzylite/src/hedge/HedgeFunction.cpp63
-rw-r--r--fuzzylite/src/hedge/Not.cpp27
-rw-r--r--fuzzylite/src/hedge/Seldom.cpp31
-rw-r--r--fuzzylite/src/hedge/Somewhat.cpp26
-rw-r--r--fuzzylite/src/hedge/Very.cpp26
-rw-r--r--fuzzylite/src/imex/CppExporter.cpp181
-rw-r--r--fuzzylite/src/imex/Exporter.cpp32
-rw-r--r--fuzzylite/src/imex/FclExporter.cpp126
-rw-r--r--fuzzylite/src/imex/FclImporter.cpp164
-rw-r--r--fuzzylite/src/imex/FisExporter.cpp180
-rw-r--r--fuzzylite/src/imex/FisImporter.cpp235
-rw-r--r--fuzzylite/src/imex/FldExporter.cpp246
-rw-r--r--fuzzylite/src/imex/FllExporter.cpp85
-rw-r--r--fuzzylite/src/imex/FllImporter.cpp193
-rw-r--r--fuzzylite/src/imex/Importer.cpp32
-rw-r--r--fuzzylite/src/imex/JavaExporter.cpp157
-rw-r--r--fuzzylite/src/imex/RScriptExporter.cpp234
-rwxr-xr-xfuzzylite/src/m/compare.m60
-rwxr-xr-xfuzzylite/src/m/compare_examples.m45
-rw-r--r--fuzzylite/src/main.cpp73
-rw-r--r--fuzzylite/src/norm/s/AlgebraicSum.cpp26
-rw-r--r--fuzzylite/src/norm/s/BoundedSum.cpp28
-rw-r--r--fuzzylite/src/norm/s/DrasticSum.cpp28
-rw-r--r--fuzzylite/src/norm/s/EinsteinSum.cpp26
-rw-r--r--fuzzylite/src/norm/s/HamacherSum.cpp29
-rw-r--r--fuzzylite/src/norm/s/Maximum.cpp28
-rw-r--r--fuzzylite/src/norm/s/NilpotentMaximum.cpp32
-rw-r--r--fuzzylite/src/norm/s/NormalizedSum.cpp31
-rw-r--r--fuzzylite/src/norm/s/SNormFunction.cpp65
-rw-r--r--fuzzylite/src/norm/s/UnboundedSum.cpp43
-rw-r--r--fuzzylite/src/norm/t/AlgebraicProduct.cpp26
-rw-r--r--fuzzylite/src/norm/t/BoundedDifference.cpp27
-rw-r--r--fuzzylite/src/norm/t/DrasticProduct.cpp28
-rw-r--r--fuzzylite/src/norm/t/EinsteinProduct.cpp26
-rw-r--r--fuzzylite/src/norm/t/HamacherProduct.cpp28
-rw-r--r--fuzzylite/src/norm/t/Minimum.cpp28
-rw-r--r--fuzzylite/src/norm/t/NilpotentMinimum.cpp29
-rw-r--r--fuzzylite/src/norm/t/TNormFunction.cpp66
-rw-r--r--fuzzylite/src/rule/Antecedent.cpp293
-rw-r--r--fuzzylite/src/rule/Consequent.cpp117
-rw-r--r--fuzzylite/src/rule/Expression.cpp48
-rw-r--r--fuzzylite/src/rule/Rule.cpp182
-rw-r--r--fuzzylite/src/rule/RuleBlock.cpp115
-rw-r--r--fuzzylite/src/term/Accumulated.cpp211
-rw-r--r--fuzzylite/src/term/Activated.cpp80
-rw-r--r--fuzzylite/src/term/Aggregated.cpp247
-rw-r--r--fuzzylite/src/term/Bell.cpp40
-rw-r--r--fuzzylite/src/term/Binary.cpp96
-rw-r--r--fuzzylite/src/term/Concave.cpp68
-rw-r--r--fuzzylite/src/term/Constant.cpp34
-rw-r--r--fuzzylite/src/term/Cosine.cpp49
-rw-r--r--fuzzylite/src/term/Discrete.cpp194
-rw-r--r--fuzzylite/src/term/Function.cpp266
-rw-r--r--fuzzylite/src/term/Gaussian.cpp48
-rw-r--r--fuzzylite/src/term/GaussianProduct.cpp59
-rw-r--r--fuzzylite/src/term/Linear.cpp94
-rw-r--r--fuzzylite/src/term/PiShape.cpp78
-rw-r--r--fuzzylite/src/term/Ramp.cpp73
-rw-r--r--fuzzylite/src/term/Rectangle.cpp44
-rw-r--r--fuzzylite/src/term/SShape.cpp74
-rw-r--r--fuzzylite/src/term/Sigmoid.cpp78
-rw-r--r--fuzzylite/src/term/SigmoidDifference.cpp44
-rw-r--r--fuzzylite/src/term/SigmoidProduct.cpp43
-rw-r--r--fuzzylite/src/term/Spike.cpp42
-rw-r--r--fuzzylite/src/term/Term.cpp55
-rw-r--r--fuzzylite/src/term/Trapezoid.cpp56
-rw-r--r--fuzzylite/src/term/Triangle.cpp58
-rw-r--r--fuzzylite/src/term/ZShape.cpp74
-rw-r--r--fuzzylite/src/variable/InputVariable.cpp44
-rw-r--r--fuzzylite/src/variable/OutputVariable.cpp185
-rw-r--r--fuzzylite/src/variable/Variable.cpp175
-rw-r--r--fuzzylite/test/BenchmarkTest.cpp131
-rw-r--r--fuzzylite/test/Catch.License23
-rw-r--r--fuzzylite/test/MainTest.cpp34
-rw-r--r--fuzzylite/test/QuickTest.cpp128
-rw-r--r--fuzzylite/test/activation/ThresholdTest.cpp65
-rw-r--r--fuzzylite/test/catch.hpp11282
-rw-r--r--fuzzylite/test/hedge/HedgeFunctionTest.cpp141
-rw-r--r--fuzzylite/test/imex/FldExporterTest.cpp45
-rw-r--r--fuzzylite/test/imex/FllImporterTest.cpp56
-rw-r--r--fuzzylite/test/imex/RScriptExporterTest.cpp103
-rw-r--r--fuzzylite/test/norm/NormFunctionTest.cpp202
-rw-r--r--fuzzylite/test/term/AggregatedTest.cpp52
-rw-r--r--fuzzylite/test/term/DiscreteTest.cpp125
-rw-r--r--fuzzylite/test/term/FunctionTest.cpp115
-rw-r--r--fuzzylite/test/term/TrapezoidTest.cpp53
-rw-r--r--fuzzylite/test/term/TriangleTest.cpp66
-rw-r--r--fuzzylite/test/variable/VariableTest.cpp74
479 files changed, 68056 insertions, 24771 deletions
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..5d73f37
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,93 @@
+#Ignore documentation to be generated by doxygen
+fuzzylite/release/
+fuzzylite/debug/
+documentation/html/
+documentation/man/
+
+# Created by https://www.gitignore.io/api/git,windows,linux,osx,netbeans,cmake
+
+### Git ###
+*.orig
+
+
+### Windows ###
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+
+### Linux ###
+*~
+
+# temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+
+### OSX ###
+*.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+nbactions.xml
+.nb-gradle/
+
+
+### CMake ###
+CMakeCache.txt
+CMakeFiles
+CMakeScripts
+Makefile
+cmake_install.cmake
+install_manifest.txt
+CTestTestfile.cmake \ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 0def275..fb98d86 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,83 @@
+# Created by https://www.gitignore.io
+
+### Linux ###
+*~
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+
+### Windows ###
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+
+### OSX ###
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+
+### C++ ###
# Compiled Object files
*.slo
*.lo
*.o
*.obj
+# Precompiled Headers
+*.gch
+*.pch
+
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
+# Fortran module files
+*.mod
+
# Compiled Static libraries
*.lai
*.la
@@ -19,3 +88,62 @@
*.exe
*.out
*.app
+
+
+### NetBeans ###
+nbproject/
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+nbactions.xml
+nb-configuration.xml
+.nb-gradle/
+
+
+### Eclipse ###
+*.pydevproject
+.metadata
+.gradle
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+
+# Eclipse Core
+.project
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# CDT-specific
+.cproject
+
+# JDT-specific (Eclipse Java Development Tools)
+.classpath
+
+# PDT-specific
+.buildpath
+
+# sbteclipse plugin
+.target
+
+# TeXlipse plugin
+.texlipse
+
+
+### CMake ###
+CMakeCache.txt
+CMakeFiles
+Makefile
+cmake_install.cmake
+install_manifest.txt
diff --git a/.travis.yml b/.travis.yml
index a22168d..71dbd88 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,144 +1,213 @@
-language: cpp
+language: generic
+dist: trusty
+sudo: required
-os:
- - linux
- - osx
+services:
+ - docker
-before_install:
-
- - if [ "$TRAVIS_OS_NAME" = "linux" ];
- then
- sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test;
- sudo add-apt-repository --yes ppa:h-rayflood/llvm;
- sudo add-apt-repository --yes ppa:andykimpe/cmake;
- sudo apt-get update -qq;
- sudo apt-get install -qq cmake;
- sudo apt-get install -qq $SUPPORT;
- sudo apt-get install -qq $PACKAGE;
- fi
-
- #setup compiler
- - export CC=${REAL_CC} CXX=${REAL_CXX}
+git:
+ depth: 1
+
+before_script:
+ - docker build -t fuzzylite -f Dockerfile --build-arg CXX_COMPILER=${CXX_COMPILER} .
script:
- - cd fuzzylite
- - mkdir -p $FL_CONF
- - cd $FL_CONF
- - cmake .. -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=$FL_CONF -DFL_BACKTRACE=ON -DFL_USE_FLOAT=$FL_USE_FLOAT -DFL_CPP11=$FL_CPP11
- - make
+ - docker run -e CXX=${CXX_COMPILER} -e FL_CPP98=${FL_CPP98} -e FL_USE_FLOAT=${FL_USE_FLOAT} -e FL_BUILD_TESTS=ON -t fuzzylite release
+
+ - docker run -e CXX=${CXX_COMPILER} -e FL_CPP98=${FL_CPP98} -e FL_USE_FLOAT=${FL_USE_FLOAT} -e FL_BUILD_TESTS=ON -t fuzzylite debug
-env:
- - ignore=this
+ - docker run -t fuzzylite documentation
matrix:
- exclude:
- - env: ignore=this
include:
-#clang-3.2
-##Debug
- - compiler: clang
- env: REAL_CC=clang-3.2 REAL_CXX=clang++-3.2 PACKAGE=clang-3.2 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=OFF FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.2 REAL_CXX=clang++-3.2 PACKAGE=clang-3.2 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=ON FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.2 REAL_CXX=clang++-3.2 PACKAGE=clang-3.2 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=OFF FL_CPP11=ON
- - compiler: clang
- env: REAL_CC=clang-3.2 REAL_CXX=clang++-3.2 PACKAGE=clang-3.2 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=ON FL_CPP11=ON
-##Release
- - compiler: clang
- env: REAL_CC=clang-3.2 REAL_CXX=clang++-3.2 PACKAGE=clang-3.2 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=OFF FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.2 REAL_CXX=clang++-3.2 PACKAGE=clang-3.2 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=ON FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.2 REAL_CXX=clang++-3.2 PACKAGE=clang-3.2 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=OFF FL_CPP11=ON
- - compiler: clang
- env: REAL_CC=clang-3.2 REAL_CXX=clang++-3.2 PACKAGE=clang-3.2 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=ON FL_CPP11=ON
-
-#clang-3.3
-##Debug
- - compiler: clang
- env: REAL_CC=clang-3.3 REAL_CXX=clang++-3.3 PACKAGE=clang-3.3 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=OFF FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.3 REAL_CXX=clang++-3.3 PACKAGE=clang-3.3 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=ON FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.3 REAL_CXX=clang++-3.3 PACKAGE=clang-3.3 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=OFF FL_CPP11=ON
- - compiler: clang
- env: REAL_CC=clang-3.3 REAL_CXX=clang++-3.3 PACKAGE=clang-3.3 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=ON FL_CPP11=ON
-##Release
- - compiler: clang
- env: REAL_CC=clang-3.3 REAL_CXX=clang++-3.3 PACKAGE=clang-3.3 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=OFF FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.3 REAL_CXX=clang++-3.3 PACKAGE=clang-3.3 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=ON FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.3 REAL_CXX=clang++-3.3 PACKAGE=clang-3.3 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=OFF FL_CPP11=ON
- - compiler: clang
- env: REAL_CC=clang-3.3 REAL_CXX=clang++-3.3 PACKAGE=clang-3.3 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=ON FL_CPP11=ON
-
-#clang-3.4
-##Debug
- - compiler: clang
- env: REAL_CC=clang-3.4 REAL_CXX=clang++-3.4 PACKAGE=clang-3.4 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=OFF FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.4 REAL_CXX=clang++-3.4 PACKAGE=clang-3.4 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=ON FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.4 REAL_CXX=clang++-3.4 PACKAGE=clang-3.4 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=OFF FL_CPP11=ON
- - compiler: clang
- env: REAL_CC=clang-3.4 REAL_CXX=clang++-3.4 PACKAGE=clang-3.4 SUPPORT=g++-4.8 FL_CONF=Debug FL_USE_FLOAT=ON FL_CPP11=ON
-##Release
- - compiler: clang
- env: REAL_CC=clang-3.4 REAL_CXX=clang++-3.4 PACKAGE=clang-3.4 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=OFF FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.4 REAL_CXX=clang++-3.4 PACKAGE=clang-3.4 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=ON FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=clang-3.4 REAL_CXX=clang++-3.4 PACKAGE=clang-3.4 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=OFF FL_CPP11=ON
- - compiler: clang
- env: REAL_CC=clang-3.4 REAL_CXX=clang++-3.4 PACKAGE=clang-3.4 SUPPORT=g++-4.8 FL_CONF=Release FL_USE_FLOAT=ON FL_CPP11=ON
-
-
-#gcc-4.7
-##Debug
- - compiler: clang
- env: REAL_CC=gcc-4.7 REAL_CXX=g++-4.7 PACKAGE=g++-4.7 SUPPORT= FL_CONF=Debug FL_USE_FLOAT=OFF FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=gcc-4.7 REAL_CXX=g++-4.7 PACKAGE=g++-4.7 SUPPORT= FL_CONF=Debug FL_USE_FLOAT=ON FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=gcc-4.7 REAL_CXX=g++-4.7 PACKAGE=g++-4.7 SUPPORT= FL_CONF=Debug FL_USE_FLOAT=OFF FL_CPP11=ON
- - compiler: clang
- env: REAL_CC=gcc-4.7 REAL_CXX=g++-4.7 PACKAGE=g++-4.7 SUPPORT= FL_CONF=Debug FL_USE_FLOAT=ON FL_CPP11=ON
-##Release
- - compiler: clang
- env: REAL_CC=gcc-4.7 REAL_CXX=g++-4.7 PACKAGE=g++-4.7 SUPPORT= FL_CONF=Release FL_USE_FLOAT=OFF FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=gcc-4.7 REAL_CXX=g++-4.7 PACKAGE=g++-4.7 SUPPORT= FL_CONF=Release FL_USE_FLOAT=ON FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=gcc-4.7 REAL_CXX=g++-4.7 PACKAGE=g++-4.7 SUPPORT= FL_CONF=Release FL_USE_FLOAT=OFF FL_CPP11=ON
- - compiler: clang
- env: REAL_CC=gcc-4.7 REAL_CXX=g++-4.7 PACKAGE=g++-4.7 SUPPORT= FL_CONF=Release FL_USE_FLOAT=ON FL_CPP11=ON
-
-#gcc-4.8
-##Debug
- - compiler: clang
- env: REAL_CC=gcc-4.8 REAL_CXX=g++-4.8 PACKAGE=g++-4.8 SUPPORT= FL_CONF=Debug FL_USE_FLOAT=OFF FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=gcc-4.8 REAL_CXX=g++-4.8 PACKAGE=g++-4.8 SUPPORT= FL_CONF=Debug FL_USE_FLOAT=ON FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=gcc-4.8 REAL_CXX=g++-4.8 PACKAGE=g++-4.8 SUPPORT= FL_CONF=Debug FL_USE_FLOAT=OFF FL_CPP11=ON
- - compiler: clang
- env: REAL_CC=gcc-4.8 REAL_CXX=g++-4.8 PACKAGE=g++-4.8 SUPPORT= FL_CONF=Debug FL_USE_FLOAT=ON FL_CPP11=ON
-##Release
- - compiler: clang
- env: REAL_CC=gcc-4.8 REAL_CXX=g++-4.8 PACKAGE=g++-4.8 SUPPORT= FL_CONF=Release FL_USE_FLOAT=OFF FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=gcc-4.8 REAL_CXX=g++-4.8 PACKAGE=g++-4.8 SUPPORT= FL_CONF=Release FL_USE_FLOAT=ON FL_CPP11=OFF
- - compiler: clang
- env: REAL_CC=gcc-4.8 REAL_CXX=g++-4.8 PACKAGE=g++-4.8 SUPPORT= FL_CONF=Release FL_USE_FLOAT=OFF FL_CPP11=ON
- - compiler: clang
- env: REAL_CC=gcc-4.8 REAL_CXX=g++-4.8 PACKAGE=g++-4.8 SUPPORT= FL_CONF=Release FL_USE_FLOAT=ON FL_CPP11=ON
+ # - osx:
+
+#g++-6
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-6 FL_CPP98=OFF FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-6 FL_CPP98=OFF FL_USE_FLOAT=ON
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-6 FL_CPP98=ON FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-6 FL_CPP98=ON FL_USE_FLOAT=ON
+
+##clang-3.8
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.8 FL_CPP98=OFF FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.8 FL_CPP98=OFF FL_USE_FLOAT=ON
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.8 FL_CPP98=ON FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.8 FL_CPP98=ON FL_USE_FLOAT=ON
+
+#g++-5
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-5 FL_CPP98=OFF FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-5 FL_CPP98=OFF FL_USE_FLOAT=ON
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-5 FL_CPP98=ON FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-5 FL_CPP98=ON FL_USE_FLOAT=ON
+
+##clang-3.7
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.7 FL_CPP98=OFF FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.7 FL_CPP98=OFF FL_USE_FLOAT=ON
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.7 FL_CPP98=ON FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.7 FL_CPP98=ON FL_USE_FLOAT=ON
+
+#g++-4.9
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.9 FL_CPP98=OFF FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.9 FL_CPP98=OFF FL_USE_FLOAT=ON
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.9 FL_CPP98=ON FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.9 FL_CPP98=ON FL_USE_FLOAT=ON
+
+##clang-3.6
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.6 FL_CPP98=OFF FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.6 FL_CPP98=OFF FL_USE_FLOAT=ON
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.6 FL_CPP98=ON FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.6 FL_CPP98=ON FL_USE_FLOAT=ON
+
+#g++-4.8
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.8 FL_CPP98=OFF FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.8 FL_CPP98=OFF FL_USE_FLOAT=ON
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.8 FL_CPP98=ON FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.8 FL_CPP98=ON FL_USE_FLOAT=ON
+
+##clang-3.5
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.5 FL_CPP98=OFF FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.5 FL_CPP98=OFF FL_USE_FLOAT=ON
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.5 FL_CPP98=ON FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: clang
+ env: CXX_COMPILER=clang++-3.5 FL_CPP98=ON FL_USE_FLOAT=ON
+
+#g++-4.7
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.7 FL_CPP98=OFF FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.7 FL_CPP98=OFF FL_USE_FLOAT=ON
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.7 FL_CPP98=ON FL_USE_FLOAT=OFF
+ - os: linux
+ compiler: g++
+ env: CXX_COMPILER=g++-4.7 FL_CPP98=ON FL_USE_FLOAT=ON
+
+# #clang-3.4 does not install properly in ubuntu (clang++-3.4 command not found)
+# - os: linux
+# compiler: clang
+# env: CXX_COMPILER=clang++-3.4 FL_CPP98=OFF FL_USE_FLOAT=OFF
+# - os: linux
+# compiler: clang
+# env: CXX_COMPILER=clang++-3.4 FL_CPP98=OFF FL_USE_FLOAT=ON
+# - os: linux
+# compiler: clang
+# env: CXX_COMPILER=clang++-3.4 FL_CPP98=ON FL_USE_FLOAT=OFF
+# - os: linux
+# compiler: clang
+# env: CXX_COMPILER=clang++-3.4 FL_CPP98=ON FL_USE_FLOAT=ON
+
+# #g++-4.6 does not have an installation candidate in ubuntu
+# - os: linux
+# compiler: g++
+# env: CXX_COMPILER=g++-4.6 FL_CPP98=OFF FL_USE_FLOAT=OFF
+# - os: linux
+# compiler: g++
+# env: CXX_COMPILER=g++-4.6 FL_CPP98=OFF FL_USE_FLOAT=ON
+# - os: linux
+# compiler: g++
+# env: CXX_COMPILER=g++-4.6 FL_CPP98=ON FL_USE_FLOAT=OFF
+# - os: linux
+# compiler: g++
+# env: CXX_COMPILER=g++-4.6 FL_CPP98=ON FL_USE_FLOAT=ON
+
+
+# #clang-3.3 does not install properly in ubuntu (clang++-3.4 command not found)
+# - os: linux
+# compiler: clang
+# env: CXX_COMPILER=clang++-3.3 FL_CPP98=OFF FL_USE_FLOAT=OFF
+# - os: linux
+# compiler: clang
+# env: CXX_COMPILER=clang++-3.3 FL_CPP98=OFF FL_USE_FLOAT=ON
+# - os: linux
+# compiler: clang
+# env: CXX_COMPILER=clang++-3.3 FL_CPP98=ON FL_USE_FLOAT=OFF
+# - os: linux
+# compiler: clang
+# env: CXX_COMPILER=clang++-3.3 FL_CPP98=ON FL_USE_FLOAT=ON
+# #g++-4.5 does not have an installation candidate in ubuntu
+# - os: linux
+# compiler: g++
+# env: CXX_COMPILER=g++-4.5 FL_CPP98=OFF FL_USE_FLOAT=OFF
+# - os: linux
+# compiler: g++
+# env: CXX_COMPILER=g++-4.5 FL_CPP98=OFF FL_USE_FLOAT=ON
+# - os: linux
+# compiler: g++
+# env: CXX_COMPILER=g++-4.5 FL_CPP98=ON FL_USE_FLOAT=OFF
+# - os: linux
+# compiler: g++
+# env: CXX_COMPILER=g++-4.5 FL_CPP98=ON FL_USE_FLOAT=ON
notifications:
email:
recipients:
- jcrada@fuzzylite.com
- on_success: change
+ on_success: always
on_failure: always
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..640dacb
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,220 @@
+Version 6.0
+===========
+
+Overview
+--------
+* The FuzzyLite Libraries, namely fuzzylite and jfuzzylite, both in version 6.0, are licensed under the GNU General Public License version 3.
+
+* By default, fuzzylite builds using C++11 instead of C++98.
+
+* Important performance improvements.
+
+* Refactored the following names for the operation of engines: from activation operator to implication operator, from accumulation operator to aggregation operator.
+
+* Renamed the term `Accumulated` to `Aggregated`.
+
+* New activation methods decouple the activation of rules from the rule block and provide different methods for activating rules (see Activation Methods).
+
+* New class `ActivationFactory` provides a factory of activation methods.
+
+* New class `Benchmark` to evaluate the performance and accuracy of engines.
+
+* New class `Complexity` to estimate the computational complexity of an engine.
+
+* New class `RScriptExporter` to export the surfaces of an engine using the `ggplot2` library.
+
+* New class `Binary` term for binary edges.
+
+* New `UnboundedSum` S-Norm in `SNormFactory`.
+
+* New classes `SNormFunction` and `TNormFunction` to create custom functions on any two values using the `Function` class.
+
+* Added description strings to `Engine`, `Variable` and `RuleBlock`
+
+* Privatized previously protected members of classes and subclasses of `Term`, `Variable`, `Rule`, `Defuzzifier`, `[Cloning|Construction]Factory`, `Importer`, `Exporter`, amongst others.
+
+* Improved portability by replacing `int` for `std::size_t` where necessary, thereby additionally removing warnings in Windows 64bit
+
+* Deleted `Operation.cpp` and inlined its methods into `Operation.h`
+
+* Updated `.travis.yml` to use Docker, and build using g++ (versions 6, 5, 4.9, 4.8, 4.7) and clang (versions 3.8, 3.7, 3.6, and 3.5).
+
+* Added `appveyor.yml` to use continuous integration in Windows under Visual Studio 2013 and 2015.
+
+* Added some unit tests and support for future unit tests.
+
+* Bug fixes.
+
+* New example of hybrid engines.
+
+* New example on obstacle avoidance for Mamdani, Takagi-Sugeno, and Hybrid engines.
+
+* New R scripts for each example and its respective surfaces in `pdf` formats.
+
+
+Activation Method
+-----------------
+* New activation methods determine the activation of rules in a rule block. Specifically, the activation methods compute the activation degrees of the rules and the activation order of the rules.
+
+* Seven activation methods available: General, First, Last, Highest, Lowest, Proportional and Threshold.
+
+* If no activation method is supplied, an instance of General will be automatically set.
+
+* New class `General` activates every rule following the insertion order in the rule block.
+
+* New classes `First` and `Last` activate the first and last $n$ rules (following insertion order) whose activation degrees are greater than or equal to a given threshold.
+
+* New classes `Highest` and `Lowest` activate the first and last $n$ rules sorted (descending or ascending) by activation degree.
+
+* New class `Proportional` activates every rule with an activation degree proportional to the activation degrees of the other rules.
+
+* New class `Threshold` activates every rule that satisfies a given comparison operator and a given threshold.
+
+* New class `ActivationFactory` provides a factory of activation methods.
+
+
+
+Defuzzifier
+-----------
+* Overall performance improvements
+* The new default resolution of integral defuzzifiers is 100 (from 200 in previous version)
+* Importantly simplified `WeightedAverage` and `WeightedSum` by not using the implication and aggregation operators.
+* New experimental classes `WeightedAverageCustom` and `WeightedSumCustom` which use the implication and aggregation operators to compute the weighted averages and weighted sums, respectively.
+
+
+Factory
+-------
+* New class `ActivationFactory` to register activation methods.
+* New method `FactoryManager::activation()` to get the activation factory.
+* Inlined methods in [CloningFactory|ConstructionFactory].h
+* Fixed bug in `CloningFactory::deregisterObject()`. Bug: Object was deleted before removing it from the map, leaving an invalid object in the map which would cause a segmentation fault. Solution: Remove the object from the map before deleting it.
+* New `abs` function in `FunctionFactory` to compute the absolute value of a number.
+* New `UnboundedSum` S-Norm in `SNormFactory`.
+
+Hedge
+-----
+* Added `FL_IOVERRIDE` identifiers to hedge Extremely
+* Added `FL_IFINAL` final identifiers to `Hedge` classes (except `Any`).
+
+
+
+Importer and Exporter
+---------------------
+* New `RScriptExporter` generates an R script that uses the `ggplot2` library to produce the surfaces of an engine for each pair of input variables on each output variable.
+
+* Updated `Fll[Importer|Exporter]` to import and export the newly named properties `implication` and `aggregation` (previously known as `activation` and `accumulation`). However, the `FllImporter` has backward compatibility with the previous property names.
+
+* In `Fll[Importer|Exporter]`, added `lock-range` property of input variables, `activation` property for activation methods in rule blocks, and `description` property to `[Input|Output]Variable` and `RuleBlock`.
+
+* Added default option to generate C++ and Java code using the actual names of the input variables, output variables, and rule blocks, instead of the generic `[input|output]Variable` and `ruleBlock` names.
+
+* Updated [Cpp|Java][Import|Export] to generate code using the `description` of an engine if available, the `implication` instead of the `activation`, and the `aggregation` instead of the `accumulation`.
+
+* Removed compatibility between `[Fcl|Fis]Exporter` and `fuzzylite`. In previous versions, these exporters produced additional tags that were only relevant to `fuzzylite`, so that an engine written in these languages could also support the features in `fuzzylite`. However, in doing so, Matlab, Octave and JFuzzyLogic would fail to import the engines written in their own languages because they would not recognize the `fuzzylite` features. Hence, in order to generate code compatible with Matlab, Octave, and JFuzzyLogic, the `fuzzylite` features are removed from the code.
+
+* Refactored methods [Cpp|Java|Fll|Fis|Fcl]Exporter::toString([S|T]Norm*) to take `::toString(Norm*)`.
+
+* Renamed methods FisImporter::extract[SNorm|TNorm|Defuzzifier]() to FisImporter::translate[SNorm|TNorm|Defuzzifier]()
+
+* Fixed bug causing segmentation fault when malformed term in FuzzyLite Language
+
+
+
+Norms
+-----
+* New class `UnboundedSum` to compute sum between any two values and hence reflect Matlab's and Octave's `sum` aggregation operator.
+* New classes `SNormFunction` and `TNormFunction` to create custom functions on any two values using the `Function` class.
+* Fixed bug computing the `NormalizedSum` S-Norm.
+
+
+Rule
+----
+* Added properties `fl::scalar activationDegree`, `bool triggered` and `bool enabled` to a `Rule`. The `activationDegree` property stores the activation degree of the rule in order to avoid recomputing it when requesting it. The `triggered` property indicates whether the rule was triggered (i.e., whether the antecedent modified the consequent). The `enabled` property determines whether the rule can be triggered (by default, a rule is always enabled unless programmatically indicated otherwise).
+
+* Decoupled computing the activation degree and triggering the rule. Previously, the activation degree of a rule was computed and triggered at the same time using `Rule::activate(TNorm* conjunction, SNorm* disjunction, TNorm* implication)`. Currently, there are two methods: `fl::scalar activateWith(TNorm* conjunction, SNorm* disjunction)`, which computes, stores and returns the activation degree of the rule; and `trigger(TNorm* implication)`, which, if the rule is enabled and the activation degree is greater than zero, then the rule is triggered to modify the consequent.
+
+* Renamed `RuleBlock::activation` operator to `RuleBlock::implication` operator, and so its respective getters and setters.
+* Added `RuleBlock::activation` method and respective getters and setters.
+* In `RuleBlock::activate()`, if there is no activation method, the `General` activation method is automatically set in order to have backward compatibility.
+
+* Fixed bug in `RuleBlock` to reset and clone the implication operator. Bug: implication operator is not copied and reset. Fix: copy and reset implication operator when cloning the `RuleBlock`.
+
+* Added identifier `FL_IFINAL` to classes `Proposition` and `Operator`.
+
+Term
+----
+* Performance improvements.
+* `Discrete` term uses binary search instead of linear search, hence significantly improving performance.
+* `Discrete` term can create a `Discrete` term from any other term.
+* New `Binary` edge term.
+* Added method `bool Term::isMonotonic()` to determine whether the term is monotonic (returns true only for `Concave`, `Ramp`, `Sigmoid`, `SShape`, and `ZShape`).
+* Refactored static method `WeightedDefuzzifier::tsukamoto()` into non-static method `Term::tsukamoto()`, which is overriden by each of the terms that can be used for `tsukamoto` controllers.
+* Privatized `Term::name` and the properties of each subclass of `Term`.
+* Inlined generic methods in `[Linear|Discrete].h`
+* Renamed `Activated::activation` operator to `Activated::implication` and its respective getters and setters.
+* Renamed `Accumulated` term to `Aggregated` term, and its `accumulation` operator to `aggregation` operator including getters and setters.
+* For performance improvements, terms of `Aggregated` term are copies of objects in stack memory rather than pointers to objects in heap memory.
+* Refactored static `Term::updateReference()` to non-static being overrided by `Linear`, `Function`.
+* Added enum `[Ramp|Sigmoid]::Direction` to specify the direction of the term.
+* Added `Term::clone()` method to create a copy of any term.
+
+* Fixed bug in `Function` term. Bug: given a formula = "tan(y)" and a map["y"] = 1.0, and executing `Function::load(formula)`, then the map of variables is reset because `load()` calls `unload()` first, causing the deregistration of variable `y`. Solution: Removed method `unload()` from `load()`, thereby causing future `load()` not to reset variables.
+* Fixed bug in `Function` when enclosing variable in double parenthesis.
+
+
+
+Variable
+--------
+* Refactored `[Input|Output]Variable::[get|set][Input|Output]Value()` to a single value in `Variable::[get|set]Value()`.
+* Refactored `OutputVariable::[is|set]LockedOutputValueInRange()` to its parent `Variable::[is|set]LockValueInRange()`.
+* Added option to lock value in range to input variables by refactoring `OutputVariable::lockValueInRange` to `Variable::lockValueInRange`.
+* Renamed `OutputVariable::[is|set]LockedPreviousValue()` to `OutputVariable::[is|set]LockPreviousValue()`.
+* Added wrapping method `OutputVariable::[get|set]Aggregation()`.
+* For performance improvements, added enum `Variable::Type` and methods `Variable::type()` to indicate whether the variable is of `Type::InputVariable` or `Type::OutputVariable`. Thus, it is no longer necessary to `dynamic_cast` variables to find out whether they are input or output variables.
+
+
+
+Benchmark
+---------
+* Benchmark the time it takes your engine to perform a given number of evaluations (available only when building using C++11) over a given number of independent runs.
+* Measure the accuracy of the engine using the mean squared error between the obtained values and the expected values.
+* Export the benchmark results to text.
+
+Complexity
+----------
+* New complexity methods in the components involved in the operation of an engine.
+* Complexity methods are completely decoupled from the operation of an engine, so they do not affect the performance of the engines.
+
+Console
+-------
+* Benchmark engines from the FuzzyLite Console
+* Hybrid example in Console
+
+Engine
+------
+* Description string for Engine
+* Changed signature of `::configure(TNorm* conjunction, SNorm* disjunction, TNorm* activation, SNorm* accumulation, int resolution)` to `::configure(TNorm* conjunction, SNorm* SNorm* disjunction, TNorm* implication, SNorm* aggregation, Activation* activation)`, where `implication` and `aggregation` are better names for activation and accumulation (respectively), and the `activation` refers to an activation method (see Activation Methods)
+
+Exception.h
+-----------
+* Definition FL_BACKTRACE_OFF in Exception.cpp renamed to FL_BACKTRACE, hence functionality is changed.
+
+fuzzylite.h
+-----------
+* Removed definitions FL_VERSION, FL_DATE from fuzzylite.h
+* Renamed fuzzylite::debug() to fuzzylite::isDebugging()
+* Renamed fuzzylite::logging() to fuzzylite::isLogging()
+* Inlined methods of fuzzylite.h
+* Removed definition `FL_CPP11` and replaced it for `FL_CPP98`. By default, `FL_CPP98` is not defined, hence building using `C++11`.
+
+
+Examples
+--------
+* New example of hybrid engines.
+* New example on obstacle avoidance for Mamdani, Takagi-Sugeno, and Hybrid engines.
+* New R scripts for each example and its respective surfaces in `pdf` formats.
+* Updated examples to use the new properties `InputVariable::lock-range`, `Engine::description`, `[Input|Output]Variable::description`, `RuleBlock::description`, `RuleBlock::implication`, `RuleBlock::activation`, and `OutputVariable::aggregation`.
+* Updated C++ and Java examples to reflect variable names instead of generic names.
+
+
+
diff --git a/COPYING b/COPYING
index 94a9ed0..94a0453 100644
--- a/COPYING
+++ b/COPYING
@@ -619,56 +619,3 @@ Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year> <name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/COPYING.LESSER b/COPYING.LESSER
deleted file mode 100644
index 65c5ca8..0000000
--- a/COPYING.LESSER
+++ /dev/null
@@ -1,165 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
- This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
- 0. Additional Definitions.
-
- As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
- "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
- An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
- A "Combined Work" is a work produced by combining or linking an
-Application with the Library. The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
- The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
- The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
- 1. Exception to Section 3 of the GNU GPL.
-
- You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
- 2. Conveying Modified Versions.
-
- If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
- a) under this License, provided that you make a good faith effort to
- ensure that, in the event an Application does not supply the
- function or data, the facility still operates, and performs
- whatever part of its purpose remains meaningful, or
-
- b) under the GNU GPL, with none of the additional permissions of
- this License applicable to that copy.
-
- 3. Object Code Incorporating Material from Library Header Files.
-
- The object code form of an Application may incorporate material from
-a header file that is part of the Library. You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
- a) Give prominent notice with each copy of the object code that the
- Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the object code with a copy of the GNU GPL and this license
- document.
-
- 4. Combined Works.
-
- You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
- a) Give prominent notice with each copy of the Combined Work that
- the Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the Combined Work with a copy of the GNU GPL and this license
- document.
-
- c) For a Combined Work that displays copyright notices during
- execution, include the copyright notice for the Library among
- these notices, as well as a reference directing the user to the
- copies of the GNU GPL and this license document.
-
- d) Do one of the following:
-
- 0) Convey the Minimal Corresponding Source under the terms of this
- License, and the Corresponding Application Code in a form
- suitable for, and under terms that permit, the user to
- recombine or relink the Application with a modified version of
- the Linked Version to produce a modified Combined Work, in the
- manner specified by section 6 of the GNU GPL for conveying
- Corresponding Source.
-
- 1) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (a) uses at run time
- a copy of the Library already present on the user's computer
- system, and (b) will operate properly with a modified version
- of the Library that is interface-compatible with the Linked
- Version.
-
- e) Provide Installation Information, but only if you would otherwise
- be required to provide such information under section 6 of the
- GNU GPL, and only to the extent that such information is
- necessary to install and execute a modified version of the
- Combined Work produced by recombining or relinking the
- Application with a modified version of the Linked Version. (If
- you use option 4d0, the Installation Information must accompany
- the Minimal Corresponding Source and Corresponding Application
- Code. If you use option 4d1, you must provide the Installation
- Information in the manner specified by section 6 of the GNU GPL
- for conveying Corresponding Source.)
-
- 5. Combined Libraries.
-
- You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
- a) Accompany the combined library with a copy of the same work based
- on the Library, uncombined with any other library facilities,
- conveyed under the terms of this License.
-
- b) Give prominent notice with the combined library that part of it
- is a work based on the Library, and explaining where to find the
- accompanying uncombined form of the same work.
-
- 6. Revised Versions of the GNU Lesser General Public License.
-
- The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
- If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index 012623e..0000000
--- a/ChangeLog
+++ /dev/null
@@ -1,231 +0,0 @@
-Version 5.1
-* Updated `JavaExporter` to remove boolean from exported `Function.create(String name, String formula, Engine engine, boolean)`
-* Improved CMakeLists to remove errors from warnings, and exclude library rt for benchmarks
-* Moved benchmarks in `Console.cpp` to FL_CPP11 in order to get rid of rt library
-* Made most constructors `explicit`
-* FL_WINDOWS, FL_APPLE and FL_UNIX are automatically defined in `fuzzylite.h`
-* Option to prefix namespace `fl::` in class `CppExporter`
-* New methods `FclExporter::toString([[Input|Output]Variable]|RuleBlock|Norm])`
-* New methods `FclExporter::toString(Norm)`
-* Identifier FL_IOVERRIDE in SNorm and TNorm
-* New private methods `CloningFactory::register[Operators|Functions]`
-* `FisExporter` merges all ruleblocks into one
-* New `Rule::clone()` method
-* Fixed `FclImporter` exception on malformed Term
-* Made sure this version builds successfully with g++5.1
-
-
-Version 5.0
-* Modified Function::Unary and Binary to take scalar instead of double
-* Fixed building using -DFL_USE_FLOAT=ON
-* Added deductive type of Engine with Engine::type()
-* Fixed minor memory leak at RuleBlock (conjunction, disjunction, activation)
-* Fixed minor memory leak at Accumulated (accumulation, thresholded terms)
-* Fixed minor memory leak at OutputVariable (defuzzifier)
-* Fixed minor memory leak at Function::Node
-* Fixed minor memory leak at FactoryManager
-* Improved handling of Exceptions
-* Modified FclExporter and FisExporter to provide backward compatibility with FCL and FIS formats
-* Updated the FIS and FCL examples for backward compatibility
-* Included the original example files
-* Updated FLD examples produced from the engines of the original examples
-* Fixed some original examples of takagi-sugeno to use AlgebraicProduct activation
-* FldExporter no longer restarts the engine
-* Fixed rethrowing of exceptions to provide proper information about errors!
-* Catching std::exceptions where possible to avoid unexpected exceptions
-* FldExporter exports from a custom input dataset
-* Console includes option to read custom input dataset from file
-* Console provides more information about its usage
-* Renamed methods FldExporter::toWriter() to FldExporter::write()
-* Removed variable and methods for property FldExporter::maximum
-* Accuracy improvements importing fis files with large number of decimals
-* Updated FLD examples to reflect accuracy
-* Changed operation for multiple hedges to operate from last to first
-* Fixed OutputVariable to store last valid output value regardless of locks
-* Renamed Op::isNan to Op::isNaN
-* New OutputVariable::(get|set)OutputValue to store value from defuzzification
-* Changed OutputVariable::defuzzify to store its output value
-* Changed return type of scalar OutputVariable::defuzzify to void OutputVariable::defuzzify
-* Renamed OutputVariable::(get|set)LastValidOutput to OutputVariable::(get|set)LastValidOutputValue
-* Removed OutputVariable::defuzzifyNoLocks
-* Removed const from Term* Accumulated::(get|set)Accumulation
-* Added InputVariable::fuzzyInputValue and OutputVariable::fuzzyOutputValue
-* Removed defaults in Engine::configure
-* Added Engine::configure without conjuntion and disjuntion
-* Added parameter string to Engine::type
-* Changed Engine::isReady
-* Correct handling of integral defuzzification with min|max=NaN|Inf
-* Added method Rule::isLoaded to determine whether a rule is to be activated
-* Added method Rule::unload to allow existence of invalid rules
-* Added methods Engine::set((Input|Output)Variables), Engine::setRuleBlocks
-* Added method RuleBlock::setRules
-* Changed visibility of Rule::setText to public
-* Added method Rule::load(const Engine*)
-* Renamed term Thresholded to Activated
-* Renamed Thresholded::(set|get)Threshold to Activated::(set|get)Degree
-* Removed variable Rule::FL_ASSIGNS="=" and method Rule::assignsKeyword()
-* Modified original takagi-sugeno examples to reflect proper activation and accumulation
-* Moved Engine::_hedges (and methods) to Rule::_hedges
-* Renamed Antecedent::(get|set)Root to Antecedent::(get|set)Expression
-* Added (Antecedent|Consequent)::(get|set)Text
-* Added (Antecedent|Consequent)::load|unload
-* Renamed typedef Factory::Creator to Factory::Constructor
-* Added an M-file to compare output values of fuzzylite engines with Matlab
-* Removed const from Norms in RuleBlock::(get|set)(Activation|Conjunction|Disjunction)
-* Deleted method Op::repeat
-* Added built-in functions gt,lt,ge,le,eq and operator !
-* Renamed Term::copy to Term::clone in every Term
-* Added copy constructors and assignment operators to (Input|Output)Variable
-* Added copy constructors and assignment operators to Accumulated
-* Merged Function::Operator and Function::BuiltInFunction into Function::Element
-* Created FunctionFactory for Function::Elements
-* IMPORTANT: Changed starting precedence of Function::Element::Operators to 10 (refer to FunctionFactory)
-* Setters of FactoryManager no longer delete previous factories
-* Renamed Factory<T>::(register|deregister)Class to Factory<T>::(register|deregister)Constructor
-* Renamed Factory<T> to ConstructionFactory<T>
-* Created CloningFactory<T>
-* Moved functions and operators of term Function to a FunctionFactory
-* Added clone methods to Defuzzifiers, Hedges, Norms, and Terms
-* Changed Exception::btCallStack(const int) to Exception::btCallStack(void)
-* Using std::auto_ptr to (T|S)Norms in RuleBlock, SNorm in Accumulated, and Defuzzifier in OutputVariable
-* Added methods Engine::set((Input|Output)Variable) and Engine::setRuleBlock()
-* Added method RuleBlock::reloadRules()
-* Changed Linear pointers to input variables for a pointer to Engine
-* Added support to compare infinity values with fl::Op::isEq and therefore other comparison operators
-* Parameters of all terms are set to fl::nan by default
-* Added methods Engine::(input|output)Variables() and ::ruleBlocks() to return mutable references
-* Added method Variable::terms() to return mutable reference
-* Added method RuleBlock::rules() to return mutable reference
-* Added methods Ramp::direction() and Sigmoid::direction() to represent direction of slope
-* Added method fl::Op::isFinite(x) to check x is not (nan or inf)
-* Changed fl::Op::isEq(a,b) to return true if a = b = NaN
-* Added method Accumulated::terms() to return mutable reference
-* Changed visibility of Linear::coefficients to protected
-* Added methods Linear::coefficients(), Linear::setCoefficients()
-* Removed public variables Discrete::x,y
-* Added in Discrete a typedef to std::pair<scalar, scalar> Pair, and changed signatures of methods and types of their parameters
-* Changed representation of Discrete::(x,y) from std::vector<scalar> to std::vector<Pair>
-* Added methods Discrete::setXY(), Discrete::xy(), ::xy(int) to set and get new representation
-* Added methods Discrete::toPairs(std::vector<scalar>) and Discrete::toVector(std::vector<Pair>)
-* Added method Discrete::formatXY() to get pairs (x,y) nicely formatted
-* Linear term no longer throws exception when inputVariables != |coefficients|
-* Changed visibility of Function::root to protected and renamed it to Function::_root
-* Added method Function::root() to return pointer to Function::_root
-* Added option to prefix the namespace in CppExporter, by default it does not prefix
-* Added method OutputVariable::clear() to restart the output variable
-* Renamed variable OutputVariable::_lastValidOutputValue to ::_previousOutputValue
-* Renamed method OutputVariable::(get|set)LastValidOutputValue to ::(get|set)PreviousOutputValue
-* Renamed variable OutputVariable::_lockOutputRange to ::_lockOutputValueInRange
-* Renamed method OutputVariable::setLockOutputRange() to ::setLockOutputValueInRange
-* Renamed method OutputVariable::isLockingOutputRange() to ::isLockedOutputValueInRange
-* Renamed variable OutputVariable::_lockValidOutput to ::_lockPreviousOutputValue
-* Renamed method OutputVariable::setLockValidOutput() to ::setLockPreviousOutputValue
-* Renamed method OutputVariable::isLockingValidOutput() to ::isLockedPreviousOutputValue
-* Renamed FLL property 'lock-valid' to 'lock-previous'
-* Renamed FIS property 'LockValid' to 'LockPrevious'
-* Renamed FCL property 'LOCK: VALID' to 'LOCK: PREVIOUS'
-* Added method Engine::variables() to retrieve both Input and OutputVariables
-* Added method Term::updateReference(Term*, Engine*) to ensure Linear and Function terms to update references of engines
-* Added method Engine::updateReferences() to update references to the engine in its terms.
-* Added in Discrete a typedef to std::pair<scalar, scalar> Pair, and changed signatures of methods and types of their parameters
-* Added terms: Concave, Cosine and Spike
-* Renamed methods Triangle::(set|get)(A|B|C) to (set|get)(Vertex(A|B|C))
-* Renamed methods Trapezoid::(set|get)(A|B|C|D) to (set|get)(Vertex(A|B|C|D))
-* Removed method fuzzylite::configuration()
-* Renamed MACRO FL_DEBUG to FL_DBG
-* Renamed MACRO (FL_BEGIN_DEBUG_BLOCK and FL_END_DEBUG_BLOCK) to (FL_DEBUG_BEGIN and FL_DEBUG_END)
-* Renamed methods in (Fis|Fcl)Importers::extract? to ::parse?
-* Made defaultResolution a static property of IntegralDefuzzifiers
-* Added method Engine::type(name, reason) to show type and reason why type
-* Added method Engine::clone()
-* Added support for Tsukamoto with Concave terms
-* Changed Accumulated to take Activated* terms instead of const Terms*
-* Deleted class Tsukamoto
-* Created class WeightedDefuzzifier from which Weighted(Average|Sum) derive with options: Automatic|TakagiSugeno|Tsukamoto
-* Added methods WeightedDefuzzifier::tsukamoto() and ::inferType()
-* Added benchmarks for fuzzylite in Linux
-* Created the FuzzyLite Interactive Console
-* Added basic rule chaining such that Output Variables can be utilized as antecedents
-* Added two examples for rule chaining: mamdani/Laundry.fll and mamdani/SimpleDimmerInverse.fll
-* Added Term::(get|set)Height and changed all terms accordingly
-* Renamed method Op::makeValidId to Op::validName, which now returns "unnamed" for empty strings.
-* Converted examples/original/*.fis to examples/original/*.fll
-* Removed Exception Specification from methods in Discrete, Linear and Function terms
-* Changed name of debug libraries to fuzzylited.dll and fuzzylite-staticd.lib
-* Removed method Operation::toScalar(std::string, bool, scalar)
-* Added method Operation::toScalar(std::string) [throws Exception], and ::toScalar(std::string, scalar alternative) throw()
-* Added method ImEx::(from|to)File to import and export engines using files
-* WeightedAverage and WeightedSum without Activation operators have default behaviour, i.e., AlgebraicProduct
-* FactoryManager utilizes smart pointers.
-* Rule utilizes smart pointers for Antecedent and Consequent
-* Exceptions are thrown when Conjunction, Disjunction, Activation and Accumulation operators are NULL when they are required
-* Exception is thrown when Defuzzifier is required and not set.
-* Added support for C++11 utilizing smart pointers, identifiers (override, noexcept), and delete identifiers to DISABLE_COPY(Class)
-* Macros for identifiers are FL_IOVERRIDE, FL_IFINAL, FL_IDEFAULT, FL_IDELETE, and FL_INOEXCEPT (fl/fuzzylite.h)
-* Added macro FL_unique_ptr to refer to std::auto_ptr (C++98) or std::unique_ptr (C++11), and its respective FL_move_ptr(x) to move a smart pointer.
-* Added constant fl::null to refer to 0L (C++98) or nullptr (C++11)
-* Added macros FL_DEFAULT_COPY(Class), FL_DEFAULT_MOVE(Class), and FL_DEFAULT_COPY_AND_MOVE(Class) for default copy and move constructors and operators
-* Added build.sh to build fuzzylite
-* Changed default to fuzzylite::_macheps = 1e-6;
-* Renamed macro FL_EXPORTS to FL_API
-* Added macro FL_SHARED_LIBRARY and FL_STATIC_LIBRARY to be defined when building shared and static libraries
-
-
-Version 4.0
-* FuzzyRule merged with Rule, and FuzzyRule deleted.
-* FuzzyAntecedent merged with Antecedent, and FuzzyAntecedent deleted
-* FuzzyConsequent merged with Consequent, and FuzzyConsequent deleted
-* FuzzyExpression renamed Expression
-* Renamed Rule::get/setUnparsedRule to get/setText
-* Renamed RuleBlock::get/set(Tnorm|Snorm) to get/set(Conjunction|Disjunction)
-* Renamed RuleBlock::fireRules to activate
-* Renamed Rule::fireStrength to activationDegree, fire to activate
-* Renamed Consequent::fire to modify
-* Created IntegralDefuzzifier to extract divisions from Defuzzifier
-* Renamed divisions from IntegralDefuzzifier to resolution, FL_DIVISIONS to FL_RESOLUTION
-* Deleted MaximumDefuzzifier
-* Centroid, Bisector, and Largest/Smallest/Mean Defuzzifiers inherit from IntegralDefuzzifier
-* Changed names of arithmetic operations in fl::Operation
-* Renamed Function::get/set(Infix) to get/set(Formula)
-* Renamed InputVariable::get/set(Input) to get/set(InputValue)
-* Renamed Antecedent::firingStrength to activationDegree
-* Renamed Antecedent::toString/(Prefix,Infix,Postfix) to to/(Prefix,Infix,Postfix)
-* Renamed Rule::FL_ASSIGN to Rule::FL_EQUALS
-* New method restart in Engine
-* New methods Engine::setInputValue(name, value), scalar Engine::getOutputValue(name)
-* Renamed Op::str(vector/varargs) to Op::join(vector/varargs)
-* Refactored associtativity, unary and binary properties in Element within Function
-* Removed unnecessary Hedges creation upon importing engines, now is automatic via Factories
-* Created the JavaExporter
-* Renamed methods within Fis/Fcl/CppExporter to toString(*);
-* Extracted TNorms and SNorms from TNorm.h/cpp and SNorm.h/cpp
-* Created proper Factories with registration of classes and constructors
-* Renamed method Factory::create to Factory::createInstance
-* Added static constructor method to every Defuzzifier, Hedge, TNorm, and SNorm
-* Removed FL_PRECISION, FL_DECIMALS as Macros, and created static variables in fuzzylite.h
-* Renamed FL_PRECISION to macheps, i.e., machine epsilon to differentiate real numbers
-* Removed FL_DEBUG and created a static variable in fuzzylite.h
-* Removed FL_NO_LOG as it is now controlled with fuzzylite::logging(), previously named logEnabled()
-* Libraries and Console application are both built in folder bin/ (previously libraries were at lib/)
-* Removed Engine::toStringFis/Fcl/Cpp to encourage use of Fcl/Fis/CppExporters instead
-* Renamed Op::logical_and to Op::logicalAnd, Op::logical_or to Op::logicalOr
-* Added support to Fis/FclImporters to treat comments (%,#,//,/*) in fis and fcl files
-* Created the Console application instead of previous demo
-* Added Variable::range() to return (maximum - minimum)
-* Removed Variable::isEmpty, use Variable::terms().empty()
-* Removed RuleBlock::isEmpty, use RuleBlock::rules().empty()
-* Created method Op::makeValidId to ensure names are valid
-* Engine, Variable and Term::toString return FllExport::toString
-* Created Term::parameters to return list of parameter values as string separated by spaces
-* Created Term::configure to configure from Term::parameters
-* FclImEx import and export terms using Term::parameters
-* Created the FuzzyLite Language in FllImporter and FllExporter
-* Created the FuzzyLite Dataset FldExporter
-* Added property Enable to Engine, Variable and RuleBlock
-* Extended FCL and FIS to consider Enabled properties
-* Changed Engine::defuzzify() to consider enabled variables
-* Changed Engine::process() to consider enabled rule blocks
-* Changed OutputVariable::output() to OutputVariable::fuzzyOutput()
-* Renamed Rectangle::minimum/maximum to Rectangle::start/end
-* Renamed fuzzylite::shortVersion to fuzzylite::version
-* Improved accuracy of Triangle and Trapezoid
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..99a11d1
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,22 @@
+FROM ubuntu:latest
+MAINTAINER Juan Rada-Vilela <jcrada@fuzzylite.com>
+
+ARG CXX_COMPILER=g++
+ENV CXX_COMPILER ${CXX_COMPILER}
+
+
+#install software-properties-common to use add-apt to add repository for g++-6
+RUN apt-get update && apt-get -y install software-properties-common && \
+ add-apt-repository ppa:ubuntu-toolchain-r/test && \
+ apt-get update && apt-get -y install \
+ ${CXX_COMPILER} \
+ make \
+ cmake \
+ doxygen \
+ graphviz
+
+#Create and copy Docker's context into /build
+RUN mkdir /build
+ADD . /build
+WORKDIR /build/fuzzylite
+ENTRYPOINT [ "/build/fuzzylite/build.sh" ] \ No newline at end of file
diff --git a/Doxyfile b/Doxyfile
new file mode 100644
index 0000000..84978af
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,2397 @@
+# Doxyfile 1.8.11
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "fuzzylite"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER = 6.0
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = "A Fuzzy Logic Control Library in C++"
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO = fuzzylite.svg
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = documentation/
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = YES
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = YES
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = YES
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = NO
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = fuzzylite/fl README.md
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd,
+# *.vhdl, *.ucf, *.qsf, *.as and *.js.
+
+FILE_PATTERNS = *.h
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH = examples/mamdani examples/takagi-sugeno examples/tsukamoto
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS = *.fll *.fld *.cpp *.java *.fis *.fcl *.R
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = YES
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH = documentation/ui/figure/ documentation/ui/image
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE = README.md
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER = documentation/ui/header.html
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER = documentation/ui/footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET = documentation/ui/stylesheet.css
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+
+HTML_EXTRA_FILES = README.md \
+ documentation/ui/image/browserconfig.xml \
+ documentation/ui/image/manifest.json \
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "FuzzyLite Documentation"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = com.fuzzylite
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = com.fuzzylite.documentation
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = FuzzyLite Limited
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =fuzzylite-6.0.chm
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE = fuzzylite.qch
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = com.fuzzylite
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = com.fuzzylite.documentation
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 14
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = YES
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = https://cdn.mathjax.org/mathjax/latest/
+# The path should be set to ./MathJax, but there is no way to use it in Doxygen
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES ={amsmath}
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = YES
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+#@TODO: YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+#@TODO: YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+#@TODO: YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+#@TODO: YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = YES
+#@TODO: YES
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 15
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = YES
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+#@TODO: YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+#@TODO: YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = YES
+#@TODO: YES
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = YES
+#@TODO: YES
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 500
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = YES
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/LICENSE b/LICENSE
index 65c5ca8..94a9ed0 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,165 +1,674 @@
- GNU LESSER GENERAL PUBLIC LICENSE
+ GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
-
- This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
- 0. Additional Definitions.
-
- As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
- "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
- An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
- A "Combined Work" is a work produced by combining or linking an
-Application with the Library. The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
- The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
- The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
- 1. Exception to Section 3 of the GNU GPL.
-
- You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
- 2. Conveying Modified Versions.
-
- If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
- a) under this License, provided that you make a good faith effort to
- ensure that, in the event an Application does not supply the
- function or data, the facility still operates, and performs
- whatever part of its purpose remains meaningful, or
-
- b) under the GNU GPL, with none of the additional permissions of
- this License applicable to that copy.
-
- 3. Object Code Incorporating Material from Library Header Files.
-
- The object code form of an Application may incorporate material from
-a header file that is part of the Library. You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
- a) Give prominent notice with each copy of the object code that the
- Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the object code with a copy of the GNU GPL and this license
- document.
-
- 4. Combined Works.
-
- You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
- a) Give prominent notice with each copy of the Combined Work that
- the Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the Combined Work with a copy of the GNU GPL and this license
- document.
-
- c) For a Combined Work that displays copyright notices during
- execution, include the copyright notice for the Library among
- these notices, as well as a reference directing the user to the
- copies of the GNU GPL and this license document.
-
- d) Do one of the following:
-
- 0) Convey the Minimal Corresponding Source under the terms of this
- License, and the Corresponding Application Code in a form
- suitable for, and under terms that permit, the user to
- recombine or relink the Application with a modified version of
- the Linked Version to produce a modified Combined Work, in the
- manner specified by section 6 of the GNU GPL for conveying
- Corresponding Source.
-
- 1) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (a) uses at run time
- a copy of the Library already present on the user's computer
- system, and (b) will operate properly with a modified version
- of the Library that is interface-compatible with the Linked
- Version.
-
- e) Provide Installation Information, but only if you would otherwise
- be required to provide such information under section 6 of the
- GNU GPL, and only to the extent that such information is
- necessary to install and execute a modified version of the
- Combined Work produced by recombining or relinking the
- Application with a modified version of the Linked Version. (If
- you use option 4d0, the Installation Information must accompany
- the Minimal Corresponding Source and Corresponding Application
- Code. If you use option 4d1, you must provide the Installation
- Information in the manner specified by section 6 of the GNU GPL
- for conveying Corresponding Source.)
-
- 5. Combined Libraries.
-
- You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
- a) Accompany the combined library with a copy of the same work based
- on the Library, uncombined with any other library facilities,
- conveyed under the terms of this License.
-
- b) Give prominent notice with the combined library that part of it
- is a work based on the Library, and explaining where to find the
- accompanying uncombined form of the same work.
-
- 6. Revised Versions of the GNU Lesser General Public License.
-
- The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
- If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/LICENSE.FuzzyLite b/LICENSE.FuzzyLite
new file mode 100644
index 0000000..9477af6
--- /dev/null
+++ b/LICENSE.FuzzyLite
@@ -0,0 +1,634 @@
+FuzzyLite License
+Version 1.0, March 2017
+http://www.fuzzylite.com/license
+
+GENERAL
+=======
+The FuzzyLite Libraries, namely fuzzylite and jfuzzylite, both in version 6.0, are licensed under the GNU General Public License version 3.
+
+GNU General Public License
+--------------------------
+
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/NEWS b/NEWS
index daa131e..a339cce 100644
--- a/NEWS
+++ b/NEWS
@@ -1,317 +1,52 @@
-Extracted from [README.md](/README.md)
-================================================
+Version 6.0
+===========
+Overview
+--------
+* The FuzzyLite Libraries, namely fuzzylite and jfuzzylite, both in version 6.0, are licensed under the GNU General Public License version 3.
-### <a name="features">Features</a>
+* By default, fuzzylite builds using C++11 instead of C++98.
-**Controllers** *Types* (5) Mamdani, Takagi-Sugeno, Larsen, Tsukamoto, Inverse Tsukamoto
+* Important performance improvements.
-**Linguistic terms** *Basic* (4) triangle, trapezoid, rectangle, discrete. *Extended* (9) bell, cosine, gaussian, gaussian product, pi-shape, sigmoid difference, sigmoid product, spike. *Edges* (4) concave, ramp, sigmoid, s-shape, z-shape. *Functions* (3) constant, linear, function.
+* Refactored the following names for the operation of engines: from activation operator to implication operator, from accumulation operator to aggregation operator.
-**Conjunction and Activation** *T-Norm* (7) minimum, algebraic product, bounded difference, drastic product, einstein product, hamacher product, nilpotent minimum.
+* Renamed the term `Accumulated` to `Aggregated`.
-**Disjunction and Accumulation** *S-Norm* (8) maximum, algebraic sum, bounded sum, normalized sum, drastic sum, einstein sum, hamacher sum, nilpotent maximum.
+* New activation methods decouple the activation of rules from the rule block and provide different methods for activating rules (see Activation Methods).
-**Defuzzifiers** *Integral* (5) centroid, bisector, smallest of maximum, largest of maximum, mean of maximum, *Weighted* (2) weighted average, weighted sum.
+* New class `ActivationFactory` provides a factory of activation methods.
-**Hedges** *Types* (6) any, not, extremely, seldom, somewhat, very.
+* New class `Benchmark` to evaluate the performance and accuracy of engines.
-**Import** *Types* (3) FuzzyLite Language `fll`, Fuzzy Inference System `fis`, Fuzzy Control Language `fcl`.
+* New class `Complexity` to estimate the computational complexity of an engine.
-**Export** *Types* (6) `C++`, `Java`, FuzzyLite Language `fll`, FuzzyLite Dataset `fld`, Fuzzy Inference System `fis`, Fuzzy Control Language `fcl`.
+* New class `RScriptExporter` to export the surfaces of an engine using the `ggplot2` library.
-**Examples** (30+) of Mamdani, Takagi-Sugeno and Tsukamoto controllers from `fuzzylite`, Octave and Matlab, each included in the following formats: `C++`, `Java`, `fll`, `fld`, `fis`, and `fcl`.
+* New class `BinaryTerm` for binary edges.
-***
+* New `UnboundedSum` S-Norm in `SNormFactory`.
-### <a name="example">Example</a>
+* New classes `SNormFunction` and `TNormFunction` to create custom functions on any two values using the `Function` class.
-```cpp
-#include "fl/Headers.h"
+* Added description strings to `Engine`, `Variable` and `RuleBlock`
-int main(int argc, char* argv[]){
- using namespace fl;
- Engine* engine = new Engine("simple-dimmer");
+* Privatized previously protected members of classes and subclasses of `Term`, `Variable`, `Rule`, `Defuzzifier`, `[Cloning|Construction]Factory`, `Importer`, `Exporter`, amongst others.
- InputVariable* ambient = new InputVariable;
- ambient->setName("Ambient");
- ambient->setRange(0.000, 1.000);
- ambient->addTerm(new Triangle("DARK", 0.000, 0.500));
- ambient->addTerm(new Triangle("MEDIUM", 0.250, 0.750));
- ambient->addTerm(new Triangle("BRIGHT", 0.500, 1.000));
- engine->addInputVariable(ambient);
+* Improved portability by replacing `int` for `std::size_t` where necessary, thereby additionally removing warnings in Windows 64bit
- OutputVariable* power = new OutputVariable;
- power->setName("Power");
- power->setRange(0.000, 2.000);
- power->setDefaultValue(fl::nan);
- power->addTerm(new Triangle("LOW", 0.000, 1.000));
- power->addTerm(new Triangle("MEDIUM", 0.500, 1.500));
- power->addTerm(new Triangle("HIGH", 1.000, 2.000));
- engine->addOutputVariable(power);
+* Deleted `Operation.cpp` and inlined its methods into `Operation.h`
- RuleBlock* ruleblock = new RuleBlock;
- ruleblock->addRule(Rule::parse("if Ambient is DARK then Power is HIGH", engine));
- ruleblock->addRule(Rule::parse("if Ambient is MEDIUM then Power is MEDIUM", engine));
- ruleblock->addRule(Rule::parse("if Ambient is BRIGHT then Power is LOW", engine));
- engine->addRuleBlock(ruleblock);
+* Updated `.travis.yml` to use Docker, and build using g++ (versions 6, 5, 4.9, 4.8, 4.7) and clang (versions 3.8, 3.7, 3.6, and 3.5).
- engine->configure("", "", "Minimum", "Maximum", "Centroid");
+* Added `appveyor.yml` to use continuous integration in Windows under Visual Studio 2013 and 2015.
- std::string status;
- if (not engine->isReady(&status))
- throw Exception("Engine not ready. "
- "The following errors were encountered:\n" + status, FL_AT);
+* Added some unit tests and support for future unit tests.
- for (int i = 0; i < 50; ++i){
- scalar light = ambient->getMinimum() + i * (ambient->range() / 50);
- ambient->setInputValue(light);
- engine->process();
- FL_LOG("Ambient.input = " << Op::str(light) << " -> " <<
- "Power.output = " << Op::str(power->getOutputValue()));
- }
-}
-```
+* Bug fixes.
-***
+* New example of hybrid engines.
-### <a name="whatsnew">What's New?</a>
-The entire `fuzzylite` library has been thoroughly revised, refactored, validated, and significantly improved. The following sections detail the changes and enhancements of version 5.0. Users of previous versions are **strongly** encouraged to carefully read the list before migrating to version 5.0. Important changes and enhancements are marked as **(important)**, **(VERY important)** and **(EXTREMELY important)**.
+* New example on obstacle avoidance for Mamdani, Takagi-Sugeno, and Hybrid engines.
-#### <a name="new-general">General</a>
-+ **(important)** `fuzzylite v5.0` is dual-licensed under the [GNU LGPL v3.0](https://www.gnu.org/licenses/lgpl.html) and a paid commercial license.
-+ Support for both `C++98` and `C++11` using the latest features.
-+ Support for multiple compilers `g++`, `Clang`, `MSVC`.
-+ Refactoring of many classes to improve design and performance.
-+ **(important)** Performance improvements of Takagi-Sugeno controllers by over 55% with respect to v4.0 (estimate based on the average performance on the examples included).
-+ Smart pointers in many classes take care of automatically deleting objects when setting new pointers (`Accumulated`, `FactoryManager`, `Function`, `OutputVariable`, `Rule`, and `RuleBlock`).
-* **(important)** Exceptions are thrown when any of the following `RuleBlock::[conjunction|disjunction|activation]`, `Accumulated::accumulation`, and `OutputVariable::defuzzifier` are required but set to `fl::null`, thereby replacing the operations that would lead to `[signal 11] Segmentation fault` to operations that throw a `fl::Exception` instead.
-+ Automatic build script to build `fuzzylite` in `debug` and `release` mode.
-+ Binaries of debug libraries are renamed to append the letter `d` (e.g.,`fuzzylited.dll`, `libfuzzylited.so`).
-+ **(important)** New file [`fuzzylite/src/m/compare.m`](/fuzzylite/src/m/compare.m) <!---check link--> to compare the output values of your `fuzzylite` engines with the evaluation of the same engine in Octave/Matlab.
-+ **(important)** There is practically no difference between the output values obtained with `fuzzylite` and those obtained with Octave/Matlab. Based on the examples, the average mean square error (MSE) between the output values is less than `7.3e-12` (or `0.0000000000073`) due to negligible differences in floating-point arithmetic. The results and comparison can be found in [`examples/examples.mat`](/examples/examples.mat) <!---check link-->.
-+ **(important)** Source code of applications based on version 4.0 will most likely not compile with version 5.0.
-+ Minor bugs and memory leaks fixed.
-
-####<a name="new-macros">Macros</a>
-* **(important)** Added support for `C++11` with smart pointers, method identifiers, move constructors and move operators as follows. For precise information, refer to file [`fuzzylite/fl/fuzzylite.h`](/fuzzylite/fl/fuzzylite.h). <!---check link-->
-* **(important)** Macros for identifiers are defined as `FL_IOVERRIDE override`, `FL_IFINAL final`, `FL_IDEFAULT = default`, `FL_IDELETE = delete`, `FL_INOEXCEPT noexcept`, `FL_DEFAULT_COPY(Class)`, `FL_DEFAULT_MOVE(Class)`, and `FL_DEFAULT_COPY_AND_MOVE(Class)`.
-* **(important)** Added macro `FL_unique_ptr` to refer to `std::auto_ptr` (`C++98`) or `std::unique_ptr` (`C++11`), and its respective `FL_move_ptr(x)` to move a smart pointer, albeit `FL_move_ptr(x)` is not used within the library as it is not needed.
-* **(important)** Added global variables `const long fl::null = 0L` to refer to the null pointer in `C++98` and `const std::nullptr_t null = nullptr` to refer to the null pointer in `C++11`.
-* **(important)** Renamed macro `FL_DEBUG` to `FL_DBG`.
-* **(important)** Renamed macros `FL_BEGIN_DEBUG_BLOCK` and `FL_END_DEBUG_BLOCK` to `FL_DEBUG_BEGIN` and `FL_DEBUG_END`, respectively.
-* **(important)** Renamed macro `FL_EXPORT` to `FL_API`
-* **(EXTREMELY important)** Added macro definitions `FL_EXPORT_LIBRARY` and `FL_IMPORT_LIBRARY`. If you are building `fuzzylite` as a **shared library**, you need to define `FL_EXPORT_LIBRARY`. If you are building `fuzzylite` **executable** *and* it utilizes the `fuzzylite` **shared library**, you need to define `FL_IMPORT_LIBRARY`. If you are building `fuzzylite` as a **static library** and/or building `fuzzylite` **executable** using the `fuzzylite` **static library**, then you do not need to define either `FL_[IMPORT|EXPORT]_LIBRARY`. Note that the same conditions apply for your application. This is particularly important in Windows platforms, as `FL_IMPORT_LIBRARY` and `FL_EXPORT_LIBRARY` define `FL_API` to `__declspec(dllimport)` and `__declspec(dllexport)`, respectively. If in doubt, please check [`fuzzylite/CMakeLists.txt`](/fuzzylite/CMakeLists.txt)<!---check link-->
-
-#### <a name="new-operation">Operation</a>
-* **(important)** Added method `Operation::toScalar(std::string x, scalar alternative) FL_INOEXCEPT` which returns `alternative` if `x` is not a valid `scalar`, and never throws an exception.
-* **(important)** Added method `Operation::toScalar(std::string x)` that returns the scalar value of `x` or throws a `fl::Exception` if `x` is not a valid `scalar`.
-* **(VERY important)** Marked method (from v4.0) `Operation::toScalar(std::string, bool, scalar) FL_IDELETE;` and removed its implementation such that its usage is prevented at compile time in `C++11` and at linker time in `C++98`. Please, use the appropriate `Op::toScalar` methods mentioned above.
-+ Renamed method `Op::isNan` to `Op::isNaN`.
-* Added method `fl::Op::isFinite(x)` which returns `not (isNaN(x) or isInf(x))`.
-* Changed `fl::Op::isEq(a,b)` to return `true` if `a == b == NaN`.
-* Changed `fl::Op::isEq(a,b)` to return `true` if `a == b == Inf`.
-* Changes to `fl::Op::isEq` affect other comparison methods `fl::Op::is[Lt|LEq|GEq|Gt]`.
-* Added shortcuts of comparisons `fl::Op::[gt,lt,ge,le,eq,neq](scalar a, scalar b)`, mostly to provide binary versions (without `macheps`) for term `Function`.
-* Deleted method `Op::repeat`.
-* Removed method `fuzzylite::configuration()`.
-* Changed default `fuzzylite::_macheps = 1e-6;`.
-* Renamed method `Op::makeValidId` to `Op::validName`, which now returns `"unnamed"` for empty strings.
-
-
-
-####<a name="new-engine">Engine</a>
-* **(VERY important)** Moved `Engine::hedges` (and relevant methods) to `Rule::hedges`.
-* Added enumeration for the type of engine: `enum Engine::Type{Mamdani, Larsen, TakagiSugeno, Tsukamoto, InverseTsukamoto, Hybrid, Unknown}`.
-* Added method `Type Engine::type(std::string* name, std::string* reason)` to infer the type of the engine based on its configuration, additionally provides the name of the type and the inference reasons for its type.
-* **(important)** Changed method `Engine::isReady(std::string)` to satisfy the default operation of controllers. The method `Engine::isReady(std::string)` was initially conceived to provide information before a potential `[signal 11] Segmentation fault` happened due to improper configuration. However, given the improved handling of signals and exceptions mentioned in Section [General](#new-general), using method `Engine::isReady(std::string)` is not necessary except for providing suggestions of what could potentially cause an error.
-* Added methods `Engine::set[Input|Output]Variables(std::vector)` and `Engine::setRuleBlocks(std::vector)`.
-* Added methods `Engine::[input|output]Variables()` and `Engine::ruleBlocks()` to return mutable references.
-* Added method `Engine::variables()` to retrieve a vector (copy) containing the `InputVariables` followed by the `OutputVariables`.
-* Added method `Engine::updateReferences()` to update the references to the engine in all the necessary linguistic terms (i.e., `Linear` and `Function`).
-* Added method `Engine::clone()`.
-* Added copy constructors, assignment operators, and default move constructor to `Engine`.
-
-
-
-####<a name="new-inoutvars">Input Variables and Output Variables</a>
-* **(important)** Added methods `OutputVariable::[get|set]OutputValue()` to [retrieve|store] value from defuzzification
-* **(important)** Changed return type of `scalar OutputVariable::defuzzify()` to `void OutputVariable::defuzzify()` because now it automatically stores the defuzzified output value, and also stores the previous *valid* output value regardless of locks. Like in version 4.0, if `OutputVariable::lockPreviousOutputValue=true`, and the defuzzified output value is not valid (i.e., `[NaN|Inf]`) or no rules were activated, then the defuzzified output value is replaced for the previous valid output value.
-* Removed method `OutputVariable::defuzzifyNoLocks()`.
-* Renamed variable `OutputVariable::lastValidOutputValue` to `OutputVariable::previousOutputValue`.
-* **(important)** Renamed method `OutputVariable::[get|set]LastValidOutput()` to `OutputVariable::[get|set]PreviousOutputValue()`.
-* Renamed variable `OutputVariable::lockValidOutput` to `OutputVariable::lockPreviousOutputValue`.
-* **(important)** Renamed method `OutputVariable::setLockValidOutput()` to `OutputVariable::setLockPreviousOutputValue()`.
-* **(important)** Renamed method `OutputVariable::isLockingValidOutput()` to `OutputVariable::isLockedPreviousOutputValue()`.
-* Renamed variable `OutputVariable::lockOutputRange` to `OutputVariable::lockOutputValueInRange`.
-* **(important)** Renamed method `OutputVariable::setLockOutputRange()` to `OutputVariable::setLockOutputValueInRange()`.
-* **(important)** Renamed method `OutputVariable::isLockingOutputRange()` to `OutputVariable::isLockedOutputValueInRange()`.
-* Added methods `std::string InputVariable::fuzzyInputValue()` and `std::string OutputVariable::fuzzyOutputValue()`.
-* Added method `OutputVariable::clear()` to clear the fuzzy output, and set `OutputVariable::previousOutputValue = fl::nan` and set `OutputVariable::outputValue = fl::nan`.
-* Added copy constructors, assignment operators, move constructors and move operators to [Input|Output]Variable.
-* Added method `Variable::terms()` to return mutable reference.
-* **(important)** Changed `OutputVariable::[defuzzifier|fuzzyOutput]` to smart pointers (`FL_unique_ptr`).
-
-
-#### <a name="new-terms">Linguistic Terms</a>
-* **(VERY important)** Added Term::[get|set]Height to define the height of *integral* terms, and multiply their respective membership functions accordingly.
-* Added copy constructors, assignment operators, move constructors and move operators to every `Term`.
-* **(VERY important)** Parameters of all terms are set by default to `fl::nan`.
-* **(important)** Renamed method `Term::copy()` to `Term::clone()` in every `Term`.
-* Added method `Term::updateReference(Term*, Engine*)` to ensure `Linear` and `Function` terms have updated pointers to the `Engine` (useful when cloning and copy-constructing).
-+ **(important)** Added linguistic terms `Concave`, `Cosine` and `Spike`.
-* **(important)** Changed `Accumulated` to take `Activated*` terms instead of `const Terms*`.
-* Removed `const` from return type of method `SNorm* Accumulated::[get|set]Accumulation()`.
-* Changed `Accumulated::accumulation` to a smart pointer (`FL_unique_ptr`).
-* Added method `Accumulated::terms()` to return mutable reference.
-* **(important)** Renamed methods `Triangle::[set|get][A|B|C]` to `::[set|get]Vertex[A|B|C]`.
-* **(important)** Renamed methods `Trapezoid::[set|get][A|B|C|D]` to `::[set|get]Vertex[A|B|C|D]`.
-* **(important)** Renamed term `Thresholded` to `Activated`.
-* **(important)** Renamed methods `Thresholded::[set|get]Threshold()` to `Activated::[set|get]Degree()`.
-* Added enumeration `[Ramp|Sigmoid]::Direction{ NEGATIVE, ZERO, POSITIVE }` to refer to the slope.
-* Added methods `Ramp::direction()` and `Sigmoid::direction()` to retrieve direction of slope.
-* Removed Exception Specification from methods in `Discrete`, `Linear` and `Function` terms.
-
-#### <a name="new-linear-discrete">Linear and Discrete Terms</a>
-* **(important)** Changed `Linear` from having pointers to the input variables to having a pointer to the `Engine`.
-* Changed visibility of `Linear::coefficients` to `protected`.
-* **(important)** Added methods `Linear::coefficients()`, `Linear::setCoefficients()`.
-* `Linear` term no longer throws exception when `inputVariables != |coefficients|`.
-* **(important)** Removed public vector of variables `Discrete::[x|y]`.
-* **(important)** Added a `typedef std::pair<scalar, scalar> Discrete::Pair`.
-* **(important)** Changed representation of `Discrete::[x|y]` from `std::vector<scalar>` to `std::vector<Discrete::Pair>`.
-* Added methods `Discrete::setXY()` and `Discrete::xy()` to set and get the new representation of pairs.
-* Added methods `Discrete::xy(int index)` to retrieve `Discrete::Pair` at `index`.
-* **(important)** Added methods `Discrete::toPairs(std::vector<scalar>)` which throws an exception if the vector is missing a value (i.e., `std::vector<scalar>.size() % 2 != 0`), and `Discrete::toPairs(std::vector<scalar>, scalar missingValue)` which adds `missingValue` in case `std::vector<scalar>.size() %2 == 1`, hence never throwing an exception.
-* Added method `Discrete::toVector(std::vector<Discrete::Pair>)` to convert `std::vector<Discrete::Pair>` to a `std::vector<scalar>`.
-* Added method `Discrete::formatXY()` to get pairs `(x,y)` nicely formatted.
-
-####<a name="new-function">Function Term</a>
-* **(important)** Merged structs `Function::Operator` and `Function::BuiltInFunction` into a single `struct Function::Element`.
-* **(EXTREMELY important)** Changed the precedence of all built-in instances of `Function::Element` of type `Operator` starting from `100` and decreasing by `10`. The precedence of built-in operators is the following: `(100)` Logical not `[!]` and Negation `[~]`; `(90)` Power `[^]`; `(80)` Multiplication `[*]`, Division `[/]` and Modulo `[%]`; `(70)` Addition `[+]` and Subtraction `[-]`; `(60)` Logical AND `[and]` and Logical OR `[or]`. If you have registered your own operators, please adjust their precedence as required.
-* Added to `Function` built-in comparison functions `gt,lt,ge,le,eq` and operator logical not `!`.
-* Modified typedefs `Function::Unary` and `Function::Binary` to take `scalar` instead of `double`.
-* Changed `public Function::root` to `protected Function::_root` and it is now a smart pointer (`FL_unique_ptr`).
-* Added method `Function::root()` to return pointer to `Function::root`.
-* **(EXTREMELY important)** Moved built-in functions and operators from `Function` to a `FunctionFactory`.
-
-
-#### <a name="new-norms-hedges">[T|S]Norms and Hedges</a>
-+ **(important)** Fixed operation when using multiple hedges to operate from right-most to left-most, e.g. `if Ambient is not very extremely bright`, now evaluates as follows `not(very(extremely(bright)))`.
-+ Added `TNorm` nilpotent minimum and `SNorm` nilpotent maximum.
-* Added clone methods to every `Norm`.
-* Added clone methods to every `Hedge`.
-* **(VERY important)** Moved `Engine::hedges` to `Rule::hedges`.
-
-
-#### <a name="new-rules">Rules</a>
-* **(VERY important)** Moved `Engine::hedges` (and methods) to `Rule::hedges`.
-* Added method `Rule::isLoaded()` to determine whether a rule was properly parsed and thus can be activated.
-* Added method `Rule::unload()` to allow the existence of a rule in an inactive state (useful for invalid rules).
-* **(important)** Removed variable `Rule::FL_ASSIGNS` and method `Rule::assignsKeyword()`, for which the symbol `=` in rules is no longer valid.
-* Changed visibility of method `Rule::setText()` to `public`.
-* Added method `Rule::load(const Engine*)`.
-* Changed `Rule::[antecedent|consequent]` to smart pointers (`FL_unique_ptr`).
-* **(important)** Renamed method `Antecedent::[get|set]Root()` to `Antecedent::[get|set]Expression()`.
-* Added methods `[Antecedent|Consequent]::[get|set]Text()`.
-* **(important)** Added methods `[Antecedent|Consequent]::[load|unload]()`, with the same objective as `Rule::[load|unload]()`.
-
-#### <a name="new-ruleblocks">Rule Blocks</a>
-* Added method `RuleBlock::reloadRules()`.
-* Added method `RuleBlock::setRules(std::vector)`.
-* Added method `RuleBlock::rules()` to return mutable reference.
-* Removed `const` from `TNorm` and `SNorm` in `RuleBlock::[get|set][Conjunction|Disjunction|Activation]()`, respectively.
-* Changed `RuleBlock::[conjunction|disjunction|activation]` to smart pointers (`FL_unique_ptr`).
-* **(VERY important)** Added basic rule chaining such that an `OutputVariable` can be utilized in the `Antecedent` of a `Rule`. For example, considering the rule `if Power is high then InversePower is low`, where `Power` and `InversePower` are both output variables, the activation degree of the `Antecedent` will correspond to the accumulated activation degree of the term `high` in the fuzzy output of `Power`. If `Power::accumulation = none`, the accumulated activation degree of the term `high` will be computed as the regular sum of the activation degrees of term `high` in the fuzzy output of `Power`. Otherwise, the accumulated activation degree is computed utilizing the `Power::accumulation` operator.
-
-
-#### <a name="new-weighted">Weighted Defuzzifiers</a>
-+ **(VERY important)** Performance improvements of Takagi-Sugeno controllers by over 55% (with respect to v4.0) based on the average performance on the examples included.
-* **(important)** Created class `WeightedDefuzzifier` from which classes `Weighted[Average|Sum]` are derived.
-* **(important)** Added enumeration `WeightedDefuzzifier::Type{Automatic, TakagiSugeno, Tsukamoto}` and respective methods `WeightedDefuzzifier::[get|set]Type()` and `WeightedDefuzzifer::getTypeName()`.
-* Added method `WeightedDefuzzifier::inferType(Term*)` to automatically determine the `WeightedDefuzzifier::Type` based on the class of `Term`.
-* **(important)** By default, `WeightedDefuzzifier::type = Automatic`, which automatically infers the type based on the `WeightedDefuzzifier::inferType()`.
-* **(important)** There is a small performance penalty when using `WeightedDefuzzifier::type = Automatic` because `WeightedDefuzzifier::inferType()` performs three `dynamic_cast<>`.
-* **(important)** Deleted class `Tsukamoto`. Its method `static tsukamoto()` was moved to `virtual WeightedDefuzzifier::tsukamoto()`, which allows overriding it
-* Added support for `Tsukamoto` with `Concave` terms.
-+ **(EXTREMELY important)** In version 5.0, the traditional operation of Takagi-Sugeno and Tsukamoto controllers is achieved by setting `OutputVariable::accumulation = none`. Unlike version 4.0, the `RuleBlock::activation` will not have any effect on Takagi-Sugeno nor Tsukamoto controllers, for which `RuleBlock::activation` should also be set to `none`. More information about the roles of the `OutputVariable::accumulation` and `RuleBlock::activation` operators are detailed as follows. Refer to [sciweavers](http://www.sciweavers.org/free-online-latex-equation-editor) to convert LaTeX equations.
-+ **(VERY important)** In version 5.0, the role of the `RuleBlock::activation` `TNorm` on the `Weighted[Average|Sum]` always performs a regular multiplication of the weights and the values (i.e., $w_i \times z_j$) regardless of the `TNorm` chosen. In other words, selecting any `RuleBlock::activation` for `Weighted[Average|Sum]` is irrelevant, and should be set to `none` as every `TNorm` will have the same multiplication effect. This operation is different from `fuzzylite` version 4.0, where the `RuleBlock::activation` operator was utilized to multiply the weights and values (i.e. $w_i \otimes z_j$), and therefore the traditional operation of the `Weighted[Average|Sum]` was achieved when `RuleBlock::activation = AlgebraicProduct;`.
-+ **(VERY important)** In version 5.0, the role of the `OutputVariable::accumulation = none` on the `Weighted[Average|Sum]` results in a regular sum of the multiplied weights and values, i.e., $\dfrac{\sum_i^n w_i \times z_j}{\sum_i^n w_i}$. However, if the `OutputVariable::accumulation != none`, the role of the `SNorm` will be to accumulate the activation degrees of the *repeated* terms in the fuzzy output of the variable. For example, considering the rules `if Ambient is dark then Power is high` and `if Ambient is medium then Power is high`, for any input value of `Ambient` that activates both rules, the fuzzy output of `Power` will have the term `high` activated with the degree from `Rule 1`, and the term `high` activated with the degree from `Rule 2`. Since the term `high` appears twice in the fuzzy output, the role of the accumulation operator will be to accumulate the activation degree of `high` resulting in $\dfrac{(w_1 \oplus w_2) \times z_{high}}{(w_1 \oplus w_2)}$. If another term were activated, the result would be $\dfrac{(w_1 \oplus w_2) \times z_{high} + w_i \times z_j}{(w_1 \oplus w_2) + w_i}$. In version 4.0, the accumulation operator had no effect on the `Weighted[Average|Sum]`.
-
-
-
-#### <a name="new-integral">Integral Defuzzifiers</a>
-* **(important)** Proper handling of indefinite integral defuzzification, that is, returning `fl::nan` when `[minimum|maximum]=[NaN|Inf]`.
-* Default resolution of integration is defined as `static int IntegralDefuzzifier::defaultResolution=200`, and can be changed via `static IntegralDefuzzifier::setDefaultResolution()`.
-+ **(important)** In `fuzzylite`, the accumulation operator has been for several versions associated with the output variables and **not** with the rule blocks, despite that the FCL format and other fuzzy logic control libraries associate the accumulation operator with the rule blocks. The argument for such a decision is that `fuzzylite` provides **coherent** support for multiple rule blocks operating on the same engine and on the same output variables. For example, if multiple rule blocks operate on the same output variables, it only makes sense to have a single accumulation operator associated with each output variable such that the defuzzifier can naturally operate over the accumulated fuzzy output. Differently, if the accumulation operator were associated with the rule block, the possibility of having different accumulation operators in different rule blocks questions (1) **the possibility of having multiple rule blocks operating over the same output variables**; and (2) **the usage of different accumulation operators over the accumulation and defuzzification processes**. Certainly, if (1) is not possible, i.e, different rule blocks only operate on different output variables, then (2) is not a problem because the accumulation process and defuzzification of each variable will only have a single accumulation operator. It is therefore that the association of the accumulation operator with the output variable in `fuzzylite` provides a **better design** and an additional feature that allows having multiple rule blocks operating over the same output variables.
-* Added copy constructors, assignment operators, move constructors and move operators.
-* Added method `Defuzzifier::clone()`.
-
-####<a name="new-imex">Importers and Exporters</a>
-* **(EXTREMELY important)** Since terms have a new `height` property, `[Fll|Fis|Fcl]Exporter` exports terms with an additional `scalar` at the end, which indicates the `height` of the term. However, if `height=1.0`, the additional scalar is not exported.
-* **(EXTREMELY important)** In `[Fll|Fis|Fcl]Importer`, when importing terms, if there is an additional `scalar` it will be assumed as the `height` of the term. For example, `term: high Gaussian 1.0 0.5 0.75` will create a `Gaussian` term with mean `1.0`, standard deviation `0.5` and height `0.75`. This is **extremely important** because there are some examples from Matlab in `fis` format that append a useless `0.0` to some terms.
-* **(EXTREMELY important)** In `FisExporter`, if the Takagi-Sugeno controller has no `activation` or `accumulation` operators (as it should generally be the case), Octave and Matlab will not be able to import the `fis` file. To overcome this issue, you will have to set `ImpMethod="min"` and `AggMethod="max"`, where `ImpMethod` and `AggMethod` are just dummy operators that can be set to any `TNorm` and `SNorm`, respectively.
-+ **(important)** Improved compatibility of the exported code obtained with `[Fis|Fcl]Exporter` by exporting the additional features of `fuzzylite` only when these are different from the default operation. For example, the following features will not be exported given their values: `[Input|Output]Variable::enabled = true;`, `OutputVariable::lock-previous = false;`, `OutputVariable::lock-range = false;`, amongst others.
-* **(important)** Renamed FLL property `'lock-valid'` to `'lock-previous'`.
-* **(important)** Renamed FIS property `'LockValid'` to `'LockPrevious'`.
-* **(important)** Renamed FCL property `'LOCK: VALID'` to `'LOCK: PREVIOUS'`.
-+ **(important)** Export your controllers to files using `[Fll|Fld|Fis|Fcl]Exporter::toFile()`.
-+ **(important)** Import your controllers from files using `[Fll|Fis|Fcl]Importer::fromFile()`.
-+ **(important)** `FldExporter` exports the FuzzyLite Dataset of an engine utilizing the input values of another FuzzyLite Dataset.
-* `FldExporter` no longer restarts the engine when exporting.
-* **(important)** Renamed method `FldExporter::toWriter()` to `FldExporter::write()`.
-* Removed variable and methods for property `int FldExporter::_maximum`.
-* Added option in `CppExporter` to prepend the namespace prefix `fl::` to the classes, and by default it does not prepend prefix.
-* Improvement accuracy of `FisImporter` when importing `fis` files whose scalar values have more than three decimal numbers.
-* Renamed methods in `[Fis|Fcl]Importer::extract*` to `[Fis|Fcl]Importer::parse*`.
-
-
-
-#### <a name="new-factories">Factories</a>
-* Created a generic `CloningFactory<T>` to create clones of objects.
-* **(important)** Created `FunctionFactory` based on `CloningFactory<Function::Element>` where function operators and methods are stored to be cloned as necessary by `Function`. Additional functions and operators can be easily registered.
-* **(VERY important)** Moved built-in functions and operators from `Function` to `FunctionFactory`.
-* Renamed methods `Factory<T>::[register|deregister]Class()` to `Factory<T>::[register|deregister]Constructor()`.
-* **(important)** Renamed `Factory<T>` to `ConstructionFactory<T>`.
-* Renamed `typedef Factory::Creator` to `typedef Factory::Constructor`.
-* Changed pointers of `FactoryManager` to smart pointers (`FL_unique_ptr`).
-
-
-
-#### <a name="new-examples">Examples</a>
-* **(important)** Added two examples for basic rule chaining: `mamdani/SimpleDimmerInverse.fll` and `mamdani/Laundry.fll`.
-* Included the `original` example files in `fis` format.
-* Added conversion of `examples/original/*.fis` to `examples/original/*.fll`.
-* Modified `original/takagi-sugeno` examples to reflect `activation: none; accumulation: none;`.
-* Updated FLD examples produced from the `original` examples.
-+ **(important)** Added file [`fuzzylite/src/m/compare.m`](/fuzzylite/src/m/compare.m) <!---check link--> to compare the output values of your `fuzzylite` engines with the evaluation of the same engine in Octave/Matlab.
-+ **(important)** Added file [`examples/examples.mat`](/examples/examples.mat) <!---check link--> containing the comparison of the output values between `fuzzylite` and Matlab's Fuzzy Logic Toolbox.
-* Added code to perform benchmarks in Linux.
-
-
-#### <a name="new-console">Console</a>
-* **(important)** Console includes option to import custom input dataset from file an export its respective output values.
-* **(important)** Created the FuzzyLite Interactive Console, which can be started by specifying an input file and the output format, e.g., `fuzzylite -i SimpleDimmer.fll -of fld`.
-* Console provides more information about its usage.
-
-
-
-####<a name="new-fixes"> Fixes Bugs and Leaks</a>
-+ **(important)** Fixed operation when using multiple hedges to operate from right-most to left-most, e.g. `if Ambient is not very extremely bright` evaluates as follows `not(very(extremely(bright)))`.
-* **(important)** Fixed membership functions of specific cases of `Triangle` when `a=b` or `b=c`, and `Trapezoid` when `a=b` or `c=d`.
-* Fixed minor memory leak at `~RuleBlock::[conjunction|disjunction|activation]`.
-* Fixed minor memory leak at `~Accumulated::accumulation`.
-* Fixed minor memory leak at `~OutputVariable::defuzzifier`.
-* Fixed minor memory leak at `~Function::Node`.
-* Fixed minor memory leak at `~FactoryManager::[factories]`.
-* Fixed some rethrowing of exceptions to provide proper information about errors. Specifically, changed some rethrown exceptions from `throw ex;` to just `throw;`
-* Fixed building using `-DFL_USE_FLOAT=ON`
-
-
-***
-
-For more information, visit [www.fuzzylite.com](http://www.fuzzylite.com).
-
-fuzzylite&trade; is a trademark of FuzzyLite Limited.
-
-Copyright &#xa9; 2010-2014 FuzzyLite Limited. All rights reserved. \ No newline at end of file
+* New R scripts for each example and its respective surfaces in `pdf` formats. \ No newline at end of file
diff --git a/README.md b/README.md
index 21c873a..0453b8a 100644
--- a/README.md
+++ b/README.md
@@ -1,149 +1,301 @@
-fuzzylite &reg; [![Build Status](https://travis-ci.org/fuzzylite/fuzzylite.svg?branch=v5.x)](https://travis-ci.org/fuzzylite/fuzzylite) <img src="https://github.com/fuzzylite/fuzzylite/raw/v5.x/fuzzylite.png" align="right" alt="fuzzylite">
-===========
+fuzzylite 6.0 &reg;
+=================
+<img src="https://raw.githubusercontent.com/fuzzylite/fuzzylite/release/fuzzylite.png" align="right" alt="fuzzylite">
+
A Fuzzy Logic Control Library in C++
------------------------------------
By: [Juan Rada-Vilela](http://www.fuzzylite.com/jcrada), Ph.D.
+Released: 20/March/2017
+
+[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](http://www.gnu.org/licenses/gpl-3.0)
+[![Build Status](https://travis-ci.org/fuzzylite/fuzzylite.svg?branch=release)](https://travis-ci.org/fuzzylite/fuzzylite)
+[![Build status](https://ci.appveyor.com/api/projects/status/065g596yxdhkt2se/branch/release)](https://ci.appveyor.com/project/jcrada/fuzzylite/branch/release)
+[![Coverity Status](https://scan.coverity.com/projects/5759/badge.svg)](https://scan.coverity.com/projects/5759)
***
### Table of Contents
-[License](#license) &nbsp;
-[Introduction](#introduction) &nbsp;
-[Features](#features) &nbsp;
-[Example](#example) &nbsp;
-[Bulding from source](#building) &nbsp;
-[Binaries](#binaries) &nbsp;
-[What's next](#whatsnext) &nbsp;
-[What's new](#whatsnew) : [General](#new-general), [Macros](#new-macros), [Operation](#new-operation), [Engine](#new-engine), [Input Variables and Output Variables](#new-inoutvars), [Linguistic Terms](#new-terms), [Linear and Discrete Terms](#new-linear-discrete), [Function Term](#new-function), [[T|S]Norms and Hedges](#new-norms-hedges), [Rules](#new-rules), [Rule Blocks](#new-ruleblocks), [Weighted Defuzzifiers](#new-weighted), [Integral Defuzzifiers](#new-integral), [Importers and Exporters](#new-imex), [Examples](#new-examples), [Console](#new-console), [Fixed Bugs and Leaks](#new-fixes)
+[License](#license) <br/>
+[Introduction](#introduction)<br/>
+[Features](#features)<br/>
+[Example](#example) <br/>
+[Compile, Link, and Execute](#compile-build-execute)<br/>
+[Bulding from Source](#building)<br/>
+[Binaries](#binaries) <br/>
+[What's new](#whatsnew)<br/>
+[What's next](#whatsnext) <br/>
-### <a name="license">License</a>
-`fuzzylite` will **always** be free and open source. However, `fuzzylite` is **no** longer released under the Apache License. Since version 5.0, `fuzzylite` is **dual-licensed** under the [**GNU Lesser General Public License (LGPL) v3.0**](https://www.gnu.org/licenses/lgpl.html) and a **paid commercial license**.
-
-In brief, an important restriction the LGPL imposes on your closed-source application is that **you are no longer allowed to statically link** against `fuzzylite`. If your application requires static linking, **you will need to purchase a commercial license** from FuzzyLite Limited. Please, contact [sales@fuzzylite.com](mailto:sales@fuzzylite.com) for commercial licenses, and refer to the [GNU LGPL](https://www.gnu.org/licenses/lgpl.html) for further information on your rights.
-The change of license is an attempt to raise funds in order to be able to work part-time in the development of the `fuzzylite` family of products, namely `fuzzylite` (C++), `jfuzzylite` (Java), `pyfuzzylite` (Python), and `QtFuzzyLite` (Windows/Linux/Mac).
-
-**There are still many things to do!**
+***
-Besides [donations](http://www.fuzzylite.com/donations/), you can significantly contribute by **purchasing a license** of the entirely new [`QtFuzzyLite`](http://www.fuzzylite.com/QtFuzzyLite/) commercial application. In addition, if you require (paid) private support, please contact [jcrada@fuzzylite.com](mailto:jcrada@fuzzylite.com).
+### <a name="license">License</a>
+`fuzzylite 6.0` is licensed under the [**GNU General Public License (GPL) 3.0**](https://www.gnu.org/licenses/gpl.html). You are **strongly** encouraged to support the development of the FuzzyLite Libraries by purchasing a license of [`QtFuzzyLite 6`](http://www.fuzzylite.com/downloads).
+[`QtFuzzyLite 6`](http://www.fuzzylite.com/downloads/) is the new and (very likely) the best graphical user interface available to easily design and directly operate fuzzy logic controllers in real time. Available for Windows, Mac, and Linux, its goal is to significantly **speed up** the design of your fuzzy logic controllers, while providing a very **useful**, **functional** and **beautiful** user interface.
+Please, download it and check it out for free at [www.fuzzylite.com/downloads/](http://www.fuzzylite.com/downloads/).
***
+### <a name="introduction">Introduction</a>
-### <a name="introduction">Introduction</a>
-`fuzzylite` is a free and open-source fuzzy logic control library programmed in C++ for multiple platforms (Windows, Linux, Mac, iOS). Its goal is to allow you to easily create fuzzy logic controllers in a few steps utilizing object-oriented programming without requiring any third-party libraries.
+`fuzzylite` is a free and open-source fuzzy logic control library programmed in C++ for multiple platforms (e.g., Windows, Linux, Mac, iOS). [`jfuzzylite`](https://github.com/fuzzylite/jfuzzylite/) is the equivalent library for Java and Android platforms. Together, they are the FuzzyLite Libraries for Fuzzy Logic Control.
+
+<center>
+```
+The goal of the FuzzyLite Libraries is to easily design and efficiently operate fuzzy logic controllers following an object-oriented programming model without relying on external libraries.
+```
+</center>
#### Reference
-If you are using `fuzzylite`, please cite the following reference in your article:
+If you are using the FuzzyLite Libraries, please cite the following reference in your article:
-Juan Rada-Vilela. fuzzylite: a fuzzy logic control library, 2014. URL http://www.fuzzylite.com.
+Juan Rada-Vilela. fuzzylite: a fuzzy logic control library, 2017. URL http://www.fuzzylite.com/.
```bibtex
@misc{fl::fuzzylite,
author={Juan Rada-Vilela},
title={fuzzylite: a fuzzy logic control library},
- url={http://www.fuzzylite.com},
- year={2014}}
+ url={http://www.fuzzylite.com/},
+ year={2017}}
```
+#### Documentation
+The documentation for the `fuzzylite` library is available at: [www.fuzzylite.com/documentation/](http://www.fuzzylite.com/documentation/).
+
***
### <a name="features">Features</a>
-**Controllers** *Types* (5) Mamdani, Takagi-Sugeno, Larsen, Tsukamoto, Inverse Tsukamoto
+**(6) Controllers**: Mamdani, Takagi-Sugeno, Larsen, Tsukamoto, Inverse Tsukamoto, Hybrids
+
+**(21) Linguistic terms**: (4) *Basic*: triangle, trapezoid, rectangle, discrete.
+(9) *Extended*: bell, cosine, gaussian, gaussian product, pi-shape, sigmoid difference, sigmoid product, spike.
+(5) *Edges*: binary, concave, ramp, sigmoid, s-shape, z-shape.
+(3) *Functions*: constant, linear, function.
+
+**(7) Activation methods**: general, proportional, threshold, first, last, lowest, highest.
-**Linguistic terms** *Basic* (4) triangle, trapezoid, rectangle, discrete. *Extended* (9) bell, cosine, gaussian, gaussian product, pi-shape, sigmoid difference, sigmoid product, spike. *Edges* (4) concave, ramp, sigmoid, s-shape, z-shape. *Functions* (3) constant, linear, function.
+**(8) Conjunction and Implication (T-Norms)**: minimum, algebraic product, bounded difference, drastic product, einstein product, hamacher product, nilpotent minimum, function.
-**Conjunction and Activation** *T-Norm* (7) minimum, algebraic product, bounded difference, drastic product, einstein product, hamacher product, nilpotent minimum.
+**(10) Disjunction and Aggregation (S-Norms)**: maximum, algebraic sum, bounded sum, drastic sum, einstein sum, hamacher sum, nilpotent maximum, normalized sum, unbounded sum, function.
-**Disjunction and Accumulation** *S-Norm* (8) maximum, algebraic sum, bounded sum, normalized sum, drastic sum, einstein sum, hamacher sum, nilpotent maximum.
+**(7) Defuzzifiers**: (5) *Integral*: centroid, bisector, smallest of maximum, largest of maximum, mean of maximum.
+(2) *Weighted*: weighted average, weighted sum.
-**Defuzzifiers** *Integral* (5) centroid, bisector, smallest of maximum, largest of maximum, mean of maximum, *Weighted* (2) weighted average, weighted sum.
+**(7) Hedges**: any, not, extremely, seldom, somewhat, very, function.
-**Hedges** *Types* (6) any, not, extremely, seldom, somewhat, very.
+**(3) Importers**: FuzzyLite Language `fll`, Fuzzy Inference System `fis`, Fuzzy Control Language `fcl`.
+
+**(7) Exporters**: `C++`, `Java`, FuzzyLite Language `fll`, FuzzyLite Dataset `fld`, `R` script, Fuzzy Inference System `fis`, Fuzzy Control Language `fcl`.
+
+**(30+) Examples** of Mamdani, Takagi-Sugeno, Tsukamoto, and Hybrid controllers from `fuzzylite`, Octave, and Matlab, each included in the following formats: `C++`, `Java`, `fll`, `fld`, `R`, `fis`, and `fcl`.
-**Import** *Types* (3) FuzzyLite Language `fll`, Fuzzy Inference System `fis`, Fuzzy Control Language `fcl`.
-**Export** *Types* (6) `C++`, `Java`, FuzzyLite Language `fll`, FuzzyLite Dataset `fld`, Fuzzy Inference System `fis`, Fuzzy Control Language `fcl`.
-**Examples** (30+) of Mamdani, Takagi-Sugeno and Tsukamoto controllers from `fuzzylite`, Octave and Matlab, each included in the following formats: `C++`, `Java`, `fll`, `fld`, `fis`, and `fcl`.
***
### <a name="example">Example</a>
+#### FuzzyLite Language
+```yaml
+#File: ObstacleAvoidance.fll
+Engine: ObstacleAvoidance
+InputVariable: obstacle
+ enabled: true
+ range: 0.000 1.000
+ lock-range: false
+ term: left Ramp 1.000 0.000
+ term: right Ramp 0.000 1.000
+OutputVariable: mSteer
+ enabled: true
+ range: 0.000 1.000
+ lock-range: false
+ aggregation: Maximum
+ defuzzifier: Centroid 100
+ default: nan
+ lock-previous: false
+ term: left Ramp 1.000 0.000
+ term: right Ramp 0.000 1.000
+RuleBlock: mamdani
+ enabled: true
+ conjunction: none
+ disjunction: none
+ implication: AlgebraicProduct
+ activation: General
+ rule: if obstacle is left then mSteer is right
+ rule: if obstacle is right then mSteer is left
+```
+```cpp
+//File: ObstacleAvoidance.cpp
+#include "fl/Headers.h"
+
+int main(int argc, char* argv[]){
+ using namespace fl;
+ Engine* engine = FllImporter().fromFile("ObstacleAvoidance.fll");
+
+ std::string status;
+ if (not engine->isReady(&status))
+ throw Exception("[engine error] engine is not ready:\n" + status, FL_AT);
+
+ InputVariable* obstacle = engine->getInputVariable("obstacle");
+ OutputVariable* steer = engine->getOutputVariable("mSteer");
+
+ for (int i = 0; i <= 50; ++i){
+ scalar location = obstacle->getMinimum() + i * (obstacle->range() / 50);
+ obstacle->setValue(location);
+ engine->process();
+ FL_LOG("obstacle.input = " << Op::str(location) <<
+ " => " << "steer.output = " << Op::str(steer->getValue()));
+ }
+}
+```
+#### C++
```cpp
+//File: ObstacleAvoidance.cpp
#include "fl/Headers.h"
int main(int argc, char* argv[]){
using namespace fl;
- Engine* engine = new Engine("simple-dimmer");
-
- InputVariable* ambient = new InputVariable;
- ambient->setName("Ambient");
- ambient->setRange(0.000, 1.000);
- ambient->addTerm(new Triangle("DARK", 0.000, 0.500));
- ambient->addTerm(new Triangle("MEDIUM", 0.250, 0.750));
- ambient->addTerm(new Triangle("BRIGHT", 0.500, 1.000));
- engine->addInputVariable(ambient);
-
- OutputVariable* power = new OutputVariable;
- power->setName("Power");
- power->setRange(0.000, 2.000);
- power->setDefaultValue(fl::nan);
- power->addTerm(new Triangle("LOW", 0.000, 1.000));
- power->addTerm(new Triangle("MEDIUM", 0.500, 1.500));
- power->addTerm(new Triangle("HIGH", 1.000, 2.000));
- engine->addOutputVariable(power);
-
- RuleBlock* ruleblock = new RuleBlock;
- ruleblock->addRule(Rule::parse("if Ambient is DARK then Power is HIGH", engine));
- ruleblock->addRule(Rule::parse("if Ambient is MEDIUM then Power is MEDIUM", engine));
- ruleblock->addRule(Rule::parse("if Ambient is BRIGHT then Power is LOW", engine));
- engine->addRuleBlock(ruleblock);
-
- engine->configure("", "", "Minimum", "Maximum", "Centroid");
+ //Code automatically generated with fuzzylite 6.0.
+
+ using namespace fl;
+
+ Engine* engine = new Engine;
+ engine->setName("ObstacleAvoidance");
+ engine->setDescription("");
+
+ InputVariable* obstacle = new InputVariable;
+ obstacle->setName("obstacle");
+ obstacle->setDescription("");
+ obstacle->setEnabled(true);
+ obstacle->setRange(0.000, 1.000);
+ obstacle->setLockValueInRange(false);
+ obstacle->addTerm(new Ramp("left", 1.000, 0.000));
+ obstacle->addTerm(new Ramp("right", 0.000, 1.000));
+ engine->addInputVariable(obstacle);
+
+ OutputVariable* mSteer = new OutputVariable;
+ mSteer->setName("mSteer");
+ mSteer->setDescription("");
+ mSteer->setEnabled(true);
+ mSteer->setRange(0.000, 1.000);
+ mSteer->setLockValueInRange(false);
+ mSteer->setAggregation(new Maximum);
+ mSteer->setDefuzzifier(new Centroid(100));
+ mSteer->setDefaultValue(fl::nan);
+ mSteer->setLockPreviousValue(false);
+ mSteer->addTerm(new Ramp("left", 1.000, 0.000));
+ mSteer->addTerm(new Ramp("right", 0.000, 1.000));
+ engine->addOutputVariable(mSteer);
+
+ RuleBlock* mamdani = new RuleBlock;
+ mamdani->setName("mamdani");
+ mamdani->setDescription("");
+ mamdani->setEnabled(true);
+ mamdani->setConjunction(fl::null);
+ mamdani->setDisjunction(fl::null);
+ mamdani->setImplication(new AlgebraicProduct);
+ mamdani->setActivation(new General);
+ mamdani->addRule(Rule::parse("if obstacle is left then mSteer is right", engine));
+ mamdani->addRule(Rule::parse("if obstacle is right then mSteer is left", engine));
+ engine->addRuleBlock(mamdani);
std::string status;
if (not engine->isReady(&status))
- throw Exception("Engine not ready. "
- "The following errors were encountered:\n" + status, FL_AT);
+ throw Exception("[engine error] engine is not ready:\n" + status, FL_AT);
- for (int i = 0; i < 50; ++i){
- scalar light = ambient->getMinimum() + i * (ambient->range() / 50);
- ambient->setInputValue(light);
+ for (int i = 0; i <= 50; ++i){
+ scalar location = obstacle->getMinimum() + i * (obstacle->range() / 50);
+ obstacle->setValue(location);
engine->process();
- FL_LOG("Ambient.input = " << Op::str(light) << " -> " <<
- "Power.output = " << Op::str(power->getOutputValue()));
+ FL_LOG("obstacle.input = " << Op::str(location) <<
+ " => " << "steer.output = " << Op::str(steer->getValue()));
}
}
```
-***
+### <a name="compile-build-execute">Compile, Link, and Execute</a>
+
+Once you have an engine written in C++, you can compile it to create an executable file which links to the `fuzzylite` library. The linking can be either static or dynamic. Basically, the differences between static and dynamic linking are the following. **Static linking** includes the `fuzzylite` library into your executable file, hence increasing its size, but the executable no longer needs to have access to the `fuzzylite` library files. **Dynamic linking** does not include the `fuzzylite` library into your executable file, hence reducing its size, but the executable needs to have access to the `fuzzylite` shared library file. When using dynamic linking, make sure that the shared library files are either in the same directory as the executable, or are reachable via environmental variables:
+
+```posh
+rem Windows:
+set PATH="\path\to\fuzzylite\release\bin;%PATH%"
+```
+```bash
+#Unix:
+export LD_LIBRARY_PATH="/path/to/fuzzylite/release/bin/:$LD_LIBRARY_PATH"
+```
+
+#### Windows
+The commands to compile your engine in Windows are the following:
+
+C++11 (default)
+```posh
+rem static linking:
+cl.exe ObstacleAvoidance.cpp fuzzylite-static.lib /Ipath/to/fuzzylite /EHsc /MD
+```
+```posh
+rem dynamic linking:
+cl.exe ObstacleAvoidance.cpp fuzzylite.lib /Ipath/to/fuzzylite /DFL_IMPORT_LIBRARY /EHsc /MD
+```
+
+C++98
+```posh
+rem static linking:
+cl.exe ObstacleAvoidance.cpp fuzzylite-static.lib /Ipath/to/fuzzylite /DFL_CPP98=ON /EHsc /MD
+```
+```posh
+rem dynamic linking:
+cl.exe ObstacleAvoidance.cpp fuzzylite.lib /Ipath/to/fuzzylite /DFL_IMPORT_LIBRARY /DFL_CPP98=ON /EHsc /MD
+```
+
+#### Unix
+The commands to compile your engine in Unix are the following:
+
+C++11 (default)
+```bash
+#static linking
+g++ ObstacleAvoidance.cpp -o ObstacleAvoidance -I/path/to/fuzzylite -L/path/to/fuzzylite/release/bin -lfuzzylite-static --std=c++11
+```
+```bash
+#dynamic linking
+g++ ObstacleAvoidance.cpp -o ObstacleAvoidance -I/path/to/fuzzylite -L/path/to/fuzzylite/release/bin -lfuzzylite -Wno-non-literal-null-conversion
+```
+
+C++98
+```bash
+#static linking
+g++ ObstacleAvoidance.cpp -o ObstacleAvoidance -I/path/to/fuzzylite -L/path/to/fuzzylite/release/bin -lfuzzylite-static -DFL_CPP98=ON
+```
+```bash
+#dynamic linking
+g++ ObstacleAvoidance.cpp -o ObstacleAvoidance -I/path/to/fuzzylite -L/path/to/fuzzylite/release/bin -lfuzzylite -DFL_CPP98=ON -Wno-non-literal-null-conversion
+```
+
+#### CMake
+Alternatively, you can use CMake to build your project linking to `fuzzylite`. Please, refer to the example application available at [examples/application]([/examples/application]).
-### <a name="whatsnext">What's Next?</a>
-+ Source code documentation
-+ Type-2 Fuzzy Logic Controllers
-+ Adaptive Neuro-Fuzzy Inference System (ANFIS)
-+ Fuzzy C-means data clustering
***
-### <a name="building">Building from Source</a>
-Building from source requires you to have CMake installed.
-The files [`fuzzylite/build.bat`](/fuzzylite/build.bat) and [`fuzzylite/build.sh`](/fuzzylite/build.sh) are automatic build scripts for Windows and Unix platforms, respectively. The usage of these scripts is presented as follows.
+### <a name="building">Building from Source</a>
+You can build the `fuzzylite` library from source using `CMake` [(cmake.org)](https://cmake.org/).
+
+The files [`fuzzylite/build.bat`](/fuzzylite/build.bat) and [`fuzzylite/build.sh`](/fuzzylite/build.sh) are build scripts for the Windows and Unix platforms, respectively.
+After building from source, the resulting binaries will be located in the sub-folders `fuzzylite/release/bin` and `fuzzylite/debug/bin`. The usage of these scripts is presented as follows.
#### Windows
```bash
@@ -169,26 +321,34 @@ where [options] can be any of the following:
help shows this information
```
-**(important)** After executing the building script, the binaries will be built and stored in the sub-folders `release/bin` and `debug/bin`.
-#### Advanced Building Options
-For more advanced building options, please check the contents of [`fuzzylite/build.bat`](/fuzzylite/build.bat) or [`fuzzylite/build.sh`](/fuzzylite/build.sh), and the contents of [`fuzzylite/CMakeLists.txt`](/fuzzylite/CMakeLists.txt).
-The following building options are available:
+#### Building Options
+For advanced building options, please check the contents of [`fuzzylite/build.bat`](/fuzzylite/build.bat) or [`fuzzylite/build.sh`](/fuzzylite/build.sh), and the contents of [`fuzzylite/CMakeLists.txt`](/fuzzylite/CMakeLists.txt).
+
+The following building options available:
+
+* `-DFL_USE_FLOAT=ON` builds the binaries utilizing the `fl::scalar` data type as a `float` represented in 4 bytes. By default, the binaries are built utilizing `-DFL_USE_FLOAT=OFF` to utilize `fl::scalar` as a `double` represented in 8 bytes and hence providing better accuracy. If `fuzzylite` is built with `-DFL_USE_FLOAT=ON`, then the applications linking to `fuzzylite` also need to specify this compilation flag.
+
+
+* `-DFL_CPP98=ON` builds binaries utilizing `C++98` features. By default, `fuzzylite` is built with `-DFL_CPP98=OFF` to utilize `C++11` features. If compiling for `C++98`, be aware that you will not be able to benchmark the performance of your engine using the `Benchmark` class.
-`-DFL_USE_FLOAT=ON` builds the binaries using `typedef float fl::scalar` instead of `typedef double fl::scalar` (default is OFF, i.e., double is used)
-`-DFL_BACKTRACE=OFF` disables the backtrace information in case of errors (default in Unix platforms is ON, and in Windows platforms is OFF). In Windows, the backtrace information requires the library `dbghelp`, which should be available in your system.
+* `-DFL_BACKTRACE=OFF` disables the backtrace information in case of errors (default is ON). In Windows, the backtrace information requires the external library `dbghelp`, which is generally available in your system.
+
+* `-DCMAKE_BUILD_TYPE=[Debug|Release]` sets the mode of your build. You can only build one mode at a time with a single CMake script.
+
+
+#### Documentation
+The source code of `fuzzylite` is very well documented using [`doxygen`](www.doxygen.org/) formatting, and the documentation is available at [fuzzylite.com/documentation](http://fuzzylite.com/documentation). If you want to generate the documentation locally, you can produce the `html` documentation from the file [Doxyfile](/Doxyfile) using the command line: `doxygen Doxyfile`. The documentation will be created in the [`documentation`](/documentation) folder.
-`-DFL_CPP11=ON` builds `fuzzylite` utilizing `C++11` features (default is OFF, i.e., `C++98`)
-`-DCMAKE_BUILD_TYPE=[Debug|Release]` sets the mode of your build. You can only build one mode at a time with a single CMake script.
***
### <a name="binaries">Binaries</a>
-After building from source, the following are the relevant binaries that will be created in `release` mode. In `debug` mode, binaries will append a `d` at the end of the name (e.g., `fuzzylited.dll`).
+After building from source, the following are the relevant binaries that will be created in `Release` mode. In `Debug` mode, the file names end with `-debug` (e.g., `fuzzylite-debug.exe`).
#### Windows
@@ -200,256 +360,98 @@ After building from source, the following are the relevant binaries that will be
- console application: `fuzzylite`
- shared library: `libfuzzylite.so`
-- static library: `libfuzzylite.a`
+- static library: `libfuzzylite-static.a`
#### Mac
- console application: `fuzzylite`
- shared library: `libfuzzylite.dylib`
-- static library: `libfuzzylite.a`
+- static library: `libfuzzylite-static.a`
+
+#### Console
+The console application of `fuzzylite` allows you to import and export your engines. Its usage can be obtained executing the console binary. In addition, the console can be set in interactive mode. The `FuzzyLite Interactive Console` allows you to evaluate a given controller by manually providing the input values. The interactive console is triggered by specifying an input file and an output format. For example, to interact with the `ObstacleAvoidance` controller, the interactive console is launched as follows:
+
+```bash
+fuzzylite -i ObstacleAvoidance.fll -of fld
+```
-The console application of `fuzzylite` allows you to import and export your controllers. Its usage can be obtained executing the console binary. In addition, the FuzzyLite Interactive Console is activated when exporting to `fld` without providing an output file. The interactive console allows you to evaluate any controller by manually providing the input the values.
***
### <a name="whatsnew">What's New?</a>
-The entire `fuzzylite` library has been thoroughly revised, refactored, validated, and significantly improved. The following sections detail the changes and enhancements of version 5.0. Users of previous versions are **strongly** encouraged to carefully read the list before migrating to version 5.0. Important changes and enhancements are marked as **(important)**, **(VERY important)** and **(EXTREMELY important)**.
-
-#### <a name="new-general">General</a>
-+ **(important)** `fuzzylite v5.0` is dual-licensed under the [GNU LGPL v3.0](https://www.gnu.org/licenses/lgpl.html) and a paid commercial license.
-+ Support for both `C++98` and `C++11` using the latest features.
-+ Support for multiple compilers `g++`, `Clang`, `MSVC`.
-+ Refactoring of many classes to improve design and performance.
-+ **(important)** Performance improvements of Takagi-Sugeno controllers by over 55% with respect to v4.0 (estimate based on the average performance on the examples included).
-+ Smart pointers in many classes take care of automatically deleting objects when setting new pointers (`Accumulated`, `FactoryManager`, `Function`, `OutputVariable`, `Rule`, and `RuleBlock`).
-* **(important)** Exceptions are thrown when any of the following `RuleBlock::[conjunction|disjunction|activation]`, `Accumulated::accumulation`, and `OutputVariable::defuzzifier` are required but set to `fl::null`, thereby replacing the operations that would lead to `[signal 11] Segmentation fault` to operations that throw a `fl::Exception` instead.
-+ Automatic build script to build `fuzzylite` in `debug` and `release` mode.
-+ Binaries of debug libraries are renamed to append the letter `d` (e.g.,`fuzzylited.dll`, `libfuzzylited.so`).
-+ **(important)** New file [`fuzzylite/src/m/compare.m`](/fuzzylite/src/m/compare.m) <!---check link--> to compare the output values of your `fuzzylite` engines with the evaluation of the same engine in Octave/Matlab.
-+ **(important)** There is practically no difference between the output values obtained with `fuzzylite` and those obtained with Octave/Matlab. Based on the examples, the average mean square error (MSE) between the output values is less than `7.3e-12` (or `0.0000000000073`) due to negligible differences in floating-point arithmetic. The results and comparison can be found in [`examples/examples.mat`](/examples/examples.mat) <!---check link-->.
-+ **(important)** Source code of applications based on version 4.0 will most likely not compile with version 5.0.
-+ Minor bugs and memory leaks fixed.
-
-####<a name="new-macros">Macros</a>
-* **(important)** Added support for `C++11` with smart pointers, method identifiers, move constructors and move operators as follows. For precise information, refer to file [`fuzzylite/fl/fuzzylite.h`](/fuzzylite/fl/fuzzylite.h). <!---check link-->
-* **(important)** Macros for identifiers are defined as `FL_IOVERRIDE override`, `FL_IFINAL final`, `FL_IDEFAULT = default`, `FL_IDELETE = delete`, `FL_INOEXCEPT noexcept`, `FL_DEFAULT_COPY(Class)`, `FL_DEFAULT_MOVE(Class)`, and `FL_DEFAULT_COPY_AND_MOVE(Class)`.
-* **(important)** Added macro `FL_unique_ptr` to refer to `std::auto_ptr` (`C++98`) or `std::unique_ptr` (`C++11`), and its respective `FL_move_ptr(x)` to move a smart pointer, albeit `FL_move_ptr(x)` is not used within the library as it is not needed.
-* **(important)** Added global variables `const long fl::null = 0L` to refer to the null pointer in `C++98` and `const std::nullptr_t null = nullptr` to refer to the null pointer in `C++11`.
-* **(important)** Renamed macro `FL_DEBUG` to `FL_DBG`.
-* **(important)** Renamed macros `FL_BEGIN_DEBUG_BLOCK` and `FL_END_DEBUG_BLOCK` to `FL_DEBUG_BEGIN` and `FL_DEBUG_END`, respectively.
-* **(important)** Renamed macro `FL_EXPORT` to `FL_API`
-* **(EXTREMELY important)** Added macro definitions `FL_EXPORT_LIBRARY` and `FL_IMPORT_LIBRARY`. If you are building `fuzzylite` as a **shared library**, you need to define `FL_EXPORT_LIBRARY`. If you are building `fuzzylite` **executable** *and* it utilizes the `fuzzylite` **shared library**, you need to define `FL_IMPORT_LIBRARY`. If you are building `fuzzylite` as a **static library** and/or building `fuzzylite` **executable** using the `fuzzylite` **static library**, then you do not need to define either `FL_[IMPORT|EXPORT]_LIBRARY`. Note that the same conditions apply for your application. This is particularly important in Windows platforms, as `FL_IMPORT_LIBRARY` and `FL_EXPORT_LIBRARY` define `FL_API` to `__declspec(dllimport)` and `__declspec(dllexport)`, respectively. If in doubt, please check [`fuzzylite/CMakeLists.txt`](/fuzzylite/CMakeLists.txt)<!---check link-->
-
-#### <a name="new-operation">Operation</a>
-* **(important)** Added method `Operation::toScalar(std::string x, scalar alternative) FL_INOEXCEPT` which returns `alternative` if `x` is not a valid `scalar`, and never throws an exception.
-* **(important)** Added method `Operation::toScalar(std::string x)` that returns the scalar value of `x` or throws a `fl::Exception` if `x` is not a valid `scalar`.
-* **(VERY important)** Marked method (from v4.0) `Operation::toScalar(std::string, bool, scalar) FL_IDELETE;` and removed its implementation such that its usage is prevented at compile time in `C++11` and at linker time in `C++98`. Please, use the appropriate `Op::toScalar` methods mentioned above.
-+ Renamed method `Op::isNan` to `Op::isNaN`.
-* Added method `fl::Op::isFinite(x)` which returns `not (isNaN(x) or isInf(x))`.
-* Changed `fl::Op::isEq(a,b)` to return `true` if `a == b == NaN`.
-* Changed `fl::Op::isEq(a,b)` to return `true` if `a == b == Inf`.
-* Changes to `fl::Op::isEq` affect other comparison methods `fl::Op::is[Lt|LEq|GEq|Gt]`.
-* Added shortcuts of comparisons `fl::Op::[gt,lt,ge,le,eq,neq](scalar a, scalar b)`, mostly to provide binary versions (without `macheps`) for term `Function`.
-* Deleted method `Op::repeat`.
-* Removed method `fuzzylite::configuration()`.
-* Changed default `fuzzylite::_macheps = 1e-6;`.
-* Renamed method `Op::makeValidId` to `Op::validName`, which now returns `"unnamed"` for empty strings.
-
-
-
-####<a name="new-engine">Engine</a>
-* **(VERY important)** Moved `Engine::hedges` (and relevant methods) to `Rule::hedges`.
-* Added enumeration for the type of engine: `enum Engine::Type{Mamdani, Larsen, TakagiSugeno, Tsukamoto, InverseTsukamoto, Hybrid, Unknown}`.
-* Added method `Type Engine::type(std::string* name, std::string* reason)` to infer the type of the engine based on its configuration, additionally provides the name of the type and the inference reasons for its type.
-* **(important)** Changed method `Engine::isReady(std::string)` to satisfy the default operation of controllers. The method `Engine::isReady(std::string)` was initially conceived to provide information before a potential `[signal 11] Segmentation fault` happened due to improper configuration. However, given the improved handling of signals and exceptions mentioned in Section [General](#new-general), using method `Engine::isReady(std::string)` is not necessary except for providing suggestions of what could potentially cause an error.
-* Added methods `Engine::set[Input|Output]Variables(std::vector)` and `Engine::setRuleBlocks(std::vector)`.
-* Added methods `Engine::[input|output]Variables()` and `Engine::ruleBlocks()` to return mutable references.
-* Added method `Engine::variables()` to retrieve a vector (copy) containing the `InputVariables` followed by the `OutputVariables`.
-* Added method `Engine::updateReferences()` to update the references to the engine in all the necessary linguistic terms (i.e., `Linear` and `Function`).
-* Added method `Engine::clone()`.
-* Added copy constructors, assignment operators, and default move constructor to `Engine`.
-
-
-
-####<a name="new-inoutvars">Input Variables and Output Variables</a>
-* **(important)** Added methods `OutputVariable::[get|set]OutputValue()` to [retrieve|store] value from defuzzification
-* **(important)** Changed return type of `scalar OutputVariable::defuzzify()` to `void OutputVariable::defuzzify()` because now it automatically stores the defuzzified output value, and also stores the previous *valid* output value regardless of locks. Like in version 4.0, if `OutputVariable::lockPreviousOutputValue=true`, and the defuzzified output value is not valid (i.e., `[NaN|Inf]`) or no rules were activated, then the defuzzified output value is replaced for the previous valid output value.
-* Removed method `OutputVariable::defuzzifyNoLocks()`.
-* Renamed variable `OutputVariable::lastValidOutputValue` to `OutputVariable::previousOutputValue`.
-* **(important)** Renamed method `OutputVariable::[get|set]LastValidOutput()` to `OutputVariable::[get|set]PreviousOutputValue()`.
-* Renamed variable `OutputVariable::lockValidOutput` to `OutputVariable::lockPreviousOutputValue`.
-* **(important)** Renamed method `OutputVariable::setLockValidOutput()` to `OutputVariable::setLockPreviousOutputValue()`.
-* **(important)** Renamed method `OutputVariable::isLockingValidOutput()` to `OutputVariable::isLockedPreviousOutputValue()`.
-* Renamed variable `OutputVariable::lockOutputRange` to `OutputVariable::lockOutputValueInRange`.
-* **(important)** Renamed method `OutputVariable::setLockOutputRange()` to `OutputVariable::setLockOutputValueInRange()`.
-* **(important)** Renamed method `OutputVariable::isLockingOutputRange()` to `OutputVariable::isLockedOutputValueInRange()`.
-* Added methods `std::string InputVariable::fuzzyInputValue()` and `std::string OutputVariable::fuzzyOutputValue()`.
-* Added method `OutputVariable::clear()` to clear the fuzzy output, and set `OutputVariable::previousOutputValue = fl::nan` and set `OutputVariable::outputValue = fl::nan`.
-* Added copy constructors, assignment operators, move constructors and move operators to [Input|Output]Variable.
-* Added method `Variable::terms()` to return mutable reference.
-* **(important)** Changed `OutputVariable::[defuzzifier|fuzzyOutput]` to smart pointers (`FL_unique_ptr`).
-
-
-#### <a name="new-terms">Linguistic Terms</a>
-* **(VERY important)** Added Term::[get|set]Height to define the height of *integral* terms, and multiply their respective membership functions accordingly.
-* Added copy constructors, assignment operators, move constructors and move operators to every `Term`.
-* **(VERY important)** Parameters of all terms are set by default to `fl::nan`.
-* **(important)** Renamed method `Term::copy()` to `Term::clone()` in every `Term`.
-* Added method `Term::updateReference(Term*, Engine*)` to ensure `Linear` and `Function` terms have updated pointers to the `Engine` (useful when cloning and copy-constructing).
-+ **(important)** Added linguistic terms `Concave`, `Cosine` and `Spike`.
-* **(important)** Changed `Accumulated` to take `Activated*` terms instead of `const Terms*`.
-* Removed `const` from return type of method `SNorm* Accumulated::[get|set]Accumulation()`.
-* Changed `Accumulated::accumulation` to a smart pointer (`FL_unique_ptr`).
-* Added method `Accumulated::terms()` to return mutable reference.
-* **(important)** Renamed methods `Triangle::[set|get][A|B|C]` to `::[set|get]Vertex[A|B|C]`.
-* **(important)** Renamed methods `Trapezoid::[set|get][A|B|C|D]` to `::[set|get]Vertex[A|B|C|D]`.
-* **(important)** Renamed term `Thresholded` to `Activated`.
-* **(important)** Renamed methods `Thresholded::[set|get]Threshold()` to `Activated::[set|get]Degree()`.
-* Added enumeration `[Ramp|Sigmoid]::Direction{ NEGATIVE, ZERO, POSITIVE }` to refer to the slope.
-* Added methods `Ramp::direction()` and `Sigmoid::direction()` to retrieve direction of slope.
-* Removed Exception Specification from methods in `Discrete`, `Linear` and `Function` terms.
-
-#### <a name="new-linear-discrete">Linear and Discrete Terms</a>
-* **(important)** Changed `Linear` from having pointers to the input variables to having a pointer to the `Engine`.
-* Changed visibility of `Linear::coefficients` to `protected`.
-* **(important)** Added methods `Linear::coefficients()`, `Linear::setCoefficients()`.
-* `Linear` term no longer throws exception when `inputVariables != |coefficients|`.
-* **(important)** Removed public vector of variables `Discrete::[x|y]`.
-* **(important)** Added a `typedef std::pair<scalar, scalar> Discrete::Pair`.
-* **(important)** Changed representation of `Discrete::[x|y]` from `std::vector<scalar>` to `std::vector<Discrete::Pair>`.
-* Added methods `Discrete::setXY()` and `Discrete::xy()` to set and get the new representation of pairs.
-* Added methods `Discrete::xy(int index)` to retrieve `Discrete::Pair` at `index`.
-* **(important)** Added methods `Discrete::toPairs(std::vector<scalar>)` which throws an exception if the vector is missing a value (i.e., `std::vector<scalar>.size() % 2 != 0`), and `Discrete::toPairs(std::vector<scalar>, scalar missingValue)` which adds `missingValue` in case `std::vector<scalar>.size() %2 == 1`, hence never throwing an exception.
-* Added method `Discrete::toVector(std::vector<Discrete::Pair>)` to convert `std::vector<Discrete::Pair>` to a `std::vector<scalar>`.
-* Added method `Discrete::formatXY()` to get pairs `(x,y)` nicely formatted.
-
-####<a name="new-function">Function Term</a>
-* **(important)** Merged structs `Function::Operator` and `Function::BuiltInFunction` into a single `struct Function::Element`.
-* **(EXTREMELY important)** Changed the precedence of all built-in instances of `Function::Element` of type `Operator` starting from `100` and decreasing by `10`. The precedence of built-in operators is the following: `(100)` Logical not `[!]` and Negation `[~]`; `(90)` Power `[^]`; `(80)` Multiplication `[*]`, Division `[/]` and Modulo `[%]`; `(70)` Addition `[+]` and Subtraction `[-]`; `(60)` Logical AND `[and]` and Logical OR `[or]`. If you have registered your own operators, please adjust their precedence as required.
-* Added to `Function` built-in comparison functions `gt,lt,ge,le,eq` and operator logical not `!`.
-* Modified typedefs `Function::Unary` and `Function::Binary` to take `scalar` instead of `double`.
-* Changed `public Function::root` to `protected Function::_root` and it is now a smart pointer (`FL_unique_ptr`).
-* Added method `Function::root()` to return pointer to `Function::root`.
-* **(EXTREMELY important)** Moved built-in functions and operators from `Function` to a `FunctionFactory`.
-
-
-#### <a name="new-norms-hedges">[T|S]Norms and Hedges</a>
-+ **(important)** Fixed operation when using multiple hedges to operate from right-most to left-most, e.g. `if Ambient is not very extremely bright`, now evaluates as follows `not(very(extremely(bright)))`.
-+ Added `TNorm` nilpotent minimum and `SNorm` nilpotent maximum.
-* Added clone methods to every `Norm`.
-* Added clone methods to every `Hedge`.
-* **(VERY important)** Moved `Engine::hedges` to `Rule::hedges`.
-
-
-#### <a name="new-rules">Rules</a>
-* **(VERY important)** Moved `Engine::hedges` (and methods) to `Rule::hedges`.
-* Added method `Rule::isLoaded()` to determine whether a rule was properly parsed and thus can be activated.
-* Added method `Rule::unload()` to allow the existence of a rule in an inactive state (useful for invalid rules).
-* **(important)** Removed variable `Rule::FL_ASSIGNS` and method `Rule::assignsKeyword()`, for which the symbol `=` in rules is no longer valid.
-* Changed visibility of method `Rule::setText()` to `public`.
-* Added method `Rule::load(const Engine*)`.
-* Changed `Rule::[antecedent|consequent]` to smart pointers (`FL_unique_ptr`).
-* **(important)** Renamed method `Antecedent::[get|set]Root()` to `Antecedent::[get|set]Expression()`.
-* Added methods `[Antecedent|Consequent]::[get|set]Text()`.
-* **(important)** Added methods `[Antecedent|Consequent]::[load|unload]()`, with the same objective as `Rule::[load|unload]()`.
-
-#### <a name="new-ruleblocks">Rule Blocks</a>
-* Added method `RuleBlock::reloadRules()`.
-* Added method `RuleBlock::setRules(std::vector)`.
-* Added method `RuleBlock::rules()` to return mutable reference.
-* Removed `const` from `TNorm` and `SNorm` in `RuleBlock::[get|set][Conjunction|Disjunction|Activation]()`, respectively.
-* Changed `RuleBlock::[conjunction|disjunction|activation]` to smart pointers (`FL_unique_ptr`).
-* **(VERY important)** Added basic rule chaining such that an `OutputVariable` can be utilized in the `Antecedent` of a `Rule`. For example, considering the rule `if Power is high then InversePower is low`, where `Power` and `InversePower` are both output variables, the activation degree of the `Antecedent` will correspond to the accumulated activation degree of the term `high` in the fuzzy output of `Power`. If `Power::accumulation = none`, the accumulated activation degree of the term `high` will be computed as the regular sum of the activation degrees of term `high` in the fuzzy output of `Power`. Otherwise, the accumulated activation degree is computed utilizing the `Power::accumulation` operator.
-
-
-#### <a name="new-weighted">Weighted Defuzzifiers</a>
-+ **(VERY important)** Performance improvements of Takagi-Sugeno controllers by over 55% (with respect to v4.0) based on the average performance on the examples included.
-* **(important)** Created class `WeightedDefuzzifier` from which classes `Weighted[Average|Sum]` are derived.
-* **(important)** Added enumeration `WeightedDefuzzifier::Type{Automatic, TakagiSugeno, Tsukamoto}` and respective methods `WeightedDefuzzifier::[get|set]Type()` and `WeightedDefuzzifer::getTypeName()`.
-* Added method `WeightedDefuzzifier::inferType(Term*)` to automatically determine the `WeightedDefuzzifier::Type` based on the class of `Term`.
-* **(important)** By default, `WeightedDefuzzifier::type = Automatic`, which automatically infers the type based on the `WeightedDefuzzifier::inferType()`.
-* **(important)** There is a small performance penalty when using `WeightedDefuzzifier::type = Automatic` because `WeightedDefuzzifier::inferType()` performs three `dynamic_cast<>`.
-* **(important)** Deleted class `Tsukamoto`. Its method `static tsukamoto()` was moved to `virtual WeightedDefuzzifier::tsukamoto()`, which allows overriding it
-* Added support for `Tsukamoto` with `Concave` terms.
-+ **(EXTREMELY important)** In version 5.0, the traditional operation of Takagi-Sugeno and Tsukamoto controllers is achieved by setting `OutputVariable::accumulation = none`. Unlike version 4.0, the `RuleBlock::activation` will not have any effect on Takagi-Sugeno nor Tsukamoto controllers, for which `RuleBlock::activation` should also be set to `none`. More information about the roles of the `OutputVariable::accumulation` and `RuleBlock::activation` operators are detailed as follows. Refer to [sciweavers](http://www.sciweavers.org/free-online-latex-equation-editor) to convert LaTeX equations.
-+ **(VERY important)** In version 5.0, the role of the `RuleBlock::activation` `TNorm` on the `Weighted[Average|Sum]` always performs a regular multiplication of the weights and the values (i.e., $w_i \times z_j$) regardless of the `TNorm` chosen. In other words, selecting any `RuleBlock::activation` for `Weighted[Average|Sum]` is irrelevant, and should be set to `none` as every `TNorm` will have the same multiplication effect. This operation is different from `fuzzylite` version 4.0, where the `RuleBlock::activation` operator was utilized to multiply the weights and values (i.e. $w_i \otimes z_j$), and therefore the traditional operation of the `Weighted[Average|Sum]` was achieved when `RuleBlock::activation = AlgebraicProduct;`.
-+ **(VERY important)** In version 5.0, the role of the `OutputVariable::accumulation = none` on the `Weighted[Average|Sum]` results in a regular sum of the multiplied weights and values, i.e., $\dfrac{\sum_i^n w_i \times z_j}{\sum_i^n w_i}$. However, if the `OutputVariable::accumulation != none`, the role of the `SNorm` will be to accumulate the activation degrees of the *repeated* terms in the fuzzy output of the variable. For example, considering the rules `if Ambient is dark then Power is high` and `if Ambient is medium then Power is high`, for any input value of `Ambient` that activates both rules, the fuzzy output of `Power` will have the term `high` activated with the degree from `Rule 1`, and the term `high` activated with the degree from `Rule 2`. Since the term `high` appears twice in the fuzzy output, the role of the accumulation operator will be to accumulate the activation degree of `high` resulting in $\dfrac{(w_1 \oplus w_2) \times z_{high}}{(w_1 \oplus w_2)}$. If another term were activated, the result would be $\dfrac{(w_1 \oplus w_2) \times z_{high} + w_i \times z_j}{(w_1 \oplus w_2) + w_i}$. In version 4.0, the accumulation operator had no effect on the `Weighted[Average|Sum]`.
-
-
-
-#### <a name="new-integral">Integral Defuzzifiers</a>
-* **(important)** Proper handling of indefinite integral defuzzification, that is, returning `fl::nan` when `[minimum|maximum]=[NaN|Inf]`.
-* Default resolution of integration is defined as `static int IntegralDefuzzifier::defaultResolution=200`, and can be changed via `static IntegralDefuzzifier::setDefaultResolution()`.
-+ **(important)** In `fuzzylite`, the accumulation operator has been for several versions associated with the output variables and **not** with the rule blocks, despite that the FCL format and other fuzzy logic control libraries associate the accumulation operator with the rule blocks. The argument for such a decision is that `fuzzylite` provides **coherent** support for multiple rule blocks operating on the same engine and on the same output variables. For example, if multiple rule blocks operate on the same output variables, it only makes sense to have a single accumulation operator associated with each output variable such that the defuzzifier can naturally operate over the accumulated fuzzy output. Differently, if the accumulation operator were associated with the rule block, the possibility of having different accumulation operators in different rule blocks questions (1) **the possibility of having multiple rule blocks operating over the same output variables**; and (2) **the usage of different accumulation operators over the accumulation and defuzzification processes**. Certainly, if (1) is not possible, i.e, different rule blocks only operate on different output variables, then (2) is not a problem because the accumulation process and defuzzification of each variable will only have a single accumulation operator. It is therefore that the association of the accumulation operator with the output variable in `fuzzylite` provides a **better design** and an additional feature that allows having multiple rule blocks operating over the same output variables.
-* Added copy constructors, assignment operators, move constructors and move operators.
-* Added method `Defuzzifier::clone()`.
-
-####<a name="new-imex">Importers and Exporters</a>
-* **(EXTREMELY important)** Since terms have a new `height` property, `[Fll|Fis|Fcl]Exporter` exports terms with an additional `scalar` at the end, which indicates the `height` of the term. However, if `height=1.0`, the additional scalar is not exported.
-* **(EXTREMELY important)** In `[Fll|Fis|Fcl]Importer`, when importing terms, if there is an additional `scalar` it will be assumed as the `height` of the term. For example, `term: high Gaussian 1.0 0.5 0.75` will create a `Gaussian` term with mean `1.0`, standard deviation `0.5` and height `0.75`. This is **extremely important** because there are some examples from Matlab in `fis` format that append a useless `0.0` to some terms.
-* **(EXTREMELY important)** In `FisExporter`, if the Takagi-Sugeno controller has no `activation` or `accumulation` operators (as it should generally be the case), Octave and Matlab will not be able to import the `fis` file. To overcome this issue, you will have to set `ImpMethod="min"` and `AggMethod="max"`, where `ImpMethod` and `AggMethod` are just dummy operators that can be set to any `TNorm` and `SNorm`, respectively.
-+ **(important)** Improved compatibility of the exported code obtained with `[Fis|Fcl]Exporter` by exporting the additional features of `fuzzylite` only when these are different from the default operation. For example, the following features will not be exported given their values: `[Input|Output]Variable::enabled = true;`, `OutputVariable::lock-previous = false;`, `OutputVariable::lock-range = false;`, amongst others.
-* **(important)** Renamed FLL property `'lock-valid'` to `'lock-previous'`.
-* **(important)** Renamed FIS property `'LockValid'` to `'LockPrevious'`.
-* **(important)** Renamed FCL property `'LOCK: VALID'` to `'LOCK: PREVIOUS'`.
-+ **(important)** Export your controllers to files using `[Fll|Fld|Fis|Fcl]Exporter::toFile()`.
-+ **(important)** Import your controllers from files using `[Fll|Fis|Fcl]Importer::fromFile()`.
-+ **(important)** `FldExporter` exports the FuzzyLite Dataset of an engine utilizing the input values of another FuzzyLite Dataset.
-* `FldExporter` no longer restarts the engine when exporting.
-* **(important)** Renamed method `FldExporter::toWriter()` to `FldExporter::write()`.
-* Removed variable and methods for property `int FldExporter::_maximum`.
-* Added option in `CppExporter` to prepend the namespace prefix `fl::` to the classes, and by default it does not prepend prefix.
-* Improvement accuracy of `FisImporter` when importing `fis` files whose scalar values have more than three decimal numbers.
-* Renamed methods in `[Fis|Fcl]Importer::extract*` to `[Fis|Fcl]Importer::parse*`.
-
-
-
-#### <a name="new-factories">Factories</a>
-* Created a generic `CloningFactory<T>` to create clones of objects.
-* **(important)** Created `FunctionFactory` based on `CloningFactory<Function::Element>` where function operators and methods are stored to be cloned as necessary by `Function`. Additional functions and operators can be easily registered.
-* **(VERY important)** Moved built-in functions and operators from `Function` to `FunctionFactory`.
-* Renamed methods `Factory<T>::[register|deregister]Class()` to `Factory<T>::[register|deregister]Constructor()`.
-* **(important)** Renamed `Factory<T>` to `ConstructionFactory<T>`.
-* Renamed `typedef Factory::Creator` to `typedef Factory::Constructor`.
-* Changed pointers of `FactoryManager` to smart pointers (`FL_unique_ptr`).
-
-
-
-#### <a name="new-examples">Examples</a>
-* **(important)** Added two examples for basic rule chaining: `mamdani/SimpleDimmerInverse.fll` and `mamdani/Laundry.fll`.
-* Included the `original` example files in `fis` format.
-* Added conversion of `examples/original/*.fis` to `examples/original/*.fll`.
-* Modified `original/takagi-sugeno` examples to reflect `activation: none; accumulation: none;`.
-* Updated FLD examples produced from the `original` examples.
-+ **(important)** Added file [`fuzzylite/src/m/compare.m`](/fuzzylite/src/m/compare.m) <!---check link--> to compare the output values of your `fuzzylite` engines with the evaluation of the same engine in Octave/Matlab.
-+ **(important)** Added file [`examples/examples.mat`](/examples/examples.mat) <!---check link--> containing the comparison of the output values between `fuzzylite` and Matlab's Fuzzy Logic Toolbox.
-* Added code to perform benchmarks in Linux.
-
-
-#### <a name="new-console">Console</a>
-* **(important)** Console includes option to import custom input dataset from file an export its respective output values.
-* **(important)** Created the FuzzyLite Interactive Console, which can be started by specifying an input file and the output format, e.g., `fuzzylite -i SimpleDimmer.fll -of fld`.
-* Console provides more information about its usage.
-
-
-
-####<a name="new-fixes"> Fixes Bugs and Leaks</a>
-+ **(important)** Fixed operation when using multiple hedges to operate from right-most to left-most, e.g. `if Ambient is not very extremely bright` evaluates as follows `not(very(extremely(bright)))`.
-* **(important)** Fixed membership functions of specific cases of `Triangle` when `a=b` or `b=c`, and `Trapezoid` when `a=b` or `c=d`.
-* Fixed minor memory leak at `~RuleBlock::[conjunction|disjunction|activation]`.
-* Fixed minor memory leak at `~Accumulated::accumulation`.
-* Fixed minor memory leak at `~OutputVariable::defuzzifier`.
-* Fixed minor memory leak at `~Function::Node`.
-* Fixed minor memory leak at `~FactoryManager::[factories]`.
-* Fixed some rethrowing of exceptions to provide proper information about errors. Specifically, changed some rethrown exceptions from `throw ex;` to just `throw;`
-* Fixed building using `-DFL_USE_FLOAT=ON`
+* The FuzzyLite Libraries, namely fuzzylite and jfuzzylite, both in version 6.0, are dual licensed under the GNU General Public License version 3 and the Apache License version 2.
+
+* By default, fuzzylite builds using C++11 instead of C++98.
+
+* Important performance improvements.
+
+* Refactored the following names for the operation of engines: from activation operator to implication operator, from accumulation operator to aggregation operator.
+
+* Renamed the term `Accumulated` to `Aggregated`.
+
+* New activation methods decouple the activation of rules from the rule block and provide different methods for activating rules (see Activation Methods).
+
+* New class `ActivationFactory` provides a factory of activation methods.
+
+* New class `Benchmark` to evaluate the performance and accuracy of engines.
+
+* New class `Complexity` to estimate the computational complexity of an engine.
+
+* New class `RScriptExporter` to export the surfaces of an engine using the `ggplot2` library.
+
+* New class `Binary` term for binary edges.
+
+* New `UnboundedSum` S-Norm in `SNormFactory`.
+
+* New classes `SNormFunction` and `TNormFunction` to create custom functions on any two values using the `Function` class.
+
+* Added description strings to `Engine`, `Variable` and `RuleBlock`
+
+* Privatized previously protected members of classes and subclasses of `Term`, `Variable`, `Rule`, `Defuzzifier`, `[Cloning|Construction]Factory`, `Importer`, `Exporter`, amongst others.
+
+* Improved portability by replacing `int` for `std::size_t` where necessary, thereby additionally removing warnings in Windows 64bit
+
+* Deleted `Operation.cpp` and inlined its methods into `Operation.h`
+
+* Updated `.travis.yml` to use Docker, and build using g++ (versions 6, 5, 4.9, 4.8, 4.7) and clang (versions 3.8, 3.7, 3.6, and 3.5).
+
+* Added `appveyor.yml` to use continuous integration in Windows under Visual Studio 2013 and 2015.
+
+* Added some unit tests and support for future unit tests.
+
+* Bug fixes.
+
+* New example of hybrid engines.
+
+* New example on obstacle avoidance for Mamdani, Takagi-Sugeno, and Hybrid engines.
+
+* New R scripts for each example and its respective surfaces in `pdf` formats.
+
+#### Bug fixes
+* Fixed bug in `CloningFactory::deregisterObject()`. Bug: Object was deleted before removing it from the map, leaving an invalid object in the map which would cause a segmentation fault. Solution: Remove the object from the map before deleting it.
+* Fixed bug causing segmentation fault when malformed term in FuzzyLite Language
+* Fixed bug computing the `NormalizedSum` S-Norm.
+* Fixed bug in `RuleBlock` to reset and clone the implication operator. Bug: implication operator is not copied and reset. Fix: copy and reset implication operator when cloning the `RuleBlock`.
+* Fixed bug in `Function` term. Bug: given a formula = "tan(y)" and a map["y"] = 1.0, and executing `Function::load(formula)`, then the map of variables is reset because `load()` calls `unload()` first, causing the deregistration of variable `y`. Solution: Removed method `unload()` from `load()`, thereby causing future `load()` not to reset variables.
+* Fixed bug in `Function` when enclosing variable in double parenthesis.
+
+
+***
+
+### <a name="whatsnext">What's Next?</a>
+
++ Optimization of Fuzzy Logic Controllers
++ Type-2 Fuzzy Logic Controllers
++ Adaptive Neuro-Fuzzy Inference System (ANFIS)
++ Fuzzy C-means data clustering
***
-For more information, visit [www.fuzzylite.com](http://www.fuzzylite.com).
+fuzzylite&reg; is a registered trademark of FuzzyLite Limited.<br>
+jfuzzylite&trade; is a trademark of FuzzyLite Limited.<br>
+QtFuzzyLite&trade; is a trademark of FuzzyLite Limited.<br>
-fuzzylite&reg; is a registered trademark of FuzzyLite Limited.
-Copyright &#xa9; 2010-2015 FuzzyLite Limited. All rights reserved.
+Copyright &#xa9; 2010-2017 FuzzyLite Limited. All rights reserved.
diff --git a/THANKS b/THANKS
new file mode 100644
index 0000000..df56bb0
--- /dev/null
+++ b/THANKS
@@ -0,0 +1,22 @@
+Acknowledgements
+================
+
+Thank you to the community around fuzzylite, whose feedback and support has been of great importance towards improving the libraries.
+
+Thank you to all the users who made generous contributions buying licenses of QtFuzzyLite and making donations.
+
+Thank you to the European Centre for Soft Computing, the Foundation for the Advancement of Soft Computing, Sergio Guadarrama and Luis Magdalena for their support creating the first version of fuzzylite.
+
+Thank you to Dean Morrissey for his feedback on testing the operation of fuzzylite and validating its results; Adrien Cabarbaye for his feedback on discrete terms and feature requests on output variables; Massimo Canonico for his feedback on his experience and usage of fuzzylite in its early stages; Eva Millan for her feedback, ideas, and suggestions on rule chaining; Johannes Schauer for his work making fuzzylite directly available from Debian repositories; and Leonela Gazzano for her suggestions on activation methods.
+
+Thank you to Pablo Cingolani (JFuzzyLogic), Linda Markowsky (Octave Fuzzy Logic Toolkit), Roger Jang (Matlab Fuzzy Logic Toolbox), Edward S. Sazonov (FuzzyEngine), and their respective collaborators for open sourcing their great libraries.
+
+Special thanks to Mengjie Zhang and Mark Johnston (Victoria University of Wellington, New Zealand); Oscar Cordón (European Centre for Soft Computing, Spain); Maritza Bracho, Carlos Lameda, Belkys Lameda, and Rubén Parma (Universidad Centroccidental Lisandro Alvarado, Venezuela); and Yelitza Oviedo, Jorge Rodríguez, Edecio Freitez, Luis Alvarado, Jesús Contreras, and Oswaldo Hernández (Universidad Fermín Toro, Venezuela).
+
+Thank you all very much.
+
+Yours,
+
+Juan Rada-Vilela, Ph.D.
+jcrada@fuzzylite.com
+http://www.fuzzylite.com/jcrada \ No newline at end of file
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..b052265
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,40 @@
+version: '{branch}.{build}'
+branches:
+ only:
+ - master
+ - release
+os:
+- Visual Studio 2015
+- Visual Studio 2013
+configuration:
+- Release
+- Debug
+platform:
+- x64
+- x86
+clone_depth: 1
+clone_folder: C:\projects\fuzzylite
+before_build:
+- cmd: >-
+ cd c:\projects\fuzzylite\fuzzylite
+
+ mkdir build
+
+ cd build
+
+ cmake ..
+
+ echo %cd%
+
+ dir
+build:
+ project: c:\projects\fuzzylite\fuzzylite\build\INSTALL.vcxproj
+ parallel: true
+ verbosity: normal
+notifications:
+- provider: Email
+ to:
+ - jcrada@fuzzylite.com
+ on_build_success: true
+ on_build_failure: true
+ on_build_status_changed: true \ No newline at end of file
diff --git a/documentation/ui/figure.R b/documentation/ui/figure.R
new file mode 100644
index 0000000..88cef79
--- /dev/null
+++ b/documentation/ui/figure.R
@@ -0,0 +1,491 @@
+library('cowplot')
+library('ggplot2')
+
+theme_set(theme_gray())
+
+
+isEq = function(a,b,error=1e-5){
+ abs(a - b) <= error
+}
+
+isLt = function(a,b,error=1e-5){
+ !isEq(a,b,error) & a < b
+}
+
+isGt = function(a,b,error=1e-5){
+ !isEq(a,b,error) & a > b
+}
+
+isLE = function(a,b,error=1e-5){
+ isEq(a,b,error) | a < b
+}
+
+isGE = function(a,b,error=1e-5){
+ isEq(a,b,error) | a > b
+}
+
+#Scale: Scales a number to a different scale
+Scale = function(value, toMin, toMax, fromMin=min(value), fromMax=max(value)){
+ (toMax - toMin) / (fromMax - fromMin) * (value - fromMin) + toMin
+}
+
+#Basic
+
+term.triangle = function(x, a, b, c){
+ if (isLt(x,a) | isGt(x,c))
+ 0.0
+ else if (isEq(x,b))
+ 1.0
+ else if (isLt(x,b))
+ (x - a) / (b - a)
+ else
+ result = (c - x) / (c - b)
+}
+
+term.trapezoid = function(x,a,b,c,d){
+ if (isLt(x, a) | isGt(x, d))
+ 0.0
+ else if (isLE(x, b))
+ min(1.0, (x - a) / (b - a))
+ else if (isLE(x, c))
+ 1.0
+ else if (isLE(x, d))
+ (d - x) / (d - c)
+}
+
+term.rectangle = function(x,a,b){
+ if (isLt(x, a) | isGt(x,b))
+ 0.0
+ else 1.0
+}
+
+term.discrete = function(x, a, b){
+ diff = b-a
+ if (isLt(x,a) | isGt(x,b))
+ 0.0
+ else if (isLt(x,.25 * diff))
+ Scale(x, 0, 1, a, a + diff*.25)
+ else if (isLt(x, .5*diff))
+ Scale(x,1,0.5, a + diff*.25, a + diff*.5)
+ else if (isLt(x, .75*diff))
+ Scale(x,0.5,1,a+diff*.5, a+diff*.75)
+ else if (isLt(x, diff))
+ Scale(x, 1, 0, a+diff*.75, a+diff)
+ else {0.0}
+# else if (isLt(x, a*.5)
+}
+
+
+term.bell = function(x, center, width, slope){
+ 1.0 / (1.0 + abs((x - center) / width)**(2 * slope));
+}
+
+#EXTENDED
+
+term.cosine = function(x, center, width){
+ if (isLt(x, center-width/2.0) || isGt(x, center+width/2.0)){
+ 0.0
+ }else{
+ 0.5 * (1.0 + cos(2.0 / width * pi * (x - center)))
+ }
+}
+
+term.gaussian = function(x, mean, sd){
+ exp((-(x - mean) * (x - mean)) / (2 * sd * sd));
+}
+
+term.gaussianProduct = function(x, meanA, sdA, meanB, sdB){
+ xLEa = isLE(x, meanA)
+ a = exp((-(x - meanA) * (x - meanA)) / (2 * sdA * sdA)) * xLEa + (1 - xLEa)
+ xGEb = isGE(x, meanB)
+ b = exp((-(x - meanB) * (x - meanB)) / (2 * sdB * sdB)) * xGEb + (1 - xGEb)
+ a * b
+}
+
+term.bell = function(x, center, width, slope){
+ 1.0 / (1.0 + abs((x - center) / width)** (2 * slope))
+}
+
+term.piShape = function(x, bottomLeft, topLeft, topRight, bottomRight){
+ a_b_ave = (bottomLeft + topLeft) / 2.0
+ b_minus_a = topLeft - bottomLeft
+ c_d_ave = (topRight + bottomRight) / 2.0
+ d_minus_c = bottomRight - topRight
+
+ if (isLE(x, bottomLeft)) 0.0
+
+ else if (isLE(x, a_b_ave))
+ 2.0 * ((x - bottomLeft) / b_minus_a) ** 2
+
+ else if (isLt(x, topLeft))
+ 1.0 - 2.0 * ((x - topLeft) / b_minus_a)** 2
+
+ else if (isLE(x, topRight))
+ 1.0
+
+ else if (isLE(x, c_d_ave))
+ 1 - 2 * ((x - topRight) / d_minus_c)**2
+
+ else if (isLt(x, bottomRight))
+ 2 * ((x - bottomRight) / d_minus_c)** 2
+
+ else 0.0
+}
+
+term.sigmoidDifference = function(x, left, rising, falling, right){
+ a = 1.0 / (1 + exp(-rising * (x - left)))
+ b = 1.0 / (1 + exp(-falling * (x - right)))
+ abs(a - b)
+}
+
+term.sigmoidProduct = function(x, left, rising, falling, right){
+ a = 1.0 / (1 + exp(-rising * (x - left)))
+ b = 1.0 / (1 + exp(-falling * (x - right)))
+ abs(a * b)
+}
+
+term.spike = function(x, center, width){
+ exp(-abs( 10 / width * (x-center)))
+}
+
+#EDGES
+
+term.binary = function(x, threshold, direction){
+ if (isGE(direction,0.0) && isGE(x, threshold)){
+ 1.0
+ }else if (isLt(direction, 0.0) && isLE(x, threshold)){
+ 1.0
+ }else{
+ 0.0
+ }
+}
+
+term.concave = function(x, inflection, end){
+ if (isLE(inflection, end)){ #Concave increasing
+ if (isLt(x, end)){
+ (end - inflection) / (2 * end - inflection - x)
+ }else{ 1.0 }
+ } else{ #Concave decreasing
+ if (isGt(x, end)){
+ (inflection - end) / (inflection -2 * end + x)
+ }else{ 1.0 }
+ }
+}
+
+
+term.ramp = function(x, start, end){
+ if (isEq(start, end)) 0.0
+
+ else if (isLt(start, end)) {
+ if (isLE(x, start)) 0.0
+ else if (isGE(x, end)) 1.0
+ else (x - start) / (end - start)
+ } else {
+ if (isGE(x, start)) 0.0
+ else if (isLE(x, end)) 1.0
+ else (start - x) / ( start - end)
+ }
+}
+
+term.sigmoid = function(x, inflection, slope){
+ 1.0 / (1.0 + exp(-slope * (x - inflection)))
+}
+
+term.sShape = function(x, start, end){
+ average = (start + end) / 2
+ difference = end - start
+
+ if (isLE(x, start)) 0.0
+
+ else if (isLE(x, average))
+ 2 * ((x - start) / difference) ** 2
+
+ else if (isLt(x, end))
+ 1.0 - 2.0 * ((x - end) / difference) ** 2
+ else 1.0
+}
+
+term.zShape = function(x, start, end){
+ average = (start + end) / 2
+ difference = end - start
+
+ if (isLE(x, start)) 1.0
+
+ else if (isLE(x, average))
+ 1.0 - 2.0 * ((x - start) / difference) ** 2
+
+ else if (isLt(x, end))
+ 2.0 * ((x - end) / difference)** 2
+
+ else 0.0
+}
+
+
+
+
+
+
+
+x = seq(0,1,length=500)
+average = (max(x) + min(x))/2
+diff = (max(x) - min(x))
+
+
+
+
+
+dir.create('figure',showWarnings=F)
+
+
+##################BASIC
+
+triangle.df = data.frame(x, y=sapply(x, term.triangle, min(x), average, max(x)))
+triangle.plot = ggplot(triangle.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/triangle.svg', triangle.plot, width=3, height=3)
+
+
+trapezoid.df = data.frame(x, y=sapply(x, term.trapezoid, min(x), min(x) + .25 * diff, min(x) + .75*diff, max(x)))
+trapezoid.plot = ggplot(trapezoid.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/trapezoid.svg', trapezoid.plot, width=3, height=3)
+
+
+rectangle.df = data.frame(x, y=sapply(x, term.rectangle, min(x) + .25*diff, min(x) + .75*diff))
+rectangle.plot = ggplot(rectangle.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/rectangle.svg', rectangle.plot, width=3, height=3)
+
+
+discrete.x = x[c(1, seq(10, 495, 10), 500)]
+discrete.df = data.frame(x=discrete.x, y=sapply(discrete.x, term.discrete, min(x), max(x)))
+discrete.plot = ggplot(discrete.df, aes(x,y, size=2, lineend='round')) + geom_point() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/discrete.svg', discrete.plot, width=3, height=3)
+
+
+
+#################EXTENDED
+
+cosine.df = data.frame(x, y=sapply(x, term.cosine, average, diff))
+cosine.plot = ggplot(cosine.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/cosine.svg', cosine.plot, width=3, height=3)
+
+
+gaussian.df = data.frame(x, y=sapply(x, term.gaussian, average, .2*diff))
+gaussian.plot = ggplot(gaussian.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/gaussian.svg', gaussian.plot, width=3, height=3)
+
+
+gaussianProduct.df = data.frame(x, y=sapply(x, term.gaussianProduct, average+.1, .2*diff, average-.1, .2*diff))
+gaussianProduct.plot = ggplot(gaussianProduct.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/gaussianProduct.svg', gaussianProduct.plot, width=3, height=3)
+
+
+bell.df = data.frame(x, y=sapply(x, term.bell, average, .25*diff, 3.0))
+bell.plot = ggplot(bell.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/bell.svg', bell.plot, width=3, height=3)
+
+
+piShape.df = data.frame(x, y=sapply(x, term.piShape, min(x), average, average, max(x)))
+piShape.plot = ggplot(piShape.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/piShape.svg', piShape.plot, width=3, height=3)
+
+
+sigmoidDifference.df = data.frame(x, y=sapply(x, term.sigmoidDifference, min(x) + .25*diff, 20/diff, 20/diff, min(x)+.75*diff))
+sigmoidDifference.plot = ggplot(sigmoidDifference.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/sigmoidDifference.svg', sigmoidDifference.plot, width=3, height=3)
+
+
+sigmoidProduct.df = data.frame(x, y=sapply(x, term.sigmoidProduct, min(x) + .25*diff, 10/diff, -10/diff, min(x)+.75*diff))
+sigmoidProduct.plot = ggplot(sigmoidProduct.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/sigmoidProduct.svg', sigmoidProduct.plot, width=3, height=3)
+
+
+spike.df = data.frame(x, y=sapply(x, term.spike, average, diff))
+spike.plot = ggplot(spike.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/spike.svg', spike.plot, width=3, height=3)
+
+
+
+###############EDGE
+
+#Binary
+binary.dfa = data.frame(x, y=sapply(x, term.binary, min(x) + .25*diff, -1))
+binary.dfb = data.frame(x, y=sapply(x, term.binary, min(x) + .75*diff, 1))
+binary.plot = ggplot(binary.dfa, aes(x,y, size=2, lineend='round')) +
+ geom_line(data=binary.dfb, aes(x,y, size=2, lineend='round')) +
+ geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/binary.svg', binary.plot, width=3, height=3)
+
+#Concave
+concave.dfa = data.frame(x, y=sapply(x, term.concave, average, max(x)-.2))
+concave.dfb = data.frame(x, y=sapply(x, term.concave, average, 1-(max(x)-.2)))
+concave.plot = ggplot(concave.dfa, aes(x,y, size=2, lineend='round')) +
+ geom_line(data=concave.dfb, aes(x,y, size=2, lineend='round')) +
+ geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/concave.svg', concave.plot, width=3, height=3)
+
+#RAMP
+ramp.dfa = data.frame(x, y=sapply(x, term.ramp, max(x)-.2, min(x)+.2))
+ramp.dfb = data.frame(x, y=sapply(x, term.ramp, min(x)+.2, max(x)-.2))
+ramp.plot = ggplot(ramp.dfa, aes(x,y, size=2, lineend='round')) +
+ geom_line(data=ramp.dfb, aes(x,y, size=2, lineend='round')) +
+ geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/ramp.svg', ramp.plot, width=3, height=3)
+
+
+sigmoid.dfa = data.frame(x, y=sapply(x, term.sigmoid, average, 20/diff))
+sigmoid.dfb = data.frame(x, y=sapply(x, term.sigmoid, average, -20/diff))
+sigmoid.plot = ggplot(sigmoid.dfa, aes(x,y, size=2, lineend='round')) +
+ geom_line(data=sigmoid.dfb, aes(x,y, size=2, lineend='round')) +
+ geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/sigmoid.svg', sigmoid.plot, width=3, height=3)
+
+
+sShape.df = data.frame(x, y=sapply(x, term.sShape, min(x), max(x)))
+sShape.plot = ggplot(sShape.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/sShape.svg', sShape.plot, width=3, height=3)
+
+
+zShape.df = data.frame(x, y=sapply(x, term.zShape, min(x), max(x)))
+zShape.plot = ggplot(zShape.df, aes(x,y, size=2, lineend='round')) + geom_line() + ylab(expression(mu(x))) + theme(legend.position='none')
+ggsave('figure/zShape.svg', zShape.plot, width=3, height=3)
+
+
+##############Terms
+
+ constant.plot =
+ ggplot(data=data.frame(x=0,y=0)) +
+ geom_point(aes(x=0,y=0), size=0) +
+ ylab(expression(f(x))) + xlab('x') +
+ coord_cartesian(ylim = c(-0.05, 1.05), xlim=c(-0.05,1.05)) +
+ annotate('text', x = .5, y = .5, label = "f(x)==k", parse = T,size=10)
+
+ linear.plot =
+ ggplot(data=data.frame(x=0,y=0)) +
+ geom_point(aes(x=0,y=0), size=0) +
+ ylab(expression(f(x))) + xlab('x') +
+ coord_cartesian(ylim = c(-0.05, 1.05), xlim=c(-0.05,1.05)) +
+ annotate('text', x = .5, y = .5, angle=45, label = "f(x)==sum(paste(c[i],v[i]), i)+k", parse = T,size=10)
+
+ function.plot =
+ ggplot(data=data.frame(x=0,y=0)) +
+ geom_point(aes(x=0,y=0), size=0) +
+ ylab(expression(f(x))) + xlab('x') +
+ coord_cartesian(ylim = c(-0.05, 1.05), xlim=c(-0.05,1.05)) +
+ annotate('text', x = .5, y = .5, label = "f:x %->% f(x)", parse = T,size=10)
+
+
+########## Vertical layout
+ terms.grid = plot_grid(
+
+triangle.plot, bell.plot, piShape.plot,
+trapezoid.plot, cosine.plot, sigmoidDifference.plot,
+rectangle.plot, gaussian.plot, sigmoidProduct.plot,
+discrete.plot, gaussianProduct.plot, spike.plot,
+binary.plot, ramp.plot, sShape.plot,
+concave.plot, sigmoid.plot, zShape.plot,
+function.plot, linear.plot, constant.plot,
+
+ ncol=3, nrow=7, scale=1, label_size=12, vjust=1.25, align='v',
+ #hjust=.5, # align='hv',
+
+ labels=c(
+'Triangle', 'Bell', 'PiShape',
+'Trapezoid', 'Cosine', 'SigmoidDifference',
+'Rectangle', 'Gaussian', 'SigmoidProduct',
+'Discrete', 'GaussianProduct', 'Spike',
+'Binary', 'Ramp', 'SShape',
+'Concave', 'Sigmoid', 'ZShape',
+'Function', 'Linear', 'Constant'
+ )
+ )
+
+ save_plot('figure/terms.svg', terms.grid, ncol=3, nrow=7, scale=.75)
+
+ stop('Script successfully executed')
+
+
+##########Horizontal layout
+ terms.grid = plot_grid(
+
+ triangle.plot, trapezoid.plot, rectangle.plot, discrete.plot, function.plot, binary.plot , concave.plot,
+
+ bell.plot, cosine.plot, gaussian.plot, gaussianProduct.plot, linear.plot, ramp.plot, sigmoid.plot,
+
+ piShape.plot, sigmoidDifference.plot, sigmoidProduct.plot, spike.plot, constant.plot, sShape.plot, zShape.plot,
+
+ ncol=7, nrow=3, scale=1, label_size=12, vjust=1.25, align='v',
+ #hjust=.5, # align='hv',
+
+labels=c(
+'Triangle', 'Trapezoid', 'Rectangle', 'Discrete', 'Function', 'Binary', 'Concave',
+'Bell', 'Cosine', 'Gaussian', 'GaussianProduct', 'Linear', 'Ramp', 'Sigmoid',
+'PiShape', 'SigmoidDifference', 'SigmoidProduct','Spike', 'Constant', 'SShape', 'ZShape')
+)
+
+save_plot('figure/terms.svg', terms.grid, ncol=7, nrow=3, scale=.75)
+
+stop('Script successfully executed')
+
+
+
+
+
+
+
+
+
+
+
+
+# X1234X
+# 123456
+# 7 8
+# 123456
+
+constant.plot =
+ ggplot(data=data.frame(x=0,y=0)) +
+ geom_point(aes(x=0,y=0), size=0) +
+ ylab(expression(mu(x))) + xlab('x') +
+ coord_cartesian(ylim = c(-0.05, 1.05), xlim=c(-0.05,1.05)) +
+ annotate('text', x = .5, y = .5, label = "mu(x)==k", parse = T,size=10)
+
+linear.plot =
+ ggplot(data=data.frame(x=0,y=0)) +
+ geom_point(aes(x=0,y=0), size=0) +
+ ylab(expression(mu(x))) + xlab('x') +
+ coord_cartesian(ylim = c(-0.05, 1.05), xlim=c(-0.05,1.05)) +
+ annotate('text', x = .5, y = .5, angle=45, label = "mu(x)==sum(c[i] %.% x[i], i)+k", parse = T,size=5)
+
+function.plot =
+ ggplot(data=data.frame(x=0,y=0)) +
+ geom_point(aes(x=0,y=0), size=0) +
+ ylab(expression(mu(x))) + xlab('x') +
+ coord_cartesian(ylim = c(-0.05, 1.05), xlim=c(-0.05,1.05)) +
+ annotate('text', x = .5, y = .5, label = "f:x %->% mu(x)", parse = T,size=5)
+
+
+terms.grid = plot_grid(
+
+NULL, triangle.plot, trapezoid.plot, rectangle.plot, discrete.plot, NULL,
+
+bell.plot, cosine.plot, gaussian.plot, gaussianProduct.plot, piShape.plot, sigmoidDifference.plot,
+
+sigmoidProduct.plot, spike.plot, NULL, constant.plot, linear.plot, function.plot,
+
+binary.plot, concave.plot, ramp.plot, sigmoid.plot, sShape.plot, zShape.plot,
+
+nrow=4, ncol=6, scale=1, label_size=12, vjust=1.25,
+#hjust=.5, # align='hv',
+
+labels=c(
+'', 'Triangle', 'Trapezoid', 'Rectangle', 'Discrete', '',
+'Bell', 'Cosine', 'Gaussian', 'GaussianProduct', 'PiShape', 'SigmoidDifference',
+'SigmoidProduct','Spike', '', 'Constant', 'Linear', 'Function',
+'Binary', 'Concave', 'Ramp', 'Sigmoid', 'SShape', 'ZShape')
+)
+
+save_plot('figure/terms.svg', terms.grid,
+ ncol=6, nrow=4, scale=.5)
+
+
+
+
diff --git a/documentation/ui/figure/bell.svg b/documentation/ui/figure/bell.svg
new file mode 100644
index 0000000..9709cf5
--- /dev/null
+++ b/documentation/ui/figure/bell.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="216pt" height="216pt" viewBox="0 0 216 216" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 0.3125 0 L 0.3125 -6.875 L 5.765625 -6.875 L 5.765625 0 Z M 4.90625 -0.859375 L 4.90625 -6.015625 L 1.171875 -6.015625 L 1.171875 -0.859375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 2.59375 -6.703125 C 3.457031 -6.703125 4.085938 -6.347656 4.484375 -5.640625 C 4.773438 -5.085938 4.921875 -4.328125 4.921875 -3.359375 C 4.921875 -2.453125 4.785156 -1.695312 4.515625 -1.09375 C 4.128906 -0.238281 3.488281 0.1875 2.59375 0.1875 C 1.78125 0.1875 1.179688 -0.160156 0.796875 -0.859375 C 0.460938 -1.453125 0.296875 -2.238281 0.296875 -3.21875 C 0.296875 -3.976562 0.394531 -4.632812 0.59375 -5.1875 C 0.957031 -6.195312 1.625 -6.703125 2.59375 -6.703125 Z M 2.578125 -0.578125 C 3.015625 -0.578125 3.363281 -0.769531 3.625 -1.15625 C 3.882812 -1.550781 4.015625 -2.273438 4.015625 -3.328125 C 4.015625 -4.085938 3.921875 -4.710938 3.734375 -5.203125 C 3.546875 -5.703125 3.179688 -5.953125 2.640625 -5.953125 C 2.148438 -5.953125 1.789062 -5.71875 1.5625 -5.25 C 1.332031 -4.78125 1.21875 -4.09375 1.21875 -3.1875 C 1.21875 -2.5 1.289062 -1.945312 1.4375 -1.53125 C 1.65625 -0.894531 2.035156 -0.578125 2.578125 -0.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 0.8125 -1.015625 L 1.796875 -1.015625 L 1.796875 0 L 0.8125 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 0.296875 0 C 0.328125 -0.570312 0.445312 -1.070312 0.65625 -1.5 C 0.863281 -1.9375 1.269531 -2.328125 1.875 -2.671875 L 2.765625 -3.1875 C 3.171875 -3.425781 3.457031 -3.628906 3.625 -3.796875 C 3.875 -4.054688 4 -4.351562 4 -4.6875 C 4 -5.070312 3.878906 -5.378906 3.640625 -5.609375 C 3.410156 -5.835938 3.101562 -5.953125 2.71875 -5.953125 C 2.132812 -5.953125 1.734375 -5.734375 1.515625 -5.296875 C 1.398438 -5.066406 1.335938 -4.742188 1.328125 -4.328125 L 0.46875 -4.328125 C 0.476562 -4.910156 0.582031 -5.382812 0.78125 -5.75 C 1.144531 -6.40625 1.789062 -6.734375 2.71875 -6.734375 C 3.488281 -6.734375 4.050781 -6.523438 4.40625 -6.109375 C 4.757812 -5.691406 4.9375 -5.226562 4.9375 -4.71875 C 4.9375 -4.1875 4.75 -3.726562 4.375 -3.34375 C 4.15625 -3.125 3.757812 -2.851562 3.1875 -2.53125 L 2.546875 -2.1875 C 2.242188 -2.019531 2.003906 -1.859375 1.828125 -1.703125 C 1.515625 -1.429688 1.316406 -1.128906 1.234375 -0.796875 L 4.90625 -0.796875 L 4.90625 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 1.1875 -1.703125 C 1.238281 -1.222656 1.460938 -0.894531 1.859375 -0.71875 C 2.054688 -0.625 2.285156 -0.578125 2.546875 -0.578125 C 3.046875 -0.578125 3.414062 -0.734375 3.65625 -1.046875 C 3.894531 -1.367188 4.015625 -1.722656 4.015625 -2.109375 C 4.015625 -2.578125 3.867188 -2.9375 3.578125 -3.1875 C 3.296875 -3.445312 2.957031 -3.578125 2.5625 -3.578125 C 2.269531 -3.578125 2.019531 -3.519531 1.8125 -3.40625 C 1.601562 -3.289062 1.425781 -3.132812 1.28125 -2.9375 L 0.546875 -2.984375 L 1.0625 -6.59375 L 4.546875 -6.59375 L 4.546875 -5.78125 L 1.703125 -5.78125 L 1.40625 -3.921875 C 1.5625 -4.035156 1.710938 -4.125 1.859375 -4.1875 C 2.109375 -4.289062 2.394531 -4.34375 2.71875 -4.34375 C 3.332031 -4.34375 3.851562 -4.140625 4.28125 -3.734375 C 4.707031 -3.335938 4.921875 -2.835938 4.921875 -2.234375 C 4.921875 -1.597656 4.722656 -1.035156 4.328125 -0.546875 C 3.941406 -0.0664062 3.320312 0.171875 2.46875 0.171875 C 1.914062 0.171875 1.429688 0.0195312 1.015625 -0.28125 C 0.597656 -0.59375 0.363281 -1.066406 0.3125 -1.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 5.015625 -6.59375 L 5.015625 -5.859375 C 4.796875 -5.648438 4.507812 -5.285156 4.15625 -4.765625 C 3.800781 -4.242188 3.484375 -3.6875 3.203125 -3.09375 C 2.929688 -2.507812 2.726562 -1.976562 2.59375 -1.5 C 2.5 -1.1875 2.378906 -0.6875 2.234375 0 L 1.3125 0 C 1.519531 -1.28125 1.988281 -2.554688 2.71875 -3.828125 C 3.144531 -4.566406 3.59375 -5.207031 4.0625 -5.75 L 0.34375 -5.75 L 0.34375 -6.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 0.921875 -4.75 L 0.921875 -5.390625 C 1.523438 -5.453125 1.945312 -5.550781 2.1875 -5.6875 C 2.425781 -5.832031 2.609375 -6.164062 2.734375 -6.6875 L 3.390625 -6.6875 L 3.390625 0 L 2.5 0 L 2.5 -4.75 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-0">
+<path style="stroke:none;" d="M 0.390625 0 L 0.390625 -8.609375 L 7.21875 -8.609375 L 7.21875 0 Z M 6.140625 -1.078125 L 6.140625 -7.53125 L 1.46875 -7.53125 L 1.46875 -1.078125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-1">
+<path style="stroke:none;" d="M 0.171875 -6.28125 L 1.546875 -6.28125 L 2.984375 -4.0625 L 4.4375 -6.28125 L 5.71875 -6.25 L 3.609375 -3.21875 L 5.8125 0 L 4.46875 0 L 2.90625 -2.359375 L 1.40625 0 L 0.0625 0 L 2.28125 -3.21875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-0">
+<path style="stroke:none;" d="M 2.125 -0.59375 L -8.46875 -0.59375 L -8.46875 -6.59375 L 2.125 -6.59375 Z M 1.453125 -1.265625 L 1.453125 -5.9375 L -7.78125 -5.9375 L -7.78125 -1.265625 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-1">
+<path style="stroke:none;" d="M -1.828125 -2 C -1.265625 -2 -0.882812 -2.050781 -0.6875 -2.15625 C -0.5 -2.269531 -0.40625 -2.472656 -0.40625 -2.765625 C -0.40625 -3.222656 -0.726562 -3.601562 -1.375 -3.90625 C -2.019531 -4.207031 -2.835938 -4.359375 -3.828125 -4.359375 L -5.390625 -4.359375 L -5.390625 -5.46875 L -1.453125 -5.46875 C -1.097656 -5.46875 -0.832031 -5.503906 -0.65625 -5.578125 C -0.488281 -5.648438 -0.40625 -5.765625 -0.40625 -5.921875 C -0.40625 -6.085938 -0.488281 -6.210938 -0.65625 -6.296875 C -0.820312 -6.390625 -1.066406 -6.4375 -1.390625 -6.4375 L -1.5625 -6.4375 L -1.5625 -6.6875 C -1.53125 -6.6875 -1.492188 -6.6875 -1.453125 -6.6875 C -1.421875 -6.695312 -1.367188 -6.703125 -1.296875 -6.703125 C -0.847656 -6.703125 -0.5 -6.601562 -0.25 -6.40625 C -0.0078125 -6.21875 0.109375 -5.953125 0.109375 -5.609375 C 0.109375 -5.210938 -0.0625 -4.910156 -0.40625 -4.703125 C -0.75 -4.503906 -1.265625 -4.398438 -1.953125 -4.390625 C -1.242188 -4.210938 -0.722656 -3.96875 -0.390625 -3.65625 C -0.0546875 -3.351562 0.109375 -2.96875 0.109375 -2.5 C 0.109375 -2.144531 0.00390625 -1.851562 -0.203125 -1.625 C -0.410156 -1.394531 -0.71875 -1.234375 -1.125 -1.140625 C -1.050781 -1.128906 -0.941406 -1.125 -0.796875 -1.125 C -0.285156 -1.125 0.273438 -1.253906 0.890625 -1.515625 C 1.515625 -1.773438 1.882812 -1.90625 2 -1.90625 C 2.15625 -1.90625 2.28125 -1.859375 2.375 -1.765625 C 2.46875 -1.671875 2.515625 -1.546875 2.515625 -1.390625 C 2.515625 -1.210938 2.445312 -1.082031 2.3125 -1 C 2.175781 -0.914062 1.960938 -0.875 1.671875 -0.875 C 1.597656 -0.875 1.363281 -0.878906 0.96875 -0.890625 C 0.582031 -0.910156 0.226562 -0.921875 -0.09375 -0.921875 C -0.382812 -0.921875 -0.789062 -0.914062 -1.3125 -0.90625 C -1.832031 -0.894531 -2.210938 -0.890625 -2.453125 -0.890625 L -5.390625 -0.890625 L -5.390625 -2 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-0">
+<path style="stroke:none;" d="M 2.65625 -0.75 L -10.578125 -0.75 L -10.578125 -8.25 L 2.65625 -8.25 Z M 1.8125 -1.59375 L 1.8125 -7.40625 L -9.734375 -7.40625 L -9.734375 -1.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-1">
+<path style="stroke:none;" d="M -10.546875 -4.296875 C -9.796875 -3.460938 -8.925781 -2.867188 -7.9375 -2.515625 C -6.945312 -2.171875 -5.617188 -2 -3.953125 -2 C -2.273438 -2 -0.945312 -2.171875 0.03125 -2.515625 C 1.019531 -2.867188 1.890625 -3.460938 2.640625 -4.296875 L 2.953125 -3.984375 C 2.191406 -2.953125 1.203125 -2.144531 -0.015625 -1.5625 C -1.234375 -0.976562 -2.546875 -0.6875 -3.953125 -0.6875 C -5.359375 -0.6875 -6.671875 -0.976562 -7.890625 -1.5625 C -9.117188 -2.15625 -10.109375 -2.960938 -10.859375 -3.984375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-2">
+<path style="stroke:none;" d="M -10.546875 -0.703125 L -10.859375 -0.984375 C -10.109375 -2.023438 -9.117188 -2.835938 -7.890625 -3.421875 C -6.660156 -4.015625 -5.347656 -4.3125 -3.953125 -4.3125 C -2.546875 -4.3125 -1.234375 -4.015625 -0.015625 -3.421875 C 1.203125 -2.835938 2.191406 -2.023438 2.953125 -0.984375 L 2.640625 -0.703125 C 1.898438 -1.535156 1.035156 -2.125 0.046875 -2.46875 C -0.929688 -2.820312 -2.265625 -3 -3.953125 -3 C -5.628906 -3 -6.957031 -2.820312 -7.9375 -2.46875 C -8.925781 -2.125 -9.796875 -1.535156 -10.546875 -0.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-0">
+<path style="stroke:none;" d="M 0 -0.390625 L -8.609375 -0.390625 L -8.609375 -7.21875 L 0 -7.21875 Z M -1.078125 -6.140625 L -7.53125 -6.140625 L -7.53125 -1.46875 L -1.078125 -1.46875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-1">
+<path style="stroke:none;" d="M -6.28125 -0.171875 L -6.28125 -1.546875 L -4.0625 -2.984375 L -6.28125 -4.4375 L -6.25 -5.71875 L -3.21875 -3.609375 L 0 -5.8125 L 0 -4.46875 L -2.359375 -2.90625 L 0 -1.40625 L 0 -0.0625 L -3.21875 -2.28125 Z "/>
+</symbol>
+</g>
+<clipPath id="clip1">
+ <path d="M 54.019531 14.398438 L 202 14.398438 L 202 180 L 54.019531 180 Z "/>
+</clipPath>
+<clipPath id="clip2">
+ <path d="M 54.019531 154 L 202 154 L 202 156 L 54.019531 156 Z "/>
+</clipPath>
+<clipPath id="clip3">
+ <path d="M 54.019531 116 L 202 116 L 202 118 L 54.019531 118 Z "/>
+</clipPath>
+<clipPath id="clip4">
+ <path d="M 54.019531 78 L 202 78 L 202 80 L 54.019531 80 Z "/>
+</clipPath>
+<clipPath id="clip5">
+ <path d="M 54.019531 40 L 202 40 L 202 42 L 54.019531 42 Z "/>
+</clipPath>
+<clipPath id="clip6">
+ <path d="M 77 14.398438 L 78 14.398438 L 78 180 L 77 180 Z "/>
+</clipPath>
+<clipPath id="clip7">
+ <path d="M 110 14.398438 L 112 14.398438 L 112 180 L 110 180 Z "/>
+</clipPath>
+<clipPath id="clip8">
+ <path d="M 144 14.398438 L 145 14.398438 L 145 180 L 144 180 Z "/>
+</clipPath>
+<clipPath id="clip9">
+ <path d="M 177 14.398438 L 179 14.398438 L 179 180 L 177 180 Z "/>
+</clipPath>
+<clipPath id="clip10">
+ <path d="M 54.019531 173 L 202.601562 173 L 202.601562 175 L 54.019531 175 Z "/>
+</clipPath>
+<clipPath id="clip11">
+ <path d="M 54.019531 135 L 202.601562 135 L 202.601562 137 L 54.019531 137 Z "/>
+</clipPath>
+<clipPath id="clip12">
+ <path d="M 54.019531 97 L 202.601562 97 L 202.601562 99 L 54.019531 99 Z "/>
+</clipPath>
+<clipPath id="clip13">
+ <path d="M 54.019531 59 L 202.601562 59 L 202.601562 61 L 54.019531 61 Z "/>
+</clipPath>
+<clipPath id="clip14">
+ <path d="M 54.019531 21 L 202.601562 21 L 202.601562 23 L 54.019531 23 Z "/>
+</clipPath>
+<clipPath id="clip15">
+ <path d="M 60 14.398438 L 62 14.398438 L 62 180 L 60 180 Z "/>
+</clipPath>
+<clipPath id="clip16">
+ <path d="M 93 14.398438 L 95 14.398438 L 95 180 L 93 180 Z "/>
+</clipPath>
+<clipPath id="clip17">
+ <path d="M 127 14.398438 L 129 14.398438 L 129 180 L 127 180 Z "/>
+</clipPath>
+<clipPath id="clip18">
+ <path d="M 160 14.398438 L 162 14.398438 L 162 180 L 160 180 Z "/>
+</clipPath>
+<clipPath id="clip19">
+ <path d="M 194 14.398438 L 196 14.398438 L 196 180 L 194 180 Z "/>
+</clipPath>
+</defs>
+<g id="surface216">
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 216 L 216 216 L 216 0 L 0 0 Z "/>
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(89.803922%,89.803922%,89.803922%);fill-opacity:1;" d="M 54.019531 179.027344 L 201.601562 179.027344 L 201.601562 14.398438 L 54.019531 14.398438 Z "/>
+</g>
+<g clip-path="url(#clip2)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 154.882812 L 201.601562 154.882812 "/>
+</g>
+<g clip-path="url(#clip3)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 116.882812 L 201.601562 116.882812 "/>
+</g>
+<g clip-path="url(#clip4)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 78.882812 L 201.601562 78.882812 "/>
+</g>
+<g clip-path="url(#clip5)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 40.882812 L 201.601562 40.882812 "/>
+</g>
+<g clip-path="url(#clip6)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 77.496094 179.027344 L 77.496094 14.398438 "/>
+</g>
+<g clip-path="url(#clip7)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 111.039062 179.027344 L 111.039062 14.398438 "/>
+</g>
+<g clip-path="url(#clip8)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 144.578125 179.027344 L 144.578125 14.398438 "/>
+</g>
+<g clip-path="url(#clip9)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 178.121094 179.027344 L 178.121094 14.398438 "/>
+</g>
+<g clip-path="url(#clip10)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 173.882812 L 201.601562 173.882812 "/>
+</g>
+<g clip-path="url(#clip11)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 135.882812 L 201.601562 135.882812 "/>
+</g>
+<g clip-path="url(#clip12)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 97.882812 L 201.601562 97.882812 "/>
+</g>
+<g clip-path="url(#clip13)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 59.882812 L 201.601562 59.882812 "/>
+</g>
+<g clip-path="url(#clip14)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 21.882812 L 201.601562 21.882812 "/>
+</g>
+<g clip-path="url(#clip15)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 179.027344 L 60.726562 14.398438 "/>
+</g>
+<g clip-path="url(#clip16)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 94.269531 179.027344 L 94.269531 14.398438 "/>
+</g>
+<g clip-path="url(#clip17)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 127.808594 179.027344 L 127.808594 14.398438 "/>
+</g>
+<g clip-path="url(#clip18)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 161.351562 179.027344 L 161.351562 14.398438 "/>
+</g>
+<g clip-path="url(#clip19)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.890625 179.027344 L 194.890625 14.398438 "/>
+</g>
+<path style="fill:none;stroke-width:7.440945;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:1;" d="M 60.726562 171.546875 L 60.996094 171.488281 L 61.265625 171.433594 L 61.53125 171.371094 L 61.800781 171.3125 L 62.070312 171.25 L 62.878906 171.050781 L 63.144531 170.980469 L 63.953125 170.757812 L 64.222656 170.679688 L 64.492188 170.597656 L 64.757812 170.515625 L 65.296875 170.34375 L 66.105469 170.0625 L 66.371094 169.964844 L 66.640625 169.863281 L 66.910156 169.757812 L 67.449219 169.539062 L 67.71875 169.421875 L 67.984375 169.304688 L 68.253906 169.183594 L 68.523438 169.058594 L 68.792969 168.929688 L 69.0625 168.796875 L 69.332031 168.660156 L 69.597656 168.515625 L 69.867188 168.371094 L 70.136719 168.222656 L 70.40625 168.066406 L 70.675781 167.90625 L 70.945312 167.742188 L 71.210938 167.574219 L 71.480469 167.398438 L 72.019531 167.03125 L 72.289062 166.839844 L 72.558594 166.640625 L 72.824219 166.433594 L 73.09375 166.222656 L 73.363281 166.007812 L 73.632812 165.78125 L 73.902344 165.550781 L 74.167969 165.308594 L 74.4375 165.0625 L 74.707031 164.808594 L 74.976562 164.542969 L 75.246094 164.273438 L 75.515625 163.992188 L 75.78125 163.699219 L 76.050781 163.402344 L 76.320312 163.09375 L 76.589844 162.773438 L 76.859375 162.445312 L 77.128906 162.101562 L 77.394531 161.75 L 77.664062 161.386719 L 77.933594 161.011719 L 78.203125 160.625 L 78.472656 160.226562 L 78.742188 159.8125 L 79.007812 159.386719 L 79.277344 158.945312 L 79.546875 158.492188 L 79.816406 158.019531 L 80.085938 157.535156 L 80.355469 157.035156 L 80.621094 156.515625 L 80.890625 155.984375 L 81.160156 155.429688 L 81.429688 154.859375 L 81.699219 154.273438 L 81.96875 153.664062 L 82.234375 153.039062 L 82.503906 152.390625 L 82.773438 151.722656 L 83.042969 151.035156 L 83.3125 150.324219 L 83.582031 149.59375 L 83.847656 148.835938 L 84.117188 148.054688 L 84.386719 147.253906 L 84.65625 146.425781 L 84.925781 145.570312 L 85.195312 144.691406 L 85.460938 143.785156 L 85.730469 142.851562 L 86 141.890625 L 86.269531 140.902344 L 86.539062 139.882812 L 86.808594 138.839844 L 87.074219 137.761719 L 87.34375 136.65625 L 87.613281 135.519531 L 87.882812 134.355469 L 88.152344 133.15625 L 88.417969 131.929688 L 88.6875 130.667969 L 88.957031 129.378906 L 89.226562 128.054688 L 89.496094 126.699219 L 89.765625 125.316406 L 90.03125 123.898438 L 90.300781 122.449219 L 90.570312 120.972656 L 90.839844 119.460938 L 91.109375 117.921875 L 91.378906 116.351562 L 91.644531 114.753906 L 91.914062 113.128906 L 92.183594 111.476562 L 92.453125 109.800781 L 92.722656 108.097656 L 92.992188 106.367188 L 93.257812 104.617188 L 93.527344 102.847656 L 93.796875 101.058594 L 94.066406 99.25 L 94.335938 97.425781 L 94.605469 95.589844 L 94.871094 93.738281 L 95.140625 91.878906 L 95.410156 90.007812 L 95.949219 86.257812 L 96.21875 84.378906 L 96.484375 82.5 L 96.753906 80.625 L 97.023438 78.753906 L 97.292969 76.894531 L 97.5625 75.046875 L 97.832031 73.207031 L 98.097656 71.386719 L 98.367188 69.585938 L 98.636719 67.800781 L 98.90625 66.039062 L 99.175781 64.304688 L 99.445312 62.59375 L 99.710938 60.914062 L 99.980469 59.265625 L 100.25 57.648438 L 100.519531 56.0625 L 100.789062 54.515625 L 101.058594 53.003906 L 101.324219 51.53125 L 101.59375 50.097656 L 101.863281 48.703125 L 102.132812 47.351562 L 102.402344 46.039062 L 102.667969 44.769531 L 102.9375 43.542969 L 103.207031 42.359375 L 103.476562 41.21875 L 103.746094 40.125 L 104.015625 39.070312 L 104.28125 38.054688 L 104.550781 37.085938 L 104.820312 36.15625 L 105.089844 35.269531 L 105.359375 34.425781 L 105.628906 33.617188 L 105.894531 32.847656 L 106.164062 32.117188 L 106.433594 31.425781 L 106.703125 30.769531 L 106.972656 30.144531 L 107.242188 29.558594 L 107.507812 29.003906 L 107.777344 28.480469 L 108.046875 27.984375 L 108.316406 27.523438 L 108.585938 27.085938 L 108.855469 26.679688 L 109.121094 26.296875 L 109.390625 25.9375 L 109.660156 25.605469 L 109.929688 25.292969 L 110.199219 25.003906 L 110.46875 24.734375 L 110.734375 24.480469 L 111.003906 24.25 L 111.273438 24.035156 L 111.542969 23.835938 L 111.8125 23.652344 L 112.082031 23.484375 L 112.347656 23.328125 L 112.617188 23.183594 L 112.886719 23.050781 L 113.15625 22.933594 L 113.425781 22.824219 L 113.695312 22.722656 L 113.960938 22.632812 L 114.230469 22.550781 L 114.5 22.472656 L 114.769531 22.40625 L 115.039062 22.34375 L 115.308594 22.289062 L 115.574219 22.238281 L 115.84375 22.195312 L 116.113281 22.15625 L 116.382812 22.121094 L 116.652344 22.089844 L 116.921875 22.0625 L 117.1875 22.035156 L 117.996094 21.976562 L 118.265625 21.964844 L 118.53125 21.949219 L 118.800781 21.941406 L 119.070312 21.929688 L 119.609375 21.914062 L 119.878906 21.910156 L 120.144531 21.90625 L 121.222656 21.890625 L 121.492188 21.890625 L 121.757812 21.886719 L 122.566406 21.886719 L 122.835938 21.882812 L 132.78125 21.882812 L 133.050781 21.886719 L 133.859375 21.886719 L 134.128906 21.890625 L 134.394531 21.890625 L 135.742188 21.910156 L 136.007812 21.914062 L 136.546875 21.929688 L 136.816406 21.941406 L 137.085938 21.949219 L 137.355469 21.964844 L 137.621094 21.976562 L 138.429688 22.035156 L 138.96875 22.089844 L 139.234375 22.121094 L 139.503906 22.15625 L 139.773438 22.195312 L 140.042969 22.238281 L 140.3125 22.289062 L 140.582031 22.34375 L 140.847656 22.40625 L 141.117188 22.472656 L 141.386719 22.550781 L 141.65625 22.632812 L 141.925781 22.722656 L 142.195312 22.824219 L 142.460938 22.933594 L 142.730469 23.050781 L 143 23.183594 L 143.269531 23.328125 L 143.539062 23.484375 L 143.808594 23.652344 L 144.074219 23.835938 L 144.34375 24.035156 L 144.613281 24.25 L 144.882812 24.480469 L 145.152344 24.734375 L 145.421875 25.003906 L 145.6875 25.292969 L 145.957031 25.605469 L 146.226562 25.9375 L 146.496094 26.296875 L 146.765625 26.679688 L 147.03125 27.085938 L 147.300781 27.523438 L 147.570312 27.984375 L 147.839844 28.480469 L 148.109375 29.003906 L 148.378906 29.558594 L 148.644531 30.144531 L 148.914062 30.769531 L 149.183594 31.425781 L 149.453125 32.117188 L 149.722656 32.847656 L 149.992188 33.617188 L 150.257812 34.425781 L 150.527344 35.269531 L 150.796875 36.15625 L 151.066406 37.085938 L 151.335938 38.054688 L 151.605469 39.070312 L 151.871094 40.125 L 152.140625 41.21875 L 152.410156 42.359375 L 152.679688 43.542969 L 152.949219 44.769531 L 153.21875 46.039062 L 153.484375 47.351562 L 153.753906 48.703125 L 154.023438 50.097656 L 154.292969 51.53125 L 154.5625 53.003906 L 154.832031 54.515625 L 155.097656 56.0625 L 155.367188 57.648438 L 155.636719 59.265625 L 155.90625 60.914062 L 156.175781 62.59375 L 156.445312 64.304688 L 156.710938 66.039062 L 156.980469 67.800781 L 157.25 69.585938 L 157.519531 71.386719 L 157.789062 73.207031 L 158.058594 75.046875 L 158.324219 76.894531 L 158.59375 78.753906 L 158.863281 80.625 L 159.132812 82.5 L 159.671875 86.257812 L 159.9375 88.132812 L 160.207031 90.007812 L 160.476562 91.878906 L 160.746094 93.738281 L 161.015625 95.589844 L 161.28125 97.425781 L 161.550781 99.25 L 161.820312 101.058594 L 162.089844 102.847656 L 162.359375 104.617188 L 162.628906 106.367188 L 162.894531 108.097656 L 163.164062 109.800781 L 163.433594 111.476562 L 163.703125 113.128906 L 163.972656 114.753906 L 164.242188 116.351562 L 164.507812 117.921875 L 164.777344 119.460938 L 165.046875 120.972656 L 165.316406 122.449219 L 165.585938 123.898438 L 165.855469 125.316406 L 166.121094 126.699219 L 166.390625 128.054688 L 166.660156 129.378906 L 166.929688 130.667969 L 167.199219 131.929688 L 167.46875 133.15625 L 167.734375 134.355469 L 168.003906 135.519531 L 168.273438 136.65625 L 168.542969 137.761719 L 168.8125 138.839844 L 169.082031 139.882812 L 169.347656 140.902344 L 169.617188 141.890625 L 169.886719 142.851562 L 170.15625 143.785156 L 170.425781 144.691406 L 170.695312 145.570312 L 170.960938 146.425781 L 171.230469 147.253906 L 171.5 148.054688 L 171.769531 148.835938 L 172.039062 149.59375 L 172.308594 150.324219 L 172.574219 151.035156 L 172.84375 151.722656 L 173.113281 152.390625 L 173.382812 153.039062 L 173.652344 153.664062 L 173.921875 154.273438 L 174.1875 154.859375 L 174.457031 155.429688 L 174.726562 155.984375 L 174.996094 156.515625 L 175.265625 157.035156 L 175.535156 157.535156 L 175.800781 158.019531 L 176.070312 158.492188 L 176.339844 158.945312 L 176.609375 159.386719 L 176.878906 159.8125 L 177.144531 160.226562 L 177.414062 160.625 L 177.683594 161.011719 L 177.953125 161.386719 L 178.222656 161.75 L 178.492188 162.101562 L 178.757812 162.445312 L 179.027344 162.773438 L 179.296875 163.09375 L 179.566406 163.402344 L 179.835938 163.699219 L 180.105469 163.992188 L 180.371094 164.273438 L 180.640625 164.542969 L 180.910156 164.808594 L 181.179688 165.0625 L 181.449219 165.308594 L 181.71875 165.550781 L 181.984375 165.78125 L 182.253906 166.007812 L 182.523438 166.222656 L 182.792969 166.433594 L 183.0625 166.640625 L 183.332031 166.839844 L 183.597656 167.03125 L 184.136719 167.398438 L 184.40625 167.574219 L 184.675781 167.742188 L 184.945312 167.90625 L 185.210938 168.066406 L 185.480469 168.222656 L 185.75 168.371094 L 186.289062 168.660156 L 186.558594 168.796875 L 186.824219 168.929688 L 187.09375 169.058594 L 187.363281 169.183594 L 187.632812 169.304688 L 188.171875 169.539062 L 188.4375 169.648438 L 188.707031 169.757812 L 188.976562 169.863281 L 189.246094 169.964844 L 189.515625 170.0625 L 189.785156 170.15625 L 190.050781 170.25 L 190.320312 170.34375 L 190.859375 170.515625 L 191.128906 170.597656 L 191.394531 170.679688 L 191.664062 170.757812 L 192.472656 170.980469 L 192.742188 171.050781 L 193.007812 171.117188 L 193.546875 171.25 L 193.816406 171.3125 L 194.085938 171.371094 L 194.355469 171.433594 L 194.621094 171.488281 L 194.890625 171.546875 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="177.320312"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="177.320312"/>
+ <use xlink:href="#glyph0-1" x="36.25885" y="177.320312"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="177.320312"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="139.320312"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="139.320312"/>
+ <use xlink:href="#glyph0-3" x="36.25885" y="139.320312"/>
+ <use xlink:href="#glyph0-4" x="41.594437" y="139.320312"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="101.320312"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="101.320312"/>
+ <use xlink:href="#glyph0-4" x="36.25885" y="101.320312"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="101.320312"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="63.320312"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="63.320312"/>
+ <use xlink:href="#glyph0-5" x="36.25885" y="63.320312"/>
+ <use xlink:href="#glyph0-4" x="41.594437" y="63.320312"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="28.257812" y="25.320312"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="25.320312"/>
+ <use xlink:href="#glyph0-1" x="36.25885" y="25.320312"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="25.320312"/>
+</g>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 173.882812 L 54.019531 173.882812 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 135.882812 L 54.019531 135.882812 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 97.882812 L 54.019531 97.882812 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 59.882812 L 54.019531 59.882812 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 21.882812 L 54.019531 21.882812 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 183.28125 L 60.726562 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 94.269531 183.28125 L 94.269531 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 127.808594 183.28125 L 127.808594 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 161.351562 183.28125 L 161.351562 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.890625 183.28125 L 194.890625 179.027344 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="51.390625" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="56.726212" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="59.391663" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="64.727249" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="84.933594" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="90.26918" y="192.992188"/>
+ <use xlink:href="#glyph0-3" x="92.934631" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="98.270218" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="118.472656" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="123.808243" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="126.473694" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="131.80928" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="152.015625" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="157.351212" y="192.992188"/>
+ <use xlink:href="#glyph0-5" x="160.016663" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="165.352249" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="185.554688" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="190.890274" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="193.555725" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="198.891312" y="192.992188"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-1" x="124.808594" y="205.199219"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph2-1" x="21.660156" y="108.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-1" x="21.660156" y="101.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph4-1" x="21.660156" y="96.214844"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-2" x="21.660156" y="90.214844"/>
+</g>
+</g>
+</svg>
diff --git a/documentation/ui/figure/binary.svg b/documentation/ui/figure/binary.svg
new file mode 100644
index 0000000..c6b8575
--- /dev/null
+++ b/documentation/ui/figure/binary.svg
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="216pt" height="216pt" viewBox="0 0 216 216" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 0.3125 0 L 0.3125 -6.875 L 5.765625 -6.875 L 5.765625 0 Z M 4.90625 -0.859375 L 4.90625 -6.015625 L 1.171875 -6.015625 L 1.171875 -0.859375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 2.59375 -6.703125 C 3.457031 -6.703125 4.085938 -6.347656 4.484375 -5.640625 C 4.773438 -5.085938 4.921875 -4.328125 4.921875 -3.359375 C 4.921875 -2.453125 4.785156 -1.695312 4.515625 -1.09375 C 4.128906 -0.238281 3.488281 0.1875 2.59375 0.1875 C 1.78125 0.1875 1.179688 -0.160156 0.796875 -0.859375 C 0.460938 -1.453125 0.296875 -2.238281 0.296875 -3.21875 C 0.296875 -3.976562 0.394531 -4.632812 0.59375 -5.1875 C 0.957031 -6.195312 1.625 -6.703125 2.59375 -6.703125 Z M 2.578125 -0.578125 C 3.015625 -0.578125 3.363281 -0.769531 3.625 -1.15625 C 3.882812 -1.550781 4.015625 -2.273438 4.015625 -3.328125 C 4.015625 -4.085938 3.921875 -4.710938 3.734375 -5.203125 C 3.546875 -5.703125 3.179688 -5.953125 2.640625 -5.953125 C 2.148438 -5.953125 1.789062 -5.71875 1.5625 -5.25 C 1.332031 -4.78125 1.21875 -4.09375 1.21875 -3.1875 C 1.21875 -2.5 1.289062 -1.945312 1.4375 -1.53125 C 1.65625 -0.894531 2.035156 -0.578125 2.578125 -0.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 0.8125 -1.015625 L 1.796875 -1.015625 L 1.796875 0 L 0.8125 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 0.296875 0 C 0.328125 -0.570312 0.445312 -1.070312 0.65625 -1.5 C 0.863281 -1.9375 1.269531 -2.328125 1.875 -2.671875 L 2.765625 -3.1875 C 3.171875 -3.425781 3.457031 -3.628906 3.625 -3.796875 C 3.875 -4.054688 4 -4.351562 4 -4.6875 C 4 -5.070312 3.878906 -5.378906 3.640625 -5.609375 C 3.410156 -5.835938 3.101562 -5.953125 2.71875 -5.953125 C 2.132812 -5.953125 1.734375 -5.734375 1.515625 -5.296875 C 1.398438 -5.066406 1.335938 -4.742188 1.328125 -4.328125 L 0.46875 -4.328125 C 0.476562 -4.910156 0.582031 -5.382812 0.78125 -5.75 C 1.144531 -6.40625 1.789062 -6.734375 2.71875 -6.734375 C 3.488281 -6.734375 4.050781 -6.523438 4.40625 -6.109375 C 4.757812 -5.691406 4.9375 -5.226562 4.9375 -4.71875 C 4.9375 -4.1875 4.75 -3.726562 4.375 -3.34375 C 4.15625 -3.125 3.757812 -2.851562 3.1875 -2.53125 L 2.546875 -2.1875 C 2.242188 -2.019531 2.003906 -1.859375 1.828125 -1.703125 C 1.515625 -1.429688 1.316406 -1.128906 1.234375 -0.796875 L 4.90625 -0.796875 L 4.90625 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 1.1875 -1.703125 C 1.238281 -1.222656 1.460938 -0.894531 1.859375 -0.71875 C 2.054688 -0.625 2.285156 -0.578125 2.546875 -0.578125 C 3.046875 -0.578125 3.414062 -0.734375 3.65625 -1.046875 C 3.894531 -1.367188 4.015625 -1.722656 4.015625 -2.109375 C 4.015625 -2.578125 3.867188 -2.9375 3.578125 -3.1875 C 3.296875 -3.445312 2.957031 -3.578125 2.5625 -3.578125 C 2.269531 -3.578125 2.019531 -3.519531 1.8125 -3.40625 C 1.601562 -3.289062 1.425781 -3.132812 1.28125 -2.9375 L 0.546875 -2.984375 L 1.0625 -6.59375 L 4.546875 -6.59375 L 4.546875 -5.78125 L 1.703125 -5.78125 L 1.40625 -3.921875 C 1.5625 -4.035156 1.710938 -4.125 1.859375 -4.1875 C 2.109375 -4.289062 2.394531 -4.34375 2.71875 -4.34375 C 3.332031 -4.34375 3.851562 -4.140625 4.28125 -3.734375 C 4.707031 -3.335938 4.921875 -2.835938 4.921875 -2.234375 C 4.921875 -1.597656 4.722656 -1.035156 4.328125 -0.546875 C 3.941406 -0.0664062 3.320312 0.171875 2.46875 0.171875 C 1.914062 0.171875 1.429688 0.0195312 1.015625 -0.28125 C 0.597656 -0.59375 0.363281 -1.066406 0.3125 -1.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 5.015625 -6.59375 L 5.015625 -5.859375 C 4.796875 -5.648438 4.507812 -5.285156 4.15625 -4.765625 C 3.800781 -4.242188 3.484375 -3.6875 3.203125 -3.09375 C 2.929688 -2.507812 2.726562 -1.976562 2.59375 -1.5 C 2.5 -1.1875 2.378906 -0.6875 2.234375 0 L 1.3125 0 C 1.519531 -1.28125 1.988281 -2.554688 2.71875 -3.828125 C 3.144531 -4.566406 3.59375 -5.207031 4.0625 -5.75 L 0.34375 -5.75 L 0.34375 -6.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 0.921875 -4.75 L 0.921875 -5.390625 C 1.523438 -5.453125 1.945312 -5.550781 2.1875 -5.6875 C 2.425781 -5.832031 2.609375 -6.164062 2.734375 -6.6875 L 3.390625 -6.6875 L 3.390625 0 L 2.5 0 L 2.5 -4.75 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-0">
+<path style="stroke:none;" d="M 0.390625 0 L 0.390625 -8.609375 L 7.21875 -8.609375 L 7.21875 0 Z M 6.140625 -1.078125 L 6.140625 -7.53125 L 1.46875 -7.53125 L 1.46875 -1.078125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-1">
+<path style="stroke:none;" d="M 0.171875 -6.28125 L 1.546875 -6.28125 L 2.984375 -4.0625 L 4.4375 -6.28125 L 5.71875 -6.25 L 3.609375 -3.21875 L 5.8125 0 L 4.46875 0 L 2.90625 -2.359375 L 1.40625 0 L 0.0625 0 L 2.28125 -3.21875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-0">
+<path style="stroke:none;" d="M 2.125 -0.59375 L -8.46875 -0.59375 L -8.46875 -6.59375 L 2.125 -6.59375 Z M 1.453125 -1.265625 L 1.453125 -5.9375 L -7.78125 -5.9375 L -7.78125 -1.265625 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-1">
+<path style="stroke:none;" d="M -1.828125 -2 C -1.265625 -2 -0.882812 -2.050781 -0.6875 -2.15625 C -0.5 -2.269531 -0.40625 -2.472656 -0.40625 -2.765625 C -0.40625 -3.222656 -0.726562 -3.601562 -1.375 -3.90625 C -2.019531 -4.207031 -2.835938 -4.359375 -3.828125 -4.359375 L -5.390625 -4.359375 L -5.390625 -5.46875 L -1.453125 -5.46875 C -1.097656 -5.46875 -0.832031 -5.503906 -0.65625 -5.578125 C -0.488281 -5.648438 -0.40625 -5.765625 -0.40625 -5.921875 C -0.40625 -6.085938 -0.488281 -6.210938 -0.65625 -6.296875 C -0.820312 -6.390625 -1.066406 -6.4375 -1.390625 -6.4375 L -1.5625 -6.4375 L -1.5625 -6.6875 C -1.53125 -6.6875 -1.492188 -6.6875 -1.453125 -6.6875 C -1.421875 -6.695312 -1.367188 -6.703125 -1.296875 -6.703125 C -0.847656 -6.703125 -0.5 -6.601562 -0.25 -6.40625 C -0.0078125 -6.21875 0.109375 -5.953125 0.109375 -5.609375 C 0.109375 -5.210938 -0.0625 -4.910156 -0.40625 -4.703125 C -0.75 -4.503906 -1.265625 -4.398438 -1.953125 -4.390625 C -1.242188 -4.210938 -0.722656 -3.96875 -0.390625 -3.65625 C -0.0546875 -3.351562 0.109375 -2.96875 0.109375 -2.5 C 0.109375 -2.144531 0.00390625 -1.851562 -0.203125 -1.625 C -0.410156 -1.394531 -0.71875 -1.234375 -1.125 -1.140625 C -1.050781 -1.128906 -0.941406 -1.125 -0.796875 -1.125 C -0.285156 -1.125 0.273438 -1.253906 0.890625 -1.515625 C 1.515625 -1.773438 1.882812 -1.90625 2 -1.90625 C 2.15625 -1.90625 2.28125 -1.859375 2.375 -1.765625 C 2.46875 -1.671875 2.515625 -1.546875 2.515625 -1.390625 C 2.515625 -1.210938 2.445312 -1.082031 2.3125 -1 C 2.175781 -0.914062 1.960938 -0.875 1.671875 -0.875 C 1.597656 -0.875 1.363281 -0.878906 0.96875 -0.890625 C 0.582031 -0.910156 0.226562 -0.921875 -0.09375 -0.921875 C -0.382812 -0.921875 -0.789062 -0.914062 -1.3125 -0.90625 C -1.832031 -0.894531 -2.210938 -0.890625 -2.453125 -0.890625 L -5.390625 -0.890625 L -5.390625 -2 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-0">
+<path style="stroke:none;" d="M 2.65625 -0.75 L -10.578125 -0.75 L -10.578125 -8.25 L 2.65625 -8.25 Z M 1.8125 -1.59375 L 1.8125 -7.40625 L -9.734375 -7.40625 L -9.734375 -1.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-1">
+<path style="stroke:none;" d="M -10.546875 -4.296875 C -9.796875 -3.460938 -8.925781 -2.867188 -7.9375 -2.515625 C -6.945312 -2.171875 -5.617188 -2 -3.953125 -2 C -2.273438 -2 -0.945312 -2.171875 0.03125 -2.515625 C 1.019531 -2.867188 1.890625 -3.460938 2.640625 -4.296875 L 2.953125 -3.984375 C 2.191406 -2.953125 1.203125 -2.144531 -0.015625 -1.5625 C -1.234375 -0.976562 -2.546875 -0.6875 -3.953125 -0.6875 C -5.359375 -0.6875 -6.671875 -0.976562 -7.890625 -1.5625 C -9.117188 -2.15625 -10.109375 -2.960938 -10.859375 -3.984375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-2">
+<path style="stroke:none;" d="M -10.546875 -0.703125 L -10.859375 -0.984375 C -10.109375 -2.023438 -9.117188 -2.835938 -7.890625 -3.421875 C -6.660156 -4.015625 -5.347656 -4.3125 -3.953125 -4.3125 C -2.546875 -4.3125 -1.234375 -4.015625 -0.015625 -3.421875 C 1.203125 -2.835938 2.191406 -2.023438 2.953125 -0.984375 L 2.640625 -0.703125 C 1.898438 -1.535156 1.035156 -2.125 0.046875 -2.46875 C -0.929688 -2.820312 -2.265625 -3 -3.953125 -3 C -5.628906 -3 -6.957031 -2.820312 -7.9375 -2.46875 C -8.925781 -2.125 -9.796875 -1.535156 -10.546875 -0.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-0">
+<path style="stroke:none;" d="M 0 -0.390625 L -8.609375 -0.390625 L -8.609375 -7.21875 L 0 -7.21875 Z M -1.078125 -6.140625 L -7.53125 -6.140625 L -7.53125 -1.46875 L -1.078125 -1.46875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-1">
+<path style="stroke:none;" d="M -6.28125 -0.171875 L -6.28125 -1.546875 L -4.0625 -2.984375 L -6.28125 -4.4375 L -6.25 -5.71875 L -3.21875 -3.609375 L 0 -5.8125 L 0 -4.46875 L -2.359375 -2.90625 L 0 -1.40625 L 0 -0.0625 L -3.21875 -2.28125 Z "/>
+</symbol>
+</g>
+<clipPath id="clip1">
+ <path d="M 54.019531 14.398438 L 202 14.398438 L 202 180 L 54.019531 180 Z "/>
+</clipPath>
+<clipPath id="clip2">
+ <path d="M 54.019531 152 L 202 152 L 202 154 L 54.019531 154 Z "/>
+</clipPath>
+<clipPath id="clip3">
+ <path d="M 54.019531 115 L 202 115 L 202 116 L 54.019531 116 Z "/>
+</clipPath>
+<clipPath id="clip4">
+ <path d="M 54.019531 77 L 202 77 L 202 79 L 54.019531 79 Z "/>
+</clipPath>
+<clipPath id="clip5">
+ <path d="M 54.019531 40 L 202 40 L 202 41 L 54.019531 41 Z "/>
+</clipPath>
+<clipPath id="clip6">
+ <path d="M 77 14.398438 L 78 14.398438 L 78 180 L 77 180 Z "/>
+</clipPath>
+<clipPath id="clip7">
+ <path d="M 110 14.398438 L 112 14.398438 L 112 180 L 110 180 Z "/>
+</clipPath>
+<clipPath id="clip8">
+ <path d="M 144 14.398438 L 145 14.398438 L 145 180 L 144 180 Z "/>
+</clipPath>
+<clipPath id="clip9">
+ <path d="M 177 14.398438 L 179 14.398438 L 179 180 L 177 180 Z "/>
+</clipPath>
+<clipPath id="clip10">
+ <path d="M 54.019531 171 L 202.601562 171 L 202.601562 173 L 54.019531 173 Z "/>
+</clipPath>
+<clipPath id="clip11">
+ <path d="M 54.019531 133 L 202.601562 133 L 202.601562 135 L 54.019531 135 Z "/>
+</clipPath>
+<clipPath id="clip12">
+ <path d="M 54.019531 96 L 202.601562 96 L 202.601562 98 L 54.019531 98 Z "/>
+</clipPath>
+<clipPath id="clip13">
+ <path d="M 54.019531 58 L 202.601562 58 L 202.601562 60 L 54.019531 60 Z "/>
+</clipPath>
+<clipPath id="clip14">
+ <path d="M 54.019531 21 L 202.601562 21 L 202.601562 23 L 54.019531 23 Z "/>
+</clipPath>
+<clipPath id="clip15">
+ <path d="M 60 14.398438 L 62 14.398438 L 62 180 L 60 180 Z "/>
+</clipPath>
+<clipPath id="clip16">
+ <path d="M 93 14.398438 L 95 14.398438 L 95 180 L 93 180 Z "/>
+</clipPath>
+<clipPath id="clip17">
+ <path d="M 127 14.398438 L 129 14.398438 L 129 180 L 127 180 Z "/>
+</clipPath>
+<clipPath id="clip18">
+ <path d="M 160 14.398438 L 162 14.398438 L 162 180 L 160 180 Z "/>
+</clipPath>
+<clipPath id="clip19">
+ <path d="M 194 14.398438 L 196 14.398438 L 196 180 L 194 180 Z "/>
+</clipPath>
+</defs>
+<g id="surface241">
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 216 L 216 216 L 216 0 L 0 0 Z "/>
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(89.803922%,89.803922%,89.803922%);fill-opacity:1;" d="M 54.019531 179.027344 L 201.601562 179.027344 L 201.601562 14.398438 L 54.019531 14.398438 Z "/>
+</g>
+<g clip-path="url(#clip2)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 152.839844 L 201.601562 152.839844 "/>
+</g>
+<g clip-path="url(#clip3)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 115.421875 L 201.601562 115.421875 "/>
+</g>
+<g clip-path="url(#clip4)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 78.007812 L 201.601562 78.007812 "/>
+</g>
+<g clip-path="url(#clip5)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 40.589844 L 201.601562 40.589844 "/>
+</g>
+<g clip-path="url(#clip6)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 77.496094 179.027344 L 77.496094 14.398438 "/>
+</g>
+<g clip-path="url(#clip7)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 111.039062 179.027344 L 111.039062 14.398438 "/>
+</g>
+<g clip-path="url(#clip8)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 144.578125 179.027344 L 144.578125 14.398438 "/>
+</g>
+<g clip-path="url(#clip9)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 178.121094 179.027344 L 178.121094 14.398438 "/>
+</g>
+<g clip-path="url(#clip10)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 171.546875 L 201.601562 171.546875 "/>
+</g>
+<g clip-path="url(#clip11)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 134.128906 L 201.601562 134.128906 "/>
+</g>
+<g clip-path="url(#clip12)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 96.714844 L 201.601562 96.714844 "/>
+</g>
+<g clip-path="url(#clip13)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 59.296875 L 201.601562 59.296875 "/>
+</g>
+<g clip-path="url(#clip14)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 21.882812 L 201.601562 21.882812 "/>
+</g>
+<g clip-path="url(#clip15)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 179.027344 L 60.726562 14.398438 "/>
+</g>
+<g clip-path="url(#clip16)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 94.269531 179.027344 L 94.269531 14.398438 "/>
+</g>
+<g clip-path="url(#clip17)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 127.808594 179.027344 L 127.808594 14.398438 "/>
+</g>
+<g clip-path="url(#clip18)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 161.351562 179.027344 L 161.351562 14.398438 "/>
+</g>
+<g clip-path="url(#clip19)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.890625 179.027344 L 194.890625 14.398438 "/>
+</g>
+<path style="fill:none;stroke-width:7.440945;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:1;" d="M 60.726562 171.546875 L 161.28125 171.546875 L 161.550781 21.882812 L 194.890625 21.882812 "/>
+<path style="fill:none;stroke-width:7.440945;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:1;" d="M 60.726562 21.882812 L 94.066406 21.882812 L 94.335938 171.546875 L 194.890625 171.546875 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="174.984375"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="174.984375"/>
+ <use xlink:href="#glyph0-1" x="36.25885" y="174.984375"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="174.984375"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="137.566406"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="137.566406"/>
+ <use xlink:href="#glyph0-3" x="36.25885" y="137.566406"/>
+ <use xlink:href="#glyph0-4" x="41.594437" y="137.566406"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="100.152344"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="100.152344"/>
+ <use xlink:href="#glyph0-4" x="36.25885" y="100.152344"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="100.152344"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="62.734375"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="62.734375"/>
+ <use xlink:href="#glyph0-5" x="36.25885" y="62.734375"/>
+ <use xlink:href="#glyph0-4" x="41.594437" y="62.734375"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="28.257812" y="25.320312"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="25.320312"/>
+ <use xlink:href="#glyph0-1" x="36.25885" y="25.320312"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="25.320312"/>
+</g>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 171.546875 L 54.019531 171.546875 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 134.128906 L 54.019531 134.128906 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 96.714844 L 54.019531 96.714844 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 59.296875 L 54.019531 59.296875 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 21.882812 L 54.019531 21.882812 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 183.28125 L 60.726562 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 94.269531 183.28125 L 94.269531 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 127.808594 183.28125 L 127.808594 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 161.351562 183.28125 L 161.351562 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.890625 183.28125 L 194.890625 179.027344 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="51.390625" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="56.726212" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="59.391663" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="64.727249" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="84.933594" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="90.26918" y="192.992188"/>
+ <use xlink:href="#glyph0-3" x="92.934631" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="98.270218" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="118.472656" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="123.808243" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="126.473694" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="131.80928" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="152.015625" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="157.351212" y="192.992188"/>
+ <use xlink:href="#glyph0-5" x="160.016663" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="165.352249" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="185.554688" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="190.890274" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="193.555725" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="198.891312" y="192.992188"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-1" x="124.808594" y="205.199219"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph2-1" x="21.660156" y="108.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-1" x="21.660156" y="101.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph4-1" x="21.660156" y="96.214844"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-2" x="21.660156" y="90.214844"/>
+</g>
+</g>
+</svg>
diff --git a/documentation/ui/figure/concave.svg b/documentation/ui/figure/concave.svg
new file mode 100644
index 0000000..37ef129
--- /dev/null
+++ b/documentation/ui/figure/concave.svg
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="216pt" height="216pt" viewBox="0 0 216 216" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 0.3125 0 L 0.3125 -6.875 L 5.765625 -6.875 L 5.765625 0 Z M 4.90625 -0.859375 L 4.90625 -6.015625 L 1.171875 -6.015625 L 1.171875 -0.859375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 2.59375 -6.703125 C 3.457031 -6.703125 4.085938 -6.347656 4.484375 -5.640625 C 4.773438 -5.085938 4.921875 -4.328125 4.921875 -3.359375 C 4.921875 -2.453125 4.785156 -1.695312 4.515625 -1.09375 C 4.128906 -0.238281 3.488281 0.1875 2.59375 0.1875 C 1.78125 0.1875 1.179688 -0.160156 0.796875 -0.859375 C 0.460938 -1.453125 0.296875 -2.238281 0.296875 -3.21875 C 0.296875 -3.976562 0.394531 -4.632812 0.59375 -5.1875 C 0.957031 -6.195312 1.625 -6.703125 2.59375 -6.703125 Z M 2.578125 -0.578125 C 3.015625 -0.578125 3.363281 -0.769531 3.625 -1.15625 C 3.882812 -1.550781 4.015625 -2.273438 4.015625 -3.328125 C 4.015625 -4.085938 3.921875 -4.710938 3.734375 -5.203125 C 3.546875 -5.703125 3.179688 -5.953125 2.640625 -5.953125 C 2.148438 -5.953125 1.789062 -5.71875 1.5625 -5.25 C 1.332031 -4.78125 1.21875 -4.09375 1.21875 -3.1875 C 1.21875 -2.5 1.289062 -1.945312 1.4375 -1.53125 C 1.65625 -0.894531 2.035156 -0.578125 2.578125 -0.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 0.8125 -1.015625 L 1.796875 -1.015625 L 1.796875 0 L 0.8125 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 3.171875 -2.375 L 3.171875 -5.421875 L 1.015625 -2.375 Z M 3.1875 0 L 3.1875 -1.640625 L 0.25 -1.640625 L 0.25 -2.46875 L 3.3125 -6.734375 L 4.03125 -6.734375 L 4.03125 -2.375 L 5.015625 -2.375 L 5.015625 -1.640625 L 4.03125 -1.640625 L 4.03125 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 2.8125 -6.734375 C 3.5625 -6.734375 4.082031 -6.535156 4.375 -6.140625 C 4.664062 -5.753906 4.8125 -5.359375 4.8125 -4.953125 L 3.984375 -4.953125 C 3.929688 -5.210938 3.851562 -5.421875 3.75 -5.578125 C 3.539062 -5.859375 3.226562 -6 2.8125 -6 C 2.34375 -6 1.96875 -5.78125 1.6875 -5.34375 C 1.414062 -4.90625 1.265625 -4.28125 1.234375 -3.46875 C 1.421875 -3.75 1.664062 -3.960938 1.96875 -4.109375 C 2.226562 -4.234375 2.523438 -4.296875 2.859375 -4.296875 C 3.421875 -4.296875 3.910156 -4.113281 4.328125 -3.75 C 4.742188 -3.394531 4.953125 -2.863281 4.953125 -2.15625 C 4.953125 -1.539062 4.753906 -1 4.359375 -0.53125 C 3.960938 -0.0625 3.398438 0.171875 2.671875 0.171875 C 2.046875 0.171875 1.503906 -0.0625 1.046875 -0.53125 C 0.585938 -1.007812 0.359375 -1.816406 0.359375 -2.953125 C 0.359375 -3.785156 0.460938 -4.488281 0.671875 -5.0625 C 1.054688 -6.175781 1.769531 -6.734375 2.8125 -6.734375 Z M 2.75 -0.578125 C 3.1875 -0.578125 3.515625 -0.722656 3.734375 -1.015625 C 3.960938 -1.316406 4.078125 -1.671875 4.078125 -2.078125 C 4.078125 -2.421875 3.976562 -2.75 3.78125 -3.0625 C 3.582031 -3.375 3.222656 -3.53125 2.703125 -3.53125 C 2.335938 -3.53125 2.019531 -3.410156 1.75 -3.171875 C 1.476562 -2.929688 1.34375 -2.566406 1.34375 -2.078125 C 1.34375 -1.648438 1.460938 -1.289062 1.703125 -1 C 1.953125 -0.71875 2.300781 -0.578125 2.75 -0.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 2.609375 -3.890625 C 2.984375 -3.890625 3.273438 -3.992188 3.484375 -4.203125 C 3.691406 -4.410156 3.796875 -4.660156 3.796875 -4.953125 C 3.796875 -5.203125 3.691406 -5.429688 3.484375 -5.640625 C 3.285156 -5.847656 2.984375 -5.953125 2.578125 -5.953125 C 2.171875 -5.953125 1.875 -5.847656 1.6875 -5.640625 C 1.507812 -5.429688 1.421875 -5.1875 1.421875 -4.90625 C 1.421875 -4.59375 1.535156 -4.34375 1.765625 -4.15625 C 2.003906 -3.976562 2.285156 -3.890625 2.609375 -3.890625 Z M 2.65625 -0.578125 C 3.050781 -0.578125 3.375 -0.679688 3.625 -0.890625 C 3.882812 -1.097656 4.015625 -1.414062 4.015625 -1.84375 C 4.015625 -2.269531 3.878906 -2.59375 3.609375 -2.8125 C 3.347656 -3.039062 3.007812 -3.15625 2.59375 -3.15625 C 2.195312 -3.15625 1.867188 -3.039062 1.609375 -2.8125 C 1.359375 -2.582031 1.234375 -2.265625 1.234375 -1.859375 C 1.234375 -1.515625 1.347656 -1.210938 1.578125 -0.953125 C 1.816406 -0.703125 2.175781 -0.578125 2.65625 -0.578125 Z M 1.46875 -3.578125 C 1.226562 -3.671875 1.039062 -3.785156 0.90625 -3.921875 C 0.664062 -4.171875 0.546875 -4.5 0.546875 -4.90625 C 0.546875 -5.40625 0.722656 -5.832031 1.078125 -6.1875 C 1.441406 -6.550781 1.957031 -6.734375 2.625 -6.734375 C 3.269531 -6.734375 3.773438 -6.5625 4.140625 -6.21875 C 4.503906 -5.875 4.6875 -5.476562 4.6875 -5.03125 C 4.6875 -4.613281 4.582031 -4.273438 4.375 -4.015625 C 4.25 -3.867188 4.0625 -3.722656 3.8125 -3.578125 C 4.09375 -3.453125 4.3125 -3.304688 4.46875 -3.140625 C 4.769531 -2.828125 4.921875 -2.421875 4.921875 -1.921875 C 4.921875 -1.335938 4.722656 -0.835938 4.328125 -0.421875 C 3.929688 -0.015625 3.367188 0.1875 2.640625 0.1875 C 1.984375 0.1875 1.429688 0.0078125 0.984375 -0.34375 C 0.535156 -0.695312 0.3125 -1.210938 0.3125 -1.890625 C 0.3125 -2.285156 0.40625 -2.625 0.59375 -2.90625 C 0.789062 -3.195312 1.082031 -3.421875 1.46875 -3.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 0.921875 -4.75 L 0.921875 -5.390625 C 1.523438 -5.453125 1.945312 -5.550781 2.1875 -5.6875 C 2.425781 -5.832031 2.609375 -6.164062 2.734375 -6.6875 L 3.390625 -6.6875 L 3.390625 0 L 2.5 0 L 2.5 -4.75 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-7">
+<path style="stroke:none;" d="M 0.296875 0 C 0.328125 -0.570312 0.445312 -1.070312 0.65625 -1.5 C 0.863281 -1.9375 1.269531 -2.328125 1.875 -2.671875 L 2.765625 -3.1875 C 3.171875 -3.425781 3.457031 -3.628906 3.625 -3.796875 C 3.875 -4.054688 4 -4.351562 4 -4.6875 C 4 -5.070312 3.878906 -5.378906 3.640625 -5.609375 C 3.410156 -5.835938 3.101562 -5.953125 2.71875 -5.953125 C 2.132812 -5.953125 1.734375 -5.734375 1.515625 -5.296875 C 1.398438 -5.066406 1.335938 -4.742188 1.328125 -4.328125 L 0.46875 -4.328125 C 0.476562 -4.910156 0.582031 -5.382812 0.78125 -5.75 C 1.144531 -6.40625 1.789062 -6.734375 2.71875 -6.734375 C 3.488281 -6.734375 4.050781 -6.523438 4.40625 -6.109375 C 4.757812 -5.691406 4.9375 -5.226562 4.9375 -4.71875 C 4.9375 -4.1875 4.75 -3.726562 4.375 -3.34375 C 4.15625 -3.125 3.757812 -2.851562 3.1875 -2.53125 L 2.546875 -2.1875 C 2.242188 -2.019531 2.003906 -1.859375 1.828125 -1.703125 C 1.515625 -1.429688 1.316406 -1.128906 1.234375 -0.796875 L 4.90625 -0.796875 L 4.90625 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-8">
+<path style="stroke:none;" d="M 1.1875 -1.703125 C 1.238281 -1.222656 1.460938 -0.894531 1.859375 -0.71875 C 2.054688 -0.625 2.285156 -0.578125 2.546875 -0.578125 C 3.046875 -0.578125 3.414062 -0.734375 3.65625 -1.046875 C 3.894531 -1.367188 4.015625 -1.722656 4.015625 -2.109375 C 4.015625 -2.578125 3.867188 -2.9375 3.578125 -3.1875 C 3.296875 -3.445312 2.957031 -3.578125 2.5625 -3.578125 C 2.269531 -3.578125 2.019531 -3.519531 1.8125 -3.40625 C 1.601562 -3.289062 1.425781 -3.132812 1.28125 -2.9375 L 0.546875 -2.984375 L 1.0625 -6.59375 L 4.546875 -6.59375 L 4.546875 -5.78125 L 1.703125 -5.78125 L 1.40625 -3.921875 C 1.5625 -4.035156 1.710938 -4.125 1.859375 -4.1875 C 2.109375 -4.289062 2.394531 -4.34375 2.71875 -4.34375 C 3.332031 -4.34375 3.851562 -4.140625 4.28125 -3.734375 C 4.707031 -3.335938 4.921875 -2.835938 4.921875 -2.234375 C 4.921875 -1.597656 4.722656 -1.035156 4.328125 -0.546875 C 3.941406 -0.0664062 3.320312 0.171875 2.46875 0.171875 C 1.914062 0.171875 1.429688 0.0195312 1.015625 -0.28125 C 0.597656 -0.59375 0.363281 -1.066406 0.3125 -1.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-9">
+<path style="stroke:none;" d="M 5.015625 -6.59375 L 5.015625 -5.859375 C 4.796875 -5.648438 4.507812 -5.285156 4.15625 -4.765625 C 3.800781 -4.242188 3.484375 -3.6875 3.203125 -3.09375 C 2.929688 -2.507812 2.726562 -1.976562 2.59375 -1.5 C 2.5 -1.1875 2.378906 -0.6875 2.234375 0 L 1.3125 0 C 1.519531 -1.28125 1.988281 -2.554688 2.71875 -3.828125 C 3.144531 -4.566406 3.59375 -5.207031 4.0625 -5.75 L 0.34375 -5.75 L 0.34375 -6.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-0">
+<path style="stroke:none;" d="M 0.390625 0 L 0.390625 -8.609375 L 7.21875 -8.609375 L 7.21875 0 Z M 6.140625 -1.078125 L 6.140625 -7.53125 L 1.46875 -7.53125 L 1.46875 -1.078125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-1">
+<path style="stroke:none;" d="M 0.171875 -6.28125 L 1.546875 -6.28125 L 2.984375 -4.0625 L 4.4375 -6.28125 L 5.71875 -6.25 L 3.609375 -3.21875 L 5.8125 0 L 4.46875 0 L 2.90625 -2.359375 L 1.40625 0 L 0.0625 0 L 2.28125 -3.21875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-0">
+<path style="stroke:none;" d="M 2.125 -0.59375 L -8.46875 -0.59375 L -8.46875 -6.59375 L 2.125 -6.59375 Z M 1.453125 -1.265625 L 1.453125 -5.9375 L -7.78125 -5.9375 L -7.78125 -1.265625 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-1">
+<path style="stroke:none;" d="M -1.828125 -2 C -1.265625 -2 -0.882812 -2.050781 -0.6875 -2.15625 C -0.5 -2.269531 -0.40625 -2.472656 -0.40625 -2.765625 C -0.40625 -3.222656 -0.726562 -3.601562 -1.375 -3.90625 C -2.019531 -4.207031 -2.835938 -4.359375 -3.828125 -4.359375 L -5.390625 -4.359375 L -5.390625 -5.46875 L -1.453125 -5.46875 C -1.097656 -5.46875 -0.832031 -5.503906 -0.65625 -5.578125 C -0.488281 -5.648438 -0.40625 -5.765625 -0.40625 -5.921875 C -0.40625 -6.085938 -0.488281 -6.210938 -0.65625 -6.296875 C -0.820312 -6.390625 -1.066406 -6.4375 -1.390625 -6.4375 L -1.5625 -6.4375 L -1.5625 -6.6875 C -1.53125 -6.6875 -1.492188 -6.6875 -1.453125 -6.6875 C -1.421875 -6.695312 -1.367188 -6.703125 -1.296875 -6.703125 C -0.847656 -6.703125 -0.5 -6.601562 -0.25 -6.40625 C -0.0078125 -6.21875 0.109375 -5.953125 0.109375 -5.609375 C 0.109375 -5.210938 -0.0625 -4.910156 -0.40625 -4.703125 C -0.75 -4.503906 -1.265625 -4.398438 -1.953125 -4.390625 C -1.242188 -4.210938 -0.722656 -3.96875 -0.390625 -3.65625 C -0.0546875 -3.351562 0.109375 -2.96875 0.109375 -2.5 C 0.109375 -2.144531 0.00390625 -1.851562 -0.203125 -1.625 C -0.410156 -1.394531 -0.71875 -1.234375 -1.125 -1.140625 C -1.050781 -1.128906 -0.941406 -1.125 -0.796875 -1.125 C -0.285156 -1.125 0.273438 -1.253906 0.890625 -1.515625 C 1.515625 -1.773438 1.882812 -1.90625 2 -1.90625 C 2.15625 -1.90625 2.28125 -1.859375 2.375 -1.765625 C 2.46875 -1.671875 2.515625 -1.546875 2.515625 -1.390625 C 2.515625 -1.210938 2.445312 -1.082031 2.3125 -1 C 2.175781 -0.914062 1.960938 -0.875 1.671875 -0.875 C 1.597656 -0.875 1.363281 -0.878906 0.96875 -0.890625 C 0.582031 -0.910156 0.226562 -0.921875 -0.09375 -0.921875 C -0.382812 -0.921875 -0.789062 -0.914062 -1.3125 -0.90625 C -1.832031 -0.894531 -2.210938 -0.890625 -2.453125 -0.890625 L -5.390625 -0.890625 L -5.390625 -2 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-0">
+<path style="stroke:none;" d="M 2.65625 -0.75 L -10.578125 -0.75 L -10.578125 -8.25 L 2.65625 -8.25 Z M 1.8125 -1.59375 L 1.8125 -7.40625 L -9.734375 -7.40625 L -9.734375 -1.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-1">
+<path style="stroke:none;" d="M -10.546875 -4.296875 C -9.796875 -3.460938 -8.925781 -2.867188 -7.9375 -2.515625 C -6.945312 -2.171875 -5.617188 -2 -3.953125 -2 C -2.273438 -2 -0.945312 -2.171875 0.03125 -2.515625 C 1.019531 -2.867188 1.890625 -3.460938 2.640625 -4.296875 L 2.953125 -3.984375 C 2.191406 -2.953125 1.203125 -2.144531 -0.015625 -1.5625 C -1.234375 -0.976562 -2.546875 -0.6875 -3.953125 -0.6875 C -5.359375 -0.6875 -6.671875 -0.976562 -7.890625 -1.5625 C -9.117188 -2.15625 -10.109375 -2.960938 -10.859375 -3.984375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-2">
+<path style="stroke:none;" d="M -10.546875 -0.703125 L -10.859375 -0.984375 C -10.109375 -2.023438 -9.117188 -2.835938 -7.890625 -3.421875 C -6.660156 -4.015625 -5.347656 -4.3125 -3.953125 -4.3125 C -2.546875 -4.3125 -1.234375 -4.015625 -0.015625 -3.421875 C 1.203125 -2.835938 2.191406 -2.023438 2.953125 -0.984375 L 2.640625 -0.703125 C 1.898438 -1.535156 1.035156 -2.125 0.046875 -2.46875 C -0.929688 -2.820312 -2.265625 -3 -3.953125 -3 C -5.628906 -3 -6.957031 -2.820312 -7.9375 -2.46875 C -8.925781 -2.125 -9.796875 -1.535156 -10.546875 -0.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-0">
+<path style="stroke:none;" d="M 0 -0.390625 L -8.609375 -0.390625 L -8.609375 -7.21875 L 0 -7.21875 Z M -1.078125 -6.140625 L -7.53125 -6.140625 L -7.53125 -1.46875 L -1.078125 -1.46875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-1">
+<path style="stroke:none;" d="M -6.28125 -0.171875 L -6.28125 -1.546875 L -4.0625 -2.984375 L -6.28125 -4.4375 L -6.25 -5.71875 L -3.21875 -3.609375 L 0 -5.8125 L 0 -4.46875 L -2.359375 -2.90625 L 0 -1.40625 L 0 -0.0625 L -3.21875 -2.28125 Z "/>
+</symbol>
+</g>
+<clipPath id="clip1">
+ <path d="M 48.683594 14.398438 L 202 14.398438 L 202 180 L 48.683594 180 Z "/>
+</clipPath>
+<clipPath id="clip2">
+ <path d="M 48.683594 165 L 202 165 L 202 167 L 48.683594 167 Z "/>
+</clipPath>
+<clipPath id="clip3">
+ <path d="M 48.683594 124 L 202 124 L 202 126 L 48.683594 126 Z "/>
+</clipPath>
+<clipPath id="clip4">
+ <path d="M 48.683594 83 L 202 83 L 202 84 L 48.683594 84 Z "/>
+</clipPath>
+<clipPath id="clip5">
+ <path d="M 48.683594 42 L 202 42 L 202 43 L 48.683594 43 Z "/>
+</clipPath>
+<clipPath id="clip6">
+ <path d="M 72 14.398438 L 74 14.398438 L 74 180 L 72 180 Z "/>
+</clipPath>
+<clipPath id="clip7">
+ <path d="M 107 14.398438 L 109 14.398438 L 109 180 L 107 180 Z "/>
+</clipPath>
+<clipPath id="clip8">
+ <path d="M 142 14.398438 L 143 14.398438 L 143 180 L 142 180 Z "/>
+</clipPath>
+<clipPath id="clip9">
+ <path d="M 177 14.398438 L 178 14.398438 L 178 180 L 177 180 Z "/>
+</clipPath>
+<clipPath id="clip10">
+ <path d="M 48.683594 144 L 202.601562 144 L 202.601562 146 L 48.683594 146 Z "/>
+</clipPath>
+<clipPath id="clip11">
+ <path d="M 48.683594 103 L 202.601562 103 L 202.601562 105 L 48.683594 105 Z "/>
+</clipPath>
+<clipPath id="clip12">
+ <path d="M 48.683594 62 L 202.601562 62 L 202.601562 64 L 48.683594 64 Z "/>
+</clipPath>
+<clipPath id="clip13">
+ <path d="M 48.683594 21 L 202.601562 21 L 202.601562 23 L 48.683594 23 Z "/>
+</clipPath>
+<clipPath id="clip14">
+ <path d="M 55 14.398438 L 57 14.398438 L 57 180 L 55 180 Z "/>
+</clipPath>
+<clipPath id="clip15">
+ <path d="M 89 14.398438 L 91 14.398438 L 91 180 L 89 180 Z "/>
+</clipPath>
+<clipPath id="clip16">
+ <path d="M 124 14.398438 L 126 14.398438 L 126 180 L 124 180 Z "/>
+</clipPath>
+<clipPath id="clip17">
+ <path d="M 159 14.398438 L 161 14.398438 L 161 180 L 159 180 Z "/>
+</clipPath>
+<clipPath id="clip18">
+ <path d="M 194 14.398438 L 196 14.398438 L 196 180 L 194 180 Z "/>
+</clipPath>
+</defs>
+<g id="surface246">
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 216 L 216 216 L 216 0 L 0 0 Z "/>
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(89.803922%,89.803922%,89.803922%);fill-opacity:1;" d="M 48.683594 179.027344 L 201.601562 179.027344 L 201.601562 14.398438 L 48.683594 14.398438 Z "/>
+</g>
+<g clip-path="url(#clip2)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 165.933594 L 201.601562 165.933594 "/>
+</g>
+<g clip-path="url(#clip3)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 124.777344 L 201.601562 124.777344 "/>
+</g>
+<g clip-path="url(#clip4)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 83.617188 L 201.601562 83.617188 "/>
+</g>
+<g clip-path="url(#clip5)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 42.460938 L 201.601562 42.460938 "/>
+</g>
+<g clip-path="url(#clip6)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 73.011719 179.027344 L 73.011719 14.398438 "/>
+</g>
+<g clip-path="url(#clip7)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 107.765625 179.027344 L 107.765625 14.398438 "/>
+</g>
+<g clip-path="url(#clip8)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 142.519531 179.027344 L 142.519531 14.398438 "/>
+</g>
+<g clip-path="url(#clip9)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 177.273438 179.027344 L 177.273438 14.398438 "/>
+</g>
+<g clip-path="url(#clip10)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 145.355469 L 201.601562 145.355469 "/>
+</g>
+<g clip-path="url(#clip11)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 104.199219 L 201.601562 104.199219 "/>
+</g>
+<g clip-path="url(#clip12)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 63.039062 L 201.601562 63.039062 "/>
+</g>
+<g clip-path="url(#clip13)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 21.882812 L 201.601562 21.882812 "/>
+</g>
+<g clip-path="url(#clip14)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 55.632812 179.027344 L 55.632812 14.398438 "/>
+</g>
+<g clip-path="url(#clip15)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 90.386719 179.027344 L 90.386719 14.398438 "/>
+</g>
+<g clip-path="url(#clip16)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 125.140625 179.027344 L 125.140625 14.398438 "/>
+</g>
+<g clip-path="url(#clip17)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 159.894531 179.027344 L 159.894531 14.398438 "/>
+</g>
+<g clip-path="url(#clip18)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.648438 179.027344 L 194.648438 14.398438 "/>
+</g>
+<path style="fill:none;stroke-width:7.440945;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:1;" d="M 55.632812 21.882812 L 83.214844 21.882812 L 83.492188 22.15625 L 83.769531 23.519531 L 84.050781 24.863281 L 84.328125 26.191406 L 84.605469 27.5 L 84.886719 28.792969 L 85.164062 30.066406 L 85.441406 31.328125 L 85.722656 32.570312 L 86 33.796875 L 86.277344 35.011719 L 86.558594 36.207031 L 86.835938 37.390625 L 87.113281 38.558594 L 87.390625 39.710938 L 87.671875 40.851562 L 87.949219 41.976562 L 88.226562 43.089844 L 88.507812 44.191406 L 88.785156 45.277344 L 89.0625 46.351562 L 89.34375 47.410156 L 89.621094 48.460938 L 89.898438 49.496094 L 90.179688 50.519531 L 90.457031 51.535156 L 90.734375 52.535156 L 91.015625 53.523438 L 91.292969 54.503906 L 91.570312 55.472656 L 91.851562 56.429688 L 92.128906 57.375 L 92.40625 58.3125 L 92.6875 59.238281 L 92.964844 60.152344 L 93.242188 61.058594 L 93.519531 61.957031 L 93.800781 62.84375 L 94.078125 63.71875 L 94.355469 64.585938 L 94.636719 65.445312 L 94.914062 66.296875 L 95.191406 67.136719 L 95.472656 67.96875 L 95.75 68.792969 L 96.027344 69.609375 L 96.308594 70.414062 L 96.585938 71.214844 L 96.863281 72.003906 L 97.144531 72.785156 L 97.421875 73.5625 L 97.699219 74.328125 L 97.980469 75.089844 L 98.257812 75.839844 L 98.535156 76.585938 L 98.816406 77.320312 L 99.09375 78.050781 L 99.371094 78.773438 L 99.652344 79.492188 L 99.929688 80.199219 L 100.207031 80.902344 L 100.484375 81.597656 L 100.765625 82.289062 L 101.042969 82.972656 L 101.320312 83.648438 L 101.601562 84.316406 L 101.878906 84.980469 L 102.15625 85.640625 L 102.4375 86.292969 L 102.714844 86.9375 L 102.992188 87.578125 L 103.273438 88.210938 L 103.550781 88.839844 L 103.828125 89.464844 L 104.109375 90.082031 L 104.386719 90.691406 L 104.664062 91.296875 L 104.945312 91.898438 L 105.222656 92.496094 L 105.5 93.085938 L 105.78125 93.671875 L 106.335938 94.828125 L 106.613281 95.398438 L 106.894531 95.960938 L 107.171875 96.523438 L 107.449219 97.078125 L 107.730469 97.628906 L 108.007812 98.175781 L 108.285156 98.71875 L 108.566406 99.257812 L 109.121094 100.320312 L 109.402344 100.84375 L 109.679688 101.363281 L 109.957031 101.878906 L 110.238281 102.390625 L 110.515625 102.898438 L 110.792969 103.402344 L 111.074219 103.898438 L 111.351562 104.394531 L 111.628906 104.886719 L 111.910156 105.375 L 112.1875 105.859375 L 112.742188 106.8125 L 113.023438 107.285156 L 113.300781 107.753906 L 113.578125 108.21875 L 113.859375 108.679688 L 114.414062 109.59375 L 114.695312 110.042969 L 114.972656 110.492188 L 115.25 110.933594 L 115.53125 111.375 L 115.808594 111.8125 L 116.085938 112.246094 L 116.367188 112.679688 L 116.921875 113.53125 L 117.203125 113.953125 L 117.480469 114.371094 L 117.757812 114.785156 L 118.039062 115.195312 L 118.316406 115.605469 L 118.59375 116.011719 L 118.875 116.414062 L 119.152344 116.816406 L 119.429688 117.214844 L 119.707031 117.609375 L 119.988281 118 L 120.265625 118.390625 L 120.542969 118.773438 L 120.824219 119.160156 L 121.378906 119.917969 L 121.660156 120.292969 L 121.9375 120.667969 L 122.214844 121.035156 L 122.496094 121.40625 L 123.050781 122.132812 L 123.332031 122.492188 L 123.609375 122.851562 L 123.886719 123.207031 L 124.167969 123.558594 L 124.445312 123.910156 L 124.722656 124.257812 L 125.003906 124.605469 L 125.28125 124.949219 L 125.835938 125.628906 L 126.117188 125.964844 L 126.394531 126.300781 L 126.671875 126.632812 L 126.953125 126.960938 L 127.507812 127.617188 L 127.789062 127.941406 L 128.34375 128.582031 L 128.625 128.898438 L 128.902344 129.214844 L 129.179688 129.527344 L 129.460938 129.839844 L 129.738281 130.152344 L 130.015625 130.457031 L 130.296875 130.765625 L 130.574219 131.066406 L 130.851562 131.371094 L 131.132812 131.671875 L 131.6875 132.265625 L 131.964844 132.558594 L 132.246094 132.851562 L 132.523438 133.144531 L 132.800781 133.433594 L 133.082031 133.71875 L 133.636719 134.289062 L 133.917969 134.570312 L 134.195312 134.851562 L 134.472656 135.128906 L 134.753906 135.40625 L 135.03125 135.683594 L 135.308594 135.957031 L 135.589844 136.230469 L 136.144531 136.769531 L 136.425781 137.035156 L 136.980469 137.566406 L 137.261719 137.828125 L 137.816406 138.351562 L 138.09375 138.609375 L 138.375 138.863281 L 138.652344 139.121094 L 138.929688 139.375 L 139.210938 139.625 L 139.488281 139.878906 L 139.765625 140.125 L 140.046875 140.375 L 140.601562 140.867188 L 140.882812 141.109375 L 141.4375 141.59375 L 141.71875 141.835938 L 141.996094 142.074219 L 142.273438 142.308594 L 142.554688 142.546875 L 143.109375 143.015625 L 143.390625 143.246094 L 143.945312 143.707031 L 144.226562 143.933594 L 145.058594 144.613281 L 145.339844 144.835938 L 145.617188 145.058594 L 145.894531 145.277344 L 146.175781 145.496094 L 146.730469 145.933594 L 147.011719 146.148438 L 147.566406 146.578125 L 147.847656 146.792969 L 148.402344 147.214844 L 148.683594 147.425781 L 149.238281 147.839844 L 149.519531 148.046875 L 149.796875 148.25 L 150.074219 148.457031 L 150.355469 148.660156 L 150.632812 148.859375 L 150.910156 149.0625 L 151.1875 149.261719 L 151.46875 149.460938 L 151.746094 149.660156 L 152.023438 149.855469 L 152.304688 150.050781 L 152.859375 150.441406 L 153.140625 150.632812 L 153.417969 150.828125 L 153.695312 151.019531 L 153.976562 151.207031 L 154.253906 151.398438 L 154.53125 151.585938 L 154.8125 151.773438 L 155.089844 151.960938 L 155.367188 152.144531 L 155.648438 152.332031 L 155.925781 152.515625 L 156.203125 152.695312 L 156.484375 152.878906 L 156.761719 153.058594 L 157.039062 153.242188 L 157.316406 153.417969 L 157.597656 153.597656 L 157.875 153.777344 L 158.152344 153.953125 L 158.433594 154.128906 L 158.710938 154.304688 L 158.988281 154.476562 L 159.269531 154.652344 L 159.824219 154.996094 L 160.105469 155.167969 L 160.382812 155.335938 L 160.660156 155.507812 L 160.941406 155.675781 L 161.496094 156.011719 L 161.777344 156.175781 L 162.054688 156.34375 L 162.332031 156.507812 L 162.613281 156.671875 L 162.890625 156.835938 L 163.167969 156.996094 L 163.445312 157.160156 L 163.726562 157.320312 L 164.28125 157.640625 L 164.5625 157.796875 L 164.839844 157.957031 L 165.117188 158.113281 L 165.398438 158.269531 L 165.953125 158.582031 L 166.234375 158.734375 L 166.511719 158.890625 L 166.789062 159.042969 L 167.070312 159.195312 L 167.625 159.5 L 167.90625 159.648438 L 168.183594 159.800781 L 168.460938 159.949219 L 168.742188 160.097656 L 169.019531 160.246094 L 169.296875 160.390625 L 169.578125 160.539062 L 169.855469 160.683594 L 170.132812 160.832031 L 170.410156 160.976562 L 170.691406 161.117188 L 171.246094 161.40625 L 171.527344 161.546875 L 171.804688 161.6875 L 172.082031 161.832031 L 172.363281 161.96875 L 172.917969 162.25 L 173.199219 162.386719 L 173.476562 162.527344 L 173.753906 162.664062 L 174.035156 162.800781 L 174.589844 163.074219 L 174.871094 163.207031 L 175.148438 163.34375 L 175.425781 163.476562 L 175.707031 163.609375 L 176.539062 164.007812 L 176.820312 164.136719 L 177.097656 164.269531 L 177.375 164.398438 L 177.65625 164.527344 L 178.210938 164.785156 L 178.492188 164.914062 L 178.769531 165.042969 L 179.046875 165.167969 L 179.328125 165.296875 L 179.882812 165.546875 L 180.164062 165.671875 L 180.71875 165.921875 L 181 166.042969 L 181.277344 166.167969 L 181.554688 166.289062 L 181.835938 166.414062 L 182.667969 166.777344 L 182.949219 166.894531 L 183.226562 167.015625 L 183.503906 167.132812 L 183.785156 167.253906 L 184.339844 167.488281 L 184.621094 167.605469 L 185.175781 167.839844 L 185.457031 167.957031 L 185.734375 168.070312 L 186.011719 168.1875 L 186.292969 168.300781 L 186.847656 168.527344 L 187.128906 168.640625 L 187.683594 168.867188 L 187.964844 168.980469 L 188.242188 169.089844 L 188.519531 169.203125 L 188.800781 169.3125 L 189.078125 169.421875 L 189.355469 169.535156 L 189.632812 169.644531 L 189.914062 169.753906 L 190.191406 169.859375 L 190.46875 169.96875 L 190.75 170.078125 L 191.027344 170.183594 L 191.304688 170.292969 L 191.585938 170.398438 L 192.140625 170.609375 L 192.421875 170.714844 L 192.976562 170.925781 L 193.257812 171.03125 L 193.535156 171.132812 L 193.8125 171.238281 L 194.09375 171.339844 L 194.371094 171.445312 L 194.648438 171.546875 "/>
+<path style="fill:none;stroke-width:7.440945;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:1;" d="M 55.632812 171.546875 L 55.910156 171.445312 L 56.191406 171.339844 L 56.46875 171.238281 L 56.746094 171.132812 L 57.027344 171.03125 L 57.582031 170.820312 L 57.863281 170.714844 L 58.417969 170.503906 L 58.699219 170.398438 L 58.976562 170.292969 L 59.253906 170.183594 L 59.535156 170.078125 L 60.089844 169.859375 L 60.371094 169.753906 L 60.925781 169.535156 L 61.207031 169.421875 L 61.761719 169.203125 L 62.039062 169.089844 L 62.320312 168.980469 L 62.875 168.753906 L 63.15625 168.640625 L 63.710938 168.414062 L 63.992188 168.300781 L 64.269531 168.1875 L 64.546875 168.070312 L 64.828125 167.957031 L 65.382812 167.722656 L 65.664062 167.605469 L 66.21875 167.371094 L 66.5 167.253906 L 66.777344 167.132812 L 67.054688 167.015625 L 67.335938 166.894531 L 67.613281 166.777344 L 68.167969 166.535156 L 68.449219 166.414062 L 68.726562 166.289062 L 69.003906 166.167969 L 69.285156 166.042969 L 69.5625 165.921875 L 69.839844 165.796875 L 70.121094 165.671875 L 70.675781 165.421875 L 70.957031 165.296875 L 71.234375 165.167969 L 71.511719 165.042969 L 71.792969 164.914062 L 72.347656 164.65625 L 72.628906 164.527344 L 73.183594 164.269531 L 73.464844 164.136719 L 73.742188 164.007812 L 74.019531 163.875 L 74.300781 163.742188 L 75.132812 163.34375 L 75.414062 163.207031 L 75.691406 163.074219 L 75.96875 162.9375 L 76.25 162.800781 L 76.804688 162.527344 L 77.085938 162.386719 L 77.363281 162.25 L 77.640625 162.109375 L 77.921875 161.96875 L 78.199219 161.832031 L 78.476562 161.6875 L 78.757812 161.546875 L 79.035156 161.40625 L 79.3125 161.261719 L 79.59375 161.117188 L 79.871094 160.976562 L 80.148438 160.832031 L 80.429688 160.683594 L 80.707031 160.539062 L 80.984375 160.390625 L 81.261719 160.246094 L 81.542969 160.097656 L 82.097656 159.800781 L 82.378906 159.648438 L 82.65625 159.5 L 82.933594 159.347656 L 83.214844 159.195312 L 83.769531 158.890625 L 84.050781 158.734375 L 84.328125 158.582031 L 84.605469 158.425781 L 84.886719 158.269531 L 85.441406 157.957031 L 85.722656 157.796875 L 86 157.640625 L 86.277344 157.480469 L 86.558594 157.320312 L 86.835938 157.160156 L 87.113281 156.996094 L 87.390625 156.835938 L 87.671875 156.671875 L 88.226562 156.34375 L 88.507812 156.175781 L 88.785156 156.011719 L 89.0625 155.84375 L 89.34375 155.675781 L 89.621094 155.507812 L 89.898438 155.335938 L 90.179688 155.167969 L 90.734375 154.824219 L 91.015625 154.652344 L 91.292969 154.476562 L 91.570312 154.304688 L 91.851562 154.128906 L 92.40625 153.777344 L 92.6875 153.597656 L 92.964844 153.417969 L 93.242188 153.242188 L 93.519531 153.058594 L 93.800781 152.878906 L 94.078125 152.695312 L 94.355469 152.515625 L 94.636719 152.332031 L 94.914062 152.144531 L 95.191406 151.960938 L 95.472656 151.773438 L 96.027344 151.398438 L 96.308594 151.207031 L 96.585938 151.019531 L 96.863281 150.828125 L 97.144531 150.632812 L 97.421875 150.441406 L 97.699219 150.246094 L 97.980469 150.050781 L 98.535156 149.660156 L 98.816406 149.460938 L 99.371094 149.0625 L 99.652344 148.859375 L 99.929688 148.660156 L 100.207031 148.457031 L 100.484375 148.25 L 100.765625 148.046875 L 101.320312 147.632812 L 101.601562 147.425781 L 102.15625 147.003906 L 102.4375 146.792969 L 102.992188 146.363281 L 103.273438 146.148438 L 103.550781 145.933594 L 103.828125 145.714844 L 104.109375 145.496094 L 104.664062 145.058594 L 104.945312 144.835938 L 105.222656 144.613281 L 105.5 144.386719 L 105.78125 144.160156 L 106.335938 143.707031 L 106.613281 143.476562 L 106.894531 143.246094 L 107.171875 143.015625 L 107.449219 142.78125 L 107.730469 142.546875 L 108.007812 142.308594 L 108.285156 142.074219 L 108.566406 141.835938 L 109.121094 141.351562 L 109.402344 141.109375 L 109.679688 140.867188 L 109.957031 140.621094 L 110.238281 140.375 L 110.515625 140.125 L 110.792969 139.878906 L 111.074219 139.625 L 111.351562 139.375 L 111.628906 139.121094 L 111.910156 138.863281 L 112.1875 138.609375 L 112.464844 138.351562 L 112.742188 138.089844 L 113.023438 137.828125 L 113.300781 137.566406 L 113.578125 137.300781 L 113.859375 137.035156 L 114.136719 136.769531 L 114.414062 136.5 L 114.695312 136.230469 L 115.25 135.683594 L 115.53125 135.40625 L 116.367188 134.570312 L 116.644531 134.289062 L 116.921875 134.003906 L 117.203125 133.71875 L 117.480469 133.433594 L 117.757812 133.144531 L 118.039062 132.851562 L 118.59375 132.265625 L 118.875 131.96875 L 119.152344 131.671875 L 119.429688 131.371094 L 119.707031 131.066406 L 119.988281 130.765625 L 120.265625 130.457031 L 120.542969 130.152344 L 120.824219 129.839844 L 121.378906 129.214844 L 121.660156 128.898438 L 121.9375 128.582031 L 122.214844 128.261719 L 122.496094 127.941406 L 122.773438 127.617188 L 123.050781 127.289062 L 123.332031 126.960938 L 123.609375 126.632812 L 123.886719 126.300781 L 124.167969 125.964844 L 124.445312 125.628906 L 124.722656 125.289062 L 125.003906 124.949219 L 125.28125 124.605469 L 125.835938 123.910156 L 126.117188 123.558594 L 126.394531 123.207031 L 126.671875 122.851562 L 126.953125 122.492188 L 127.230469 122.132812 L 127.507812 121.769531 L 127.789062 121.40625 L 128.066406 121.035156 L 128.34375 120.667969 L 128.625 120.292969 L 128.902344 119.917969 L 129.179688 119.539062 L 129.460938 119.160156 L 129.738281 118.773438 L 130.015625 118.390625 L 130.296875 118 L 130.574219 117.609375 L 130.851562 117.214844 L 131.132812 116.816406 L 131.6875 116.011719 L 131.964844 115.605469 L 132.246094 115.195312 L 132.523438 114.785156 L 132.800781 114.371094 L 133.082031 113.953125 L 133.359375 113.53125 L 133.636719 113.105469 L 133.917969 112.679688 L 134.472656 111.8125 L 134.753906 111.375 L 135.308594 110.492188 L 135.589844 110.042969 L 135.867188 109.59375 L 136.144531 109.136719 L 136.425781 108.679688 L 136.703125 108.21875 L 136.980469 107.753906 L 137.261719 107.285156 L 137.539062 106.8125 L 138.09375 105.859375 L 138.375 105.375 L 138.652344 104.886719 L 138.929688 104.394531 L 139.210938 103.898438 L 139.488281 103.402344 L 139.765625 102.898438 L 140.046875 102.390625 L 140.324219 101.878906 L 140.601562 101.363281 L 140.882812 100.84375 L 141.160156 100.320312 L 141.4375 99.789062 L 141.71875 99.257812 L 141.996094 98.71875 L 142.273438 98.175781 L 142.554688 97.628906 L 142.832031 97.078125 L 143.390625 95.960938 L 143.667969 95.398438 L 143.945312 94.828125 L 144.226562 94.25 L 144.503906 93.671875 L 144.78125 93.085938 L 145.058594 92.496094 L 145.339844 91.898438 L 145.617188 91.296875 L 145.894531 90.691406 L 146.175781 90.082031 L 146.453125 89.464844 L 146.730469 88.839844 L 147.011719 88.210938 L 147.289062 87.578125 L 147.566406 86.9375 L 147.847656 86.292969 L 148.125 85.640625 L 148.402344 84.980469 L 148.683594 84.316406 L 148.960938 83.648438 L 149.238281 82.972656 L 149.519531 82.289062 L 149.796875 81.597656 L 150.074219 80.902344 L 150.355469 80.199219 L 150.632812 79.492188 L 150.910156 78.773438 L 151.1875 78.050781 L 151.46875 77.320312 L 151.746094 76.585938 L 152.023438 75.839844 L 152.304688 75.089844 L 152.582031 74.328125 L 152.859375 73.5625 L 153.140625 72.785156 L 153.417969 72.003906 L 153.695312 71.214844 L 153.976562 70.414062 L 154.253906 69.609375 L 154.53125 68.792969 L 154.8125 67.96875 L 155.089844 67.136719 L 155.367188 66.296875 L 155.648438 65.445312 L 155.925781 64.585938 L 156.203125 63.71875 L 156.484375 62.84375 L 156.761719 61.957031 L 157.039062 61.058594 L 157.316406 60.152344 L 157.597656 59.238281 L 157.875 58.3125 L 158.152344 57.375 L 158.433594 56.429688 L 158.710938 55.472656 L 158.988281 54.503906 L 159.269531 53.523438 L 159.546875 52.535156 L 159.824219 51.535156 L 160.105469 50.519531 L 160.382812 49.496094 L 160.660156 48.460938 L 160.941406 47.410156 L 161.21875 46.351562 L 161.496094 45.277344 L 161.777344 44.191406 L 162.054688 43.089844 L 162.332031 41.976562 L 162.613281 40.851562 L 162.890625 39.710938 L 163.167969 38.558594 L 163.445312 37.390625 L 163.726562 36.207031 L 164.003906 35.011719 L 164.28125 33.796875 L 164.5625 32.570312 L 164.839844 31.328125 L 165.117188 30.066406 L 165.398438 28.792969 L 165.675781 27.5 L 165.953125 26.191406 L 166.234375 24.863281 L 166.511719 23.519531 L 166.789062 22.15625 L 167.070312 21.882812 L 194.648438 21.882812 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.261719" y="148.792969"/>
+ <use xlink:href="#glyph0-2" x="33.597305" y="148.792969"/>
+ <use xlink:href="#glyph0-3" x="36.262756" y="148.792969"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.261719" y="107.636719"/>
+ <use xlink:href="#glyph0-2" x="33.597305" y="107.636719"/>
+ <use xlink:href="#glyph0-4" x="36.262756" y="107.636719"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.261719" y="66.476562"/>
+ <use xlink:href="#glyph0-2" x="33.597305" y="66.476562"/>
+ <use xlink:href="#glyph0-5" x="36.262756" y="66.476562"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="28.261719" y="25.320312"/>
+ <use xlink:href="#glyph0-2" x="33.597305" y="25.320312"/>
+ <use xlink:href="#glyph0-1" x="36.262756" y="25.320312"/>
+</g>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.429688 145.355469 L 48.683594 145.355469 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.429688 104.199219 L 48.683594 104.199219 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.429688 63.039062 L 48.683594 63.039062 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.429688 21.882812 L 48.683594 21.882812 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 55.632812 183.28125 L 55.632812 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 90.386719 183.28125 L 90.386719 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 125.140625 183.28125 L 125.140625 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 159.894531 183.28125 L 159.894531 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.648438 183.28125 L 194.648438 179.027344 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="46.296875" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="51.632462" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="54.297913" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="59.633499" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="81.050781" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="86.386368" y="192.992188"/>
+ <use xlink:href="#glyph0-7" x="89.051819" y="192.992188"/>
+ <use xlink:href="#glyph0-8" x="94.387405" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="115.804688" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="121.140274" y="192.992188"/>
+ <use xlink:href="#glyph0-8" x="123.805725" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="129.141312" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="150.558594" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="155.89418" y="192.992188"/>
+ <use xlink:href="#glyph0-9" x="158.559631" y="192.992188"/>
+ <use xlink:href="#glyph0-8" x="163.895218" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="185.3125" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="190.648087" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="193.313538" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="198.649124" y="192.992188"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-1" x="122.140625" y="205.199219"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph2-1" x="21.660156" y="108.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-1" x="21.660156" y="101.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph4-1" x="21.660156" y="96.214844"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-2" x="21.660156" y="90.214844"/>
+</g>
+</g>
+</svg>
diff --git a/documentation/ui/figure/cosine.svg b/documentation/ui/figure/cosine.svg
new file mode 100644
index 0000000..ab567c5
--- /dev/null
+++ b/documentation/ui/figure/cosine.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="216pt" height="216pt" viewBox="0 0 216 216" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 0.3125 0 L 0.3125 -6.875 L 5.765625 -6.875 L 5.765625 0 Z M 4.90625 -0.859375 L 4.90625 -6.015625 L 1.171875 -6.015625 L 1.171875 -0.859375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 2.59375 -6.703125 C 3.457031 -6.703125 4.085938 -6.347656 4.484375 -5.640625 C 4.773438 -5.085938 4.921875 -4.328125 4.921875 -3.359375 C 4.921875 -2.453125 4.785156 -1.695312 4.515625 -1.09375 C 4.128906 -0.238281 3.488281 0.1875 2.59375 0.1875 C 1.78125 0.1875 1.179688 -0.160156 0.796875 -0.859375 C 0.460938 -1.453125 0.296875 -2.238281 0.296875 -3.21875 C 0.296875 -3.976562 0.394531 -4.632812 0.59375 -5.1875 C 0.957031 -6.195312 1.625 -6.703125 2.59375 -6.703125 Z M 2.578125 -0.578125 C 3.015625 -0.578125 3.363281 -0.769531 3.625 -1.15625 C 3.882812 -1.550781 4.015625 -2.273438 4.015625 -3.328125 C 4.015625 -4.085938 3.921875 -4.710938 3.734375 -5.203125 C 3.546875 -5.703125 3.179688 -5.953125 2.640625 -5.953125 C 2.148438 -5.953125 1.789062 -5.71875 1.5625 -5.25 C 1.332031 -4.78125 1.21875 -4.09375 1.21875 -3.1875 C 1.21875 -2.5 1.289062 -1.945312 1.4375 -1.53125 C 1.65625 -0.894531 2.035156 -0.578125 2.578125 -0.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 0.8125 -1.015625 L 1.796875 -1.015625 L 1.796875 0 L 0.8125 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 0.296875 0 C 0.328125 -0.570312 0.445312 -1.070312 0.65625 -1.5 C 0.863281 -1.9375 1.269531 -2.328125 1.875 -2.671875 L 2.765625 -3.1875 C 3.171875 -3.425781 3.457031 -3.628906 3.625 -3.796875 C 3.875 -4.054688 4 -4.351562 4 -4.6875 C 4 -5.070312 3.878906 -5.378906 3.640625 -5.609375 C 3.410156 -5.835938 3.101562 -5.953125 2.71875 -5.953125 C 2.132812 -5.953125 1.734375 -5.734375 1.515625 -5.296875 C 1.398438 -5.066406 1.335938 -4.742188 1.328125 -4.328125 L 0.46875 -4.328125 C 0.476562 -4.910156 0.582031 -5.382812 0.78125 -5.75 C 1.144531 -6.40625 1.789062 -6.734375 2.71875 -6.734375 C 3.488281 -6.734375 4.050781 -6.523438 4.40625 -6.109375 C 4.757812 -5.691406 4.9375 -5.226562 4.9375 -4.71875 C 4.9375 -4.1875 4.75 -3.726562 4.375 -3.34375 C 4.15625 -3.125 3.757812 -2.851562 3.1875 -2.53125 L 2.546875 -2.1875 C 2.242188 -2.019531 2.003906 -1.859375 1.828125 -1.703125 C 1.515625 -1.429688 1.316406 -1.128906 1.234375 -0.796875 L 4.90625 -0.796875 L 4.90625 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 1.1875 -1.703125 C 1.238281 -1.222656 1.460938 -0.894531 1.859375 -0.71875 C 2.054688 -0.625 2.285156 -0.578125 2.546875 -0.578125 C 3.046875 -0.578125 3.414062 -0.734375 3.65625 -1.046875 C 3.894531 -1.367188 4.015625 -1.722656 4.015625 -2.109375 C 4.015625 -2.578125 3.867188 -2.9375 3.578125 -3.1875 C 3.296875 -3.445312 2.957031 -3.578125 2.5625 -3.578125 C 2.269531 -3.578125 2.019531 -3.519531 1.8125 -3.40625 C 1.601562 -3.289062 1.425781 -3.132812 1.28125 -2.9375 L 0.546875 -2.984375 L 1.0625 -6.59375 L 4.546875 -6.59375 L 4.546875 -5.78125 L 1.703125 -5.78125 L 1.40625 -3.921875 C 1.5625 -4.035156 1.710938 -4.125 1.859375 -4.1875 C 2.109375 -4.289062 2.394531 -4.34375 2.71875 -4.34375 C 3.332031 -4.34375 3.851562 -4.140625 4.28125 -3.734375 C 4.707031 -3.335938 4.921875 -2.835938 4.921875 -2.234375 C 4.921875 -1.597656 4.722656 -1.035156 4.328125 -0.546875 C 3.941406 -0.0664062 3.320312 0.171875 2.46875 0.171875 C 1.914062 0.171875 1.429688 0.0195312 1.015625 -0.28125 C 0.597656 -0.59375 0.363281 -1.066406 0.3125 -1.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 5.015625 -6.59375 L 5.015625 -5.859375 C 4.796875 -5.648438 4.507812 -5.285156 4.15625 -4.765625 C 3.800781 -4.242188 3.484375 -3.6875 3.203125 -3.09375 C 2.929688 -2.507812 2.726562 -1.976562 2.59375 -1.5 C 2.5 -1.1875 2.378906 -0.6875 2.234375 0 L 1.3125 0 C 1.519531 -1.28125 1.988281 -2.554688 2.71875 -3.828125 C 3.144531 -4.566406 3.59375 -5.207031 4.0625 -5.75 L 0.34375 -5.75 L 0.34375 -6.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 0.921875 -4.75 L 0.921875 -5.390625 C 1.523438 -5.453125 1.945312 -5.550781 2.1875 -5.6875 C 2.425781 -5.832031 2.609375 -6.164062 2.734375 -6.6875 L 3.390625 -6.6875 L 3.390625 0 L 2.5 0 L 2.5 -4.75 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-0">
+<path style="stroke:none;" d="M 0.390625 0 L 0.390625 -8.609375 L 7.21875 -8.609375 L 7.21875 0 Z M 6.140625 -1.078125 L 6.140625 -7.53125 L 1.46875 -7.53125 L 1.46875 -1.078125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-1">
+<path style="stroke:none;" d="M 0.171875 -6.28125 L 1.546875 -6.28125 L 2.984375 -4.0625 L 4.4375 -6.28125 L 5.71875 -6.25 L 3.609375 -3.21875 L 5.8125 0 L 4.46875 0 L 2.90625 -2.359375 L 1.40625 0 L 0.0625 0 L 2.28125 -3.21875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-0">
+<path style="stroke:none;" d="M 2.125 -0.59375 L -8.46875 -0.59375 L -8.46875 -6.59375 L 2.125 -6.59375 Z M 1.453125 -1.265625 L 1.453125 -5.9375 L -7.78125 -5.9375 L -7.78125 -1.265625 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-1">
+<path style="stroke:none;" d="M -1.828125 -2 C -1.265625 -2 -0.882812 -2.050781 -0.6875 -2.15625 C -0.5 -2.269531 -0.40625 -2.472656 -0.40625 -2.765625 C -0.40625 -3.222656 -0.726562 -3.601562 -1.375 -3.90625 C -2.019531 -4.207031 -2.835938 -4.359375 -3.828125 -4.359375 L -5.390625 -4.359375 L -5.390625 -5.46875 L -1.453125 -5.46875 C -1.097656 -5.46875 -0.832031 -5.503906 -0.65625 -5.578125 C -0.488281 -5.648438 -0.40625 -5.765625 -0.40625 -5.921875 C -0.40625 -6.085938 -0.488281 -6.210938 -0.65625 -6.296875 C -0.820312 -6.390625 -1.066406 -6.4375 -1.390625 -6.4375 L -1.5625 -6.4375 L -1.5625 -6.6875 C -1.53125 -6.6875 -1.492188 -6.6875 -1.453125 -6.6875 C -1.421875 -6.695312 -1.367188 -6.703125 -1.296875 -6.703125 C -0.847656 -6.703125 -0.5 -6.601562 -0.25 -6.40625 C -0.0078125 -6.21875 0.109375 -5.953125 0.109375 -5.609375 C 0.109375 -5.210938 -0.0625 -4.910156 -0.40625 -4.703125 C -0.75 -4.503906 -1.265625 -4.398438 -1.953125 -4.390625 C -1.242188 -4.210938 -0.722656 -3.96875 -0.390625 -3.65625 C -0.0546875 -3.351562 0.109375 -2.96875 0.109375 -2.5 C 0.109375 -2.144531 0.00390625 -1.851562 -0.203125 -1.625 C -0.410156 -1.394531 -0.71875 -1.234375 -1.125 -1.140625 C -1.050781 -1.128906 -0.941406 -1.125 -0.796875 -1.125 C -0.285156 -1.125 0.273438 -1.253906 0.890625 -1.515625 C 1.515625 -1.773438 1.882812 -1.90625 2 -1.90625 C 2.15625 -1.90625 2.28125 -1.859375 2.375 -1.765625 C 2.46875 -1.671875 2.515625 -1.546875 2.515625 -1.390625 C 2.515625 -1.210938 2.445312 -1.082031 2.3125 -1 C 2.175781 -0.914062 1.960938 -0.875 1.671875 -0.875 C 1.597656 -0.875 1.363281 -0.878906 0.96875 -0.890625 C 0.582031 -0.910156 0.226562 -0.921875 -0.09375 -0.921875 C -0.382812 -0.921875 -0.789062 -0.914062 -1.3125 -0.90625 C -1.832031 -0.894531 -2.210938 -0.890625 -2.453125 -0.890625 L -5.390625 -0.890625 L -5.390625 -2 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-0">
+<path style="stroke:none;" d="M 2.65625 -0.75 L -10.578125 -0.75 L -10.578125 -8.25 L 2.65625 -8.25 Z M 1.8125 -1.59375 L 1.8125 -7.40625 L -9.734375 -7.40625 L -9.734375 -1.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-1">
+<path style="stroke:none;" d="M -10.546875 -4.296875 C -9.796875 -3.460938 -8.925781 -2.867188 -7.9375 -2.515625 C -6.945312 -2.171875 -5.617188 -2 -3.953125 -2 C -2.273438 -2 -0.945312 -2.171875 0.03125 -2.515625 C 1.019531 -2.867188 1.890625 -3.460938 2.640625 -4.296875 L 2.953125 -3.984375 C 2.191406 -2.953125 1.203125 -2.144531 -0.015625 -1.5625 C -1.234375 -0.976562 -2.546875 -0.6875 -3.953125 -0.6875 C -5.359375 -0.6875 -6.671875 -0.976562 -7.890625 -1.5625 C -9.117188 -2.15625 -10.109375 -2.960938 -10.859375 -3.984375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-2">
+<path style="stroke:none;" d="M -10.546875 -0.703125 L -10.859375 -0.984375 C -10.109375 -2.023438 -9.117188 -2.835938 -7.890625 -3.421875 C -6.660156 -4.015625 -5.347656 -4.3125 -3.953125 -4.3125 C -2.546875 -4.3125 -1.234375 -4.015625 -0.015625 -3.421875 C 1.203125 -2.835938 2.191406 -2.023438 2.953125 -0.984375 L 2.640625 -0.703125 C 1.898438 -1.535156 1.035156 -2.125 0.046875 -2.46875 C -0.929688 -2.820312 -2.265625 -3 -3.953125 -3 C -5.628906 -3 -6.957031 -2.820312 -7.9375 -2.46875 C -8.925781 -2.125 -9.796875 -1.535156 -10.546875 -0.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-0">
+<path style="stroke:none;" d="M 0 -0.390625 L -8.609375 -0.390625 L -8.609375 -7.21875 L 0 -7.21875 Z M -1.078125 -6.140625 L -7.53125 -6.140625 L -7.53125 -1.46875 L -1.078125 -1.46875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-1">
+<path style="stroke:none;" d="M -6.28125 -0.171875 L -6.28125 -1.546875 L -4.0625 -2.984375 L -6.28125 -4.4375 L -6.25 -5.71875 L -3.21875 -3.609375 L 0 -5.8125 L 0 -4.46875 L -2.359375 -2.90625 L 0 -1.40625 L 0 -0.0625 L -3.21875 -2.28125 Z "/>
+</symbol>
+</g>
+<clipPath id="clip1">
+ <path d="M 54.019531 14.398438 L 202 14.398438 L 202 180 L 54.019531 180 Z "/>
+</clipPath>
+<clipPath id="clip2">
+ <path d="M 54.019531 152 L 202 152 L 202 154 L 54.019531 154 Z "/>
+</clipPath>
+<clipPath id="clip3">
+ <path d="M 54.019531 115 L 202 115 L 202 116 L 54.019531 116 Z "/>
+</clipPath>
+<clipPath id="clip4">
+ <path d="M 54.019531 77 L 202 77 L 202 79 L 54.019531 79 Z "/>
+</clipPath>
+<clipPath id="clip5">
+ <path d="M 54.019531 40 L 202 40 L 202 41 L 54.019531 41 Z "/>
+</clipPath>
+<clipPath id="clip6">
+ <path d="M 77 14.398438 L 78 14.398438 L 78 180 L 77 180 Z "/>
+</clipPath>
+<clipPath id="clip7">
+ <path d="M 110 14.398438 L 112 14.398438 L 112 180 L 110 180 Z "/>
+</clipPath>
+<clipPath id="clip8">
+ <path d="M 144 14.398438 L 145 14.398438 L 145 180 L 144 180 Z "/>
+</clipPath>
+<clipPath id="clip9">
+ <path d="M 177 14.398438 L 179 14.398438 L 179 180 L 177 180 Z "/>
+</clipPath>
+<clipPath id="clip10">
+ <path d="M 54.019531 171 L 202.601562 171 L 202.601562 173 L 54.019531 173 Z "/>
+</clipPath>
+<clipPath id="clip11">
+ <path d="M 54.019531 133 L 202.601562 133 L 202.601562 135 L 54.019531 135 Z "/>
+</clipPath>
+<clipPath id="clip12">
+ <path d="M 54.019531 96 L 202.601562 96 L 202.601562 98 L 54.019531 98 Z "/>
+</clipPath>
+<clipPath id="clip13">
+ <path d="M 54.019531 58 L 202.601562 58 L 202.601562 60 L 54.019531 60 Z "/>
+</clipPath>
+<clipPath id="clip14">
+ <path d="M 54.019531 21 L 202.601562 21 L 202.601562 23 L 54.019531 23 Z "/>
+</clipPath>
+<clipPath id="clip15">
+ <path d="M 60 14.398438 L 62 14.398438 L 62 180 L 60 180 Z "/>
+</clipPath>
+<clipPath id="clip16">
+ <path d="M 93 14.398438 L 95 14.398438 L 95 180 L 93 180 Z "/>
+</clipPath>
+<clipPath id="clip17">
+ <path d="M 127 14.398438 L 129 14.398438 L 129 180 L 127 180 Z "/>
+</clipPath>
+<clipPath id="clip18">
+ <path d="M 160 14.398438 L 162 14.398438 L 162 180 L 160 180 Z "/>
+</clipPath>
+<clipPath id="clip19">
+ <path d="M 194 14.398438 L 196 14.398438 L 196 180 L 194 180 Z "/>
+</clipPath>
+</defs>
+<g id="surface201">
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 216 L 216 216 L 216 0 L 0 0 Z "/>
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(89.803922%,89.803922%,89.803922%);fill-opacity:1;" d="M 54.019531 179.027344 L 201.601562 179.027344 L 201.601562 14.398438 L 54.019531 14.398438 Z "/>
+</g>
+<g clip-path="url(#clip2)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 152.835938 L 201.601562 152.835938 "/>
+</g>
+<g clip-path="url(#clip3)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 115.421875 L 201.601562 115.421875 "/>
+</g>
+<g clip-path="url(#clip4)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 78.003906 L 201.601562 78.003906 "/>
+</g>
+<g clip-path="url(#clip5)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 40.589844 L 201.601562 40.589844 "/>
+</g>
+<g clip-path="url(#clip6)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 77.496094 179.027344 L 77.496094 14.398438 "/>
+</g>
+<g clip-path="url(#clip7)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 111.039062 179.027344 L 111.039062 14.398438 "/>
+</g>
+<g clip-path="url(#clip8)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 144.578125 179.027344 L 144.578125 14.398438 "/>
+</g>
+<g clip-path="url(#clip9)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 178.121094 179.027344 L 178.121094 14.398438 "/>
+</g>
+<g clip-path="url(#clip10)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 171.546875 L 201.601562 171.546875 "/>
+</g>
+<g clip-path="url(#clip11)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 134.128906 L 201.601562 134.128906 "/>
+</g>
+<g clip-path="url(#clip12)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 96.714844 L 201.601562 96.714844 "/>
+</g>
+<g clip-path="url(#clip13)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 59.296875 L 201.601562 59.296875 "/>
+</g>
+<g clip-path="url(#clip14)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 21.882812 L 201.601562 21.882812 "/>
+</g>
+<g clip-path="url(#clip15)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 179.027344 L 60.726562 14.398438 "/>
+</g>
+<g clip-path="url(#clip16)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 94.269531 179.027344 L 94.269531 14.398438 "/>
+</g>
+<g clip-path="url(#clip17)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 127.808594 179.027344 L 127.808594 14.398438 "/>
+</g>
+<g clip-path="url(#clip18)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 161.351562 179.027344 L 161.351562 14.398438 "/>
+</g>
+<g clip-path="url(#clip19)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.890625 179.027344 L 194.890625 14.398438 "/>
+</g>
+<path style="fill:none;stroke-width:7.440945;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:1;" d="M 60.726562 171.546875 L 60.996094 171.539062 L 61.265625 171.523438 L 61.53125 171.492188 L 61.800781 171.449219 L 62.070312 171.398438 L 62.339844 171.332031 L 62.609375 171.253906 L 62.878906 171.167969 L 63.144531 171.066406 L 63.414062 170.953125 L 63.683594 170.828125 L 63.953125 170.691406 L 64.222656 170.546875 L 64.492188 170.386719 L 64.757812 170.214844 L 65.027344 170.03125 L 65.296875 169.839844 L 65.566406 169.632812 L 65.835938 169.414062 L 66.105469 169.183594 L 66.371094 168.945312 L 66.640625 168.691406 L 66.910156 168.429688 L 67.179688 168.15625 L 67.449219 167.867188 L 67.71875 167.570312 L 67.984375 167.261719 L 68.253906 166.941406 L 68.523438 166.613281 L 68.792969 166.269531 L 69.0625 165.917969 L 69.332031 165.554688 L 69.597656 165.179688 L 69.867188 164.792969 L 70.136719 164.394531 L 70.40625 163.988281 L 70.675781 163.570312 L 70.945312 163.140625 L 71.210938 162.703125 L 71.480469 162.253906 L 71.75 161.792969 L 72.019531 161.324219 L 72.289062 160.84375 L 72.558594 160.351562 L 72.824219 159.851562 L 73.09375 159.339844 L 73.363281 158.820312 L 73.632812 158.289062 L 73.902344 157.75 L 74.167969 157.199219 L 74.4375 156.640625 L 74.707031 156.070312 L 74.976562 155.492188 L 75.246094 154.902344 L 75.515625 154.308594 L 75.78125 153.699219 L 76.050781 153.085938 L 76.320312 152.460938 L 76.589844 151.828125 L 76.859375 151.1875 L 77.128906 150.535156 L 77.394531 149.878906 L 77.664062 149.210938 L 77.933594 148.535156 L 78.203125 147.851562 L 78.472656 147.160156 L 78.742188 146.457031 L 79.007812 145.75 L 79.277344 145.035156 L 79.546875 144.3125 L 79.816406 143.582031 L 80.085938 142.84375 L 80.355469 142.097656 L 80.621094 141.34375 L 80.890625 140.585938 L 81.160156 139.816406 L 81.429688 139.042969 L 81.699219 138.265625 L 81.96875 137.476562 L 82.234375 136.683594 L 82.503906 135.882812 L 82.773438 135.078125 L 83.042969 134.265625 L 83.3125 133.449219 L 83.582031 132.625 L 83.847656 131.792969 L 84.117188 130.960938 L 84.65625 129.273438 L 84.925781 128.421875 L 85.195312 127.566406 L 85.460938 126.707031 L 85.730469 125.839844 L 86 124.96875 L 86.269531 124.09375 L 86.539062 123.214844 L 86.808594 122.332031 L 87.074219 121.445312 L 87.34375 120.554688 L 87.613281 119.660156 L 87.882812 118.761719 L 88.152344 117.859375 L 88.417969 116.953125 L 88.957031 115.132812 L 89.226562 114.21875 L 89.496094 113.300781 L 89.765625 112.378906 L 90.03125 111.457031 L 90.570312 109.605469 L 91.109375 107.746094 L 91.378906 106.8125 L 91.644531 105.878906 L 92.722656 102.128906 L 92.992188 101.1875 L 93.257812 100.246094 L 94.066406 97.421875 L 94.335938 96.476562 L 94.605469 95.535156 L 94.871094 94.59375 L 95.679688 91.769531 L 95.949219 90.832031 L 96.21875 89.890625 L 96.484375 88.953125 L 96.753906 88.019531 L 97.023438 87.082031 L 97.292969 86.148438 L 97.5625 85.21875 L 97.832031 84.285156 L 98.097656 83.359375 L 98.636719 81.507812 L 98.90625 80.585938 L 99.175781 79.667969 L 99.445312 78.753906 L 99.710938 77.839844 L 99.980469 76.929688 L 100.519531 75.117188 L 101.058594 73.320312 L 101.324219 72.425781 L 101.863281 70.652344 L 102.402344 68.894531 L 102.667969 68.023438 L 102.9375 67.15625 L 103.207031 66.292969 L 103.476562 65.433594 L 103.746094 64.578125 L 104.015625 63.730469 L 104.28125 62.886719 L 104.550781 62.050781 L 104.820312 61.21875 L 105.089844 60.390625 L 105.359375 59.570312 L 105.628906 58.753906 L 105.894531 57.945312 L 106.164062 57.144531 L 106.433594 56.347656 L 106.703125 55.554688 L 106.972656 54.773438 L 107.242188 53.996094 L 107.507812 53.226562 L 107.777344 52.460938 L 108.046875 51.707031 L 108.316406 50.957031 L 108.585938 50.214844 L 108.855469 49.480469 L 109.121094 48.753906 L 109.390625 48.035156 L 109.660156 47.320312 L 109.929688 46.617188 L 110.199219 45.921875 L 110.46875 45.234375 L 110.734375 44.554688 L 111.003906 43.882812 L 111.273438 43.21875 L 111.542969 42.566406 L 111.8125 41.917969 L 112.082031 41.28125 L 112.347656 40.652344 L 112.617188 40.035156 L 112.886719 39.421875 L 113.15625 38.820312 L 113.425781 38.230469 L 113.695312 37.644531 L 113.960938 37.070312 L 114.230469 36.507812 L 114.5 35.953125 L 114.769531 35.40625 L 115.039062 34.871094 L 115.308594 34.347656 L 115.574219 33.832031 L 115.84375 33.324219 L 116.113281 32.828125 L 116.382812 32.34375 L 116.652344 31.867188 L 116.921875 31.402344 L 117.1875 30.949219 L 117.457031 30.503906 L 117.726562 30.070312 L 117.996094 29.648438 L 118.265625 29.234375 L 118.53125 28.832031 L 118.800781 28.441406 L 119.070312 28.0625 L 119.339844 27.691406 L 119.609375 27.332031 L 119.878906 26.984375 L 120.144531 26.648438 L 120.414062 26.324219 L 120.683594 26.007812 L 120.953125 25.707031 L 121.222656 25.414062 L 121.492188 25.132812 L 121.757812 24.863281 L 122.027344 24.605469 L 122.296875 24.359375 L 122.566406 24.125 L 122.835938 23.902344 L 123.105469 23.691406 L 123.371094 23.492188 L 123.640625 23.300781 L 123.910156 23.125 L 124.179688 22.960938 L 124.449219 22.808594 L 124.71875 22.664062 L 124.984375 22.535156 L 125.253906 22.417969 L 125.523438 22.308594 L 125.792969 22.214844 L 126.0625 22.132812 L 126.332031 22.0625 L 126.597656 22 L 126.867188 21.953125 L 127.136719 21.917969 L 127.40625 21.894531 L 127.675781 21.882812 L 127.945312 21.882812 L 128.210938 21.894531 L 128.480469 21.917969 L 128.75 21.953125 L 129.019531 22 L 129.289062 22.0625 L 129.558594 22.132812 L 129.824219 22.214844 L 130.09375 22.308594 L 130.363281 22.417969 L 130.632812 22.535156 L 130.902344 22.664062 L 131.171875 22.808594 L 131.4375 22.960938 L 131.707031 23.125 L 131.976562 23.300781 L 132.246094 23.492188 L 132.515625 23.691406 L 132.78125 23.902344 L 133.050781 24.125 L 133.320312 24.359375 L 133.589844 24.605469 L 133.859375 24.863281 L 134.128906 25.132812 L 134.394531 25.414062 L 134.664062 25.707031 L 134.933594 26.007812 L 135.203125 26.324219 L 135.472656 26.648438 L 135.742188 26.984375 L 136.007812 27.332031 L 136.277344 27.691406 L 136.546875 28.0625 L 136.816406 28.441406 L 137.085938 28.832031 L 137.355469 29.234375 L 137.621094 29.648438 L 137.890625 30.070312 L 138.160156 30.503906 L 138.429688 30.949219 L 138.699219 31.402344 L 138.96875 31.867188 L 139.234375 32.34375 L 139.503906 32.828125 L 139.773438 33.324219 L 140.042969 33.832031 L 140.3125 34.347656 L 140.582031 34.871094 L 140.847656 35.40625 L 141.117188 35.953125 L 141.386719 36.507812 L 141.65625 37.070312 L 141.925781 37.644531 L 142.195312 38.230469 L 142.460938 38.820312 L 142.730469 39.421875 L 143 40.035156 L 143.269531 40.652344 L 143.539062 41.28125 L 143.808594 41.917969 L 144.074219 42.566406 L 144.34375 43.21875 L 144.613281 43.882812 L 144.882812 44.554688 L 145.152344 45.234375 L 145.421875 45.921875 L 145.6875 46.617188 L 145.957031 47.320312 L 146.226562 48.035156 L 146.496094 48.753906 L 146.765625 49.480469 L 147.03125 50.214844 L 147.300781 50.957031 L 147.570312 51.707031 L 147.839844 52.460938 L 148.109375 53.226562 L 148.378906 53.996094 L 148.644531 54.773438 L 148.914062 55.554688 L 149.183594 56.347656 L 149.453125 57.144531 L 149.722656 57.945312 L 149.992188 58.753906 L 150.257812 59.570312 L 150.527344 60.390625 L 150.796875 61.21875 L 151.066406 62.050781 L 151.335938 62.886719 L 151.605469 63.730469 L 151.871094 64.578125 L 152.140625 65.433594 L 152.410156 66.292969 L 152.679688 67.15625 L 152.949219 68.023438 L 153.21875 68.894531 L 153.484375 69.773438 L 153.753906 70.652344 L 154.292969 72.425781 L 154.5625 73.320312 L 154.832031 74.21875 L 155.097656 75.117188 L 155.636719 76.929688 L 155.90625 77.839844 L 156.445312 79.667969 L 156.710938 80.585938 L 156.980469 81.507812 L 157.789062 84.285156 L 158.058594 85.21875 L 158.324219 86.148438 L 158.59375 87.082031 L 158.863281 88.019531 L 159.132812 88.953125 L 159.402344 89.890625 L 159.671875 90.832031 L 159.9375 91.769531 L 161.015625 95.535156 L 161.28125 96.476562 L 161.550781 97.421875 L 162.628906 101.1875 L 162.894531 102.128906 L 163.972656 105.878906 L 164.242188 106.8125 L 164.507812 107.746094 L 165.046875 109.605469 L 165.585938 111.457031 L 165.855469 112.378906 L 166.121094 113.300781 L 166.390625 114.21875 L 166.660156 115.132812 L 167.199219 116.953125 L 167.46875 117.859375 L 167.734375 118.761719 L 168.003906 119.660156 L 168.273438 120.554688 L 168.542969 121.445312 L 168.8125 122.332031 L 169.082031 123.214844 L 169.347656 124.09375 L 169.617188 124.96875 L 169.886719 125.839844 L 170.15625 126.707031 L 170.425781 127.566406 L 170.695312 128.421875 L 170.960938 129.273438 L 171.5 130.960938 L 172.039062 132.625 L 172.308594 133.449219 L 172.574219 134.265625 L 172.84375 135.078125 L 173.113281 135.882812 L 173.382812 136.683594 L 173.652344 137.476562 L 173.921875 138.265625 L 174.1875 139.042969 L 174.457031 139.816406 L 174.726562 140.585938 L 174.996094 141.34375 L 175.265625 142.097656 L 175.535156 142.84375 L 175.800781 143.582031 L 176.070312 144.3125 L 176.339844 145.035156 L 176.609375 145.75 L 176.878906 146.457031 L 177.144531 147.160156 L 177.414062 147.851562 L 177.683594 148.535156 L 177.953125 149.210938 L 178.222656 149.878906 L 178.492188 150.535156 L 178.757812 151.1875 L 179.027344 151.828125 L 179.296875 152.460938 L 179.566406 153.085938 L 179.835938 153.699219 L 180.105469 154.308594 L 180.371094 154.902344 L 180.640625 155.492188 L 180.910156 156.070312 L 181.179688 156.640625 L 181.449219 157.199219 L 181.71875 157.75 L 181.984375 158.289062 L 182.253906 158.820312 L 182.523438 159.339844 L 182.792969 159.851562 L 183.0625 160.351562 L 183.332031 160.84375 L 183.597656 161.324219 L 183.867188 161.792969 L 184.136719 162.253906 L 184.40625 162.703125 L 184.675781 163.140625 L 184.945312 163.570312 L 185.210938 163.988281 L 185.480469 164.394531 L 185.75 164.792969 L 186.019531 165.179688 L 186.289062 165.554688 L 186.558594 165.917969 L 186.824219 166.269531 L 187.09375 166.613281 L 187.363281 166.941406 L 187.632812 167.261719 L 187.902344 167.570312 L 188.171875 167.867188 L 188.4375 168.15625 L 188.707031 168.429688 L 188.976562 168.691406 L 189.246094 168.945312 L 189.515625 169.183594 L 189.785156 169.414062 L 190.050781 169.632812 L 190.320312 169.839844 L 190.589844 170.03125 L 190.859375 170.214844 L 191.128906 170.386719 L 191.394531 170.546875 L 191.664062 170.691406 L 191.933594 170.828125 L 192.203125 170.953125 L 192.472656 171.066406 L 192.742188 171.167969 L 193.007812 171.253906 L 193.277344 171.332031 L 193.546875 171.398438 L 193.816406 171.449219 L 194.085938 171.492188 L 194.355469 171.523438 L 194.621094 171.539062 L 194.890625 171.546875 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="174.984375"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="174.984375"/>
+ <use xlink:href="#glyph0-1" x="36.25885" y="174.984375"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="174.984375"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="137.566406"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="137.566406"/>
+ <use xlink:href="#glyph0-3" x="36.25885" y="137.566406"/>
+ <use xlink:href="#glyph0-4" x="41.594437" y="137.566406"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="100.152344"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="100.152344"/>
+ <use xlink:href="#glyph0-4" x="36.25885" y="100.152344"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="100.152344"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="62.734375"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="62.734375"/>
+ <use xlink:href="#glyph0-5" x="36.25885" y="62.734375"/>
+ <use xlink:href="#glyph0-4" x="41.594437" y="62.734375"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="28.257812" y="25.320312"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="25.320312"/>
+ <use xlink:href="#glyph0-1" x="36.25885" y="25.320312"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="25.320312"/>
+</g>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 171.546875 L 54.019531 171.546875 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 134.128906 L 54.019531 134.128906 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 96.714844 L 54.019531 96.714844 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 59.296875 L 54.019531 59.296875 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 21.882812 L 54.019531 21.882812 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 183.28125 L 60.726562 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 94.269531 183.28125 L 94.269531 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 127.808594 183.28125 L 127.808594 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 161.351562 183.28125 L 161.351562 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.890625 183.28125 L 194.890625 179.027344 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="51.390625" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="56.726212" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="59.391663" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="64.727249" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="84.933594" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="90.26918" y="192.992188"/>
+ <use xlink:href="#glyph0-3" x="92.934631" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="98.270218" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="118.472656" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="123.808243" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="126.473694" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="131.80928" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="152.015625" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="157.351212" y="192.992188"/>
+ <use xlink:href="#glyph0-5" x="160.016663" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="165.352249" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="185.554688" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="190.890274" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="193.555725" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="198.891312" y="192.992188"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-1" x="124.808594" y="205.199219"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph2-1" x="21.660156" y="108.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-1" x="21.660156" y="101.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph4-1" x="21.660156" y="96.214844"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-2" x="21.660156" y="90.214844"/>
+</g>
+</g>
+</svg>
diff --git a/documentation/ui/figure/discrete.svg b/documentation/ui/figure/discrete.svg
new file mode 100644
index 0000000..bb24450
--- /dev/null
+++ b/documentation/ui/figure/discrete.svg
@@ -0,0 +1,310 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="216pt" height="216pt" viewBox="0 0 216 216" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 0.3125 0 L 0.3125 -6.875 L 5.765625 -6.875 L 5.765625 0 Z M 4.90625 -0.859375 L 4.90625 -6.015625 L 1.171875 -6.015625 L 1.171875 -0.859375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 2.59375 -6.703125 C 3.457031 -6.703125 4.085938 -6.347656 4.484375 -5.640625 C 4.773438 -5.085938 4.921875 -4.328125 4.921875 -3.359375 C 4.921875 -2.453125 4.785156 -1.695312 4.515625 -1.09375 C 4.128906 -0.238281 3.488281 0.1875 2.59375 0.1875 C 1.78125 0.1875 1.179688 -0.160156 0.796875 -0.859375 C 0.460938 -1.453125 0.296875 -2.238281 0.296875 -3.21875 C 0.296875 -3.976562 0.394531 -4.632812 0.59375 -5.1875 C 0.957031 -6.195312 1.625 -6.703125 2.59375 -6.703125 Z M 2.578125 -0.578125 C 3.015625 -0.578125 3.363281 -0.769531 3.625 -1.15625 C 3.882812 -1.550781 4.015625 -2.273438 4.015625 -3.328125 C 4.015625 -4.085938 3.921875 -4.710938 3.734375 -5.203125 C 3.546875 -5.703125 3.179688 -5.953125 2.640625 -5.953125 C 2.148438 -5.953125 1.789062 -5.71875 1.5625 -5.25 C 1.332031 -4.78125 1.21875 -4.09375 1.21875 -3.1875 C 1.21875 -2.5 1.289062 -1.945312 1.4375 -1.53125 C 1.65625 -0.894531 2.035156 -0.578125 2.578125 -0.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 0.8125 -1.015625 L 1.796875 -1.015625 L 1.796875 0 L 0.8125 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 0.296875 0 C 0.328125 -0.570312 0.445312 -1.070312 0.65625 -1.5 C 0.863281 -1.9375 1.269531 -2.328125 1.875 -2.671875 L 2.765625 -3.1875 C 3.171875 -3.425781 3.457031 -3.628906 3.625 -3.796875 C 3.875 -4.054688 4 -4.351562 4 -4.6875 C 4 -5.070312 3.878906 -5.378906 3.640625 -5.609375 C 3.410156 -5.835938 3.101562 -5.953125 2.71875 -5.953125 C 2.132812 -5.953125 1.734375 -5.734375 1.515625 -5.296875 C 1.398438 -5.066406 1.335938 -4.742188 1.328125 -4.328125 L 0.46875 -4.328125 C 0.476562 -4.910156 0.582031 -5.382812 0.78125 -5.75 C 1.144531 -6.40625 1.789062 -6.734375 2.71875 -6.734375 C 3.488281 -6.734375 4.050781 -6.523438 4.40625 -6.109375 C 4.757812 -5.691406 4.9375 -5.226562 4.9375 -4.71875 C 4.9375 -4.1875 4.75 -3.726562 4.375 -3.34375 C 4.15625 -3.125 3.757812 -2.851562 3.1875 -2.53125 L 2.546875 -2.1875 C 2.242188 -2.019531 2.003906 -1.859375 1.828125 -1.703125 C 1.515625 -1.429688 1.316406 -1.128906 1.234375 -0.796875 L 4.90625 -0.796875 L 4.90625 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 1.1875 -1.703125 C 1.238281 -1.222656 1.460938 -0.894531 1.859375 -0.71875 C 2.054688 -0.625 2.285156 -0.578125 2.546875 -0.578125 C 3.046875 -0.578125 3.414062 -0.734375 3.65625 -1.046875 C 3.894531 -1.367188 4.015625 -1.722656 4.015625 -2.109375 C 4.015625 -2.578125 3.867188 -2.9375 3.578125 -3.1875 C 3.296875 -3.445312 2.957031 -3.578125 2.5625 -3.578125 C 2.269531 -3.578125 2.019531 -3.519531 1.8125 -3.40625 C 1.601562 -3.289062 1.425781 -3.132812 1.28125 -2.9375 L 0.546875 -2.984375 L 1.0625 -6.59375 L 4.546875 -6.59375 L 4.546875 -5.78125 L 1.703125 -5.78125 L 1.40625 -3.921875 C 1.5625 -4.035156 1.710938 -4.125 1.859375 -4.1875 C 2.109375 -4.289062 2.394531 -4.34375 2.71875 -4.34375 C 3.332031 -4.34375 3.851562 -4.140625 4.28125 -3.734375 C 4.707031 -3.335938 4.921875 -2.835938 4.921875 -2.234375 C 4.921875 -1.597656 4.722656 -1.035156 4.328125 -0.546875 C 3.941406 -0.0664062 3.320312 0.171875 2.46875 0.171875 C 1.914062 0.171875 1.429688 0.0195312 1.015625 -0.28125 C 0.597656 -0.59375 0.363281 -1.066406 0.3125 -1.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 5.015625 -6.59375 L 5.015625 -5.859375 C 4.796875 -5.648438 4.507812 -5.285156 4.15625 -4.765625 C 3.800781 -4.242188 3.484375 -3.6875 3.203125 -3.09375 C 2.929688 -2.507812 2.726562 -1.976562 2.59375 -1.5 C 2.5 -1.1875 2.378906 -0.6875 2.234375 0 L 1.3125 0 C 1.519531 -1.28125 1.988281 -2.554688 2.71875 -3.828125 C 3.144531 -4.566406 3.59375 -5.207031 4.0625 -5.75 L 0.34375 -5.75 L 0.34375 -6.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 0.921875 -4.75 L 0.921875 -5.390625 C 1.523438 -5.453125 1.945312 -5.550781 2.1875 -5.6875 C 2.425781 -5.832031 2.609375 -6.164062 2.734375 -6.6875 L 3.390625 -6.6875 L 3.390625 0 L 2.5 0 L 2.5 -4.75 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-0">
+<path style="stroke:none;" d="M 0.390625 0 L 0.390625 -8.609375 L 7.21875 -8.609375 L 7.21875 0 Z M 6.140625 -1.078125 L 6.140625 -7.53125 L 1.46875 -7.53125 L 1.46875 -1.078125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-1">
+<path style="stroke:none;" d="M 0.171875 -6.28125 L 1.546875 -6.28125 L 2.984375 -4.0625 L 4.4375 -6.28125 L 5.71875 -6.25 L 3.609375 -3.21875 L 5.8125 0 L 4.46875 0 L 2.90625 -2.359375 L 1.40625 0 L 0.0625 0 L 2.28125 -3.21875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-0">
+<path style="stroke:none;" d="M 2.125 -0.59375 L -8.46875 -0.59375 L -8.46875 -6.59375 L 2.125 -6.59375 Z M 1.453125 -1.265625 L 1.453125 -5.9375 L -7.78125 -5.9375 L -7.78125 -1.265625 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-1">
+<path style="stroke:none;" d="M -1.828125 -2 C -1.265625 -2 -0.882812 -2.050781 -0.6875 -2.15625 C -0.5 -2.269531 -0.40625 -2.472656 -0.40625 -2.765625 C -0.40625 -3.222656 -0.726562 -3.601562 -1.375 -3.90625 C -2.019531 -4.207031 -2.835938 -4.359375 -3.828125 -4.359375 L -5.390625 -4.359375 L -5.390625 -5.46875 L -1.453125 -5.46875 C -1.097656 -5.46875 -0.832031 -5.503906 -0.65625 -5.578125 C -0.488281 -5.648438 -0.40625 -5.765625 -0.40625 -5.921875 C -0.40625 -6.085938 -0.488281 -6.210938 -0.65625 -6.296875 C -0.820312 -6.390625 -1.066406 -6.4375 -1.390625 -6.4375 L -1.5625 -6.4375 L -1.5625 -6.6875 C -1.53125 -6.6875 -1.492188 -6.6875 -1.453125 -6.6875 C -1.421875 -6.695312 -1.367188 -6.703125 -1.296875 -6.703125 C -0.847656 -6.703125 -0.5 -6.601562 -0.25 -6.40625 C -0.0078125 -6.21875 0.109375 -5.953125 0.109375 -5.609375 C 0.109375 -5.210938 -0.0625 -4.910156 -0.40625 -4.703125 C -0.75 -4.503906 -1.265625 -4.398438 -1.953125 -4.390625 C -1.242188 -4.210938 -0.722656 -3.96875 -0.390625 -3.65625 C -0.0546875 -3.351562 0.109375 -2.96875 0.109375 -2.5 C 0.109375 -2.144531 0.00390625 -1.851562 -0.203125 -1.625 C -0.410156 -1.394531 -0.71875 -1.234375 -1.125 -1.140625 C -1.050781 -1.128906 -0.941406 -1.125 -0.796875 -1.125 C -0.285156 -1.125 0.273438 -1.253906 0.890625 -1.515625 C 1.515625 -1.773438 1.882812 -1.90625 2 -1.90625 C 2.15625 -1.90625 2.28125 -1.859375 2.375 -1.765625 C 2.46875 -1.671875 2.515625 -1.546875 2.515625 -1.390625 C 2.515625 -1.210938 2.445312 -1.082031 2.3125 -1 C 2.175781 -0.914062 1.960938 -0.875 1.671875 -0.875 C 1.597656 -0.875 1.363281 -0.878906 0.96875 -0.890625 C 0.582031 -0.910156 0.226562 -0.921875 -0.09375 -0.921875 C -0.382812 -0.921875 -0.789062 -0.914062 -1.3125 -0.90625 C -1.832031 -0.894531 -2.210938 -0.890625 -2.453125 -0.890625 L -5.390625 -0.890625 L -5.390625 -2 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-0">
+<path style="stroke:none;" d="M 2.65625 -0.75 L -10.578125 -0.75 L -10.578125 -8.25 L 2.65625 -8.25 Z M 1.8125 -1.59375 L 1.8125 -7.40625 L -9.734375 -7.40625 L -9.734375 -1.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-1">
+<path style="stroke:none;" d="M -10.546875 -4.296875 C -9.796875 -3.460938 -8.925781 -2.867188 -7.9375 -2.515625 C -6.945312 -2.171875 -5.617188 -2 -3.953125 -2 C -2.273438 -2 -0.945312 -2.171875 0.03125 -2.515625 C 1.019531 -2.867188 1.890625 -3.460938 2.640625 -4.296875 L 2.953125 -3.984375 C 2.191406 -2.953125 1.203125 -2.144531 -0.015625 -1.5625 C -1.234375 -0.976562 -2.546875 -0.6875 -3.953125 -0.6875 C -5.359375 -0.6875 -6.671875 -0.976562 -7.890625 -1.5625 C -9.117188 -2.15625 -10.109375 -2.960938 -10.859375 -3.984375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-2">
+<path style="stroke:none;" d="M -10.546875 -0.703125 L -10.859375 -0.984375 C -10.109375 -2.023438 -9.117188 -2.835938 -7.890625 -3.421875 C -6.660156 -4.015625 -5.347656 -4.3125 -3.953125 -4.3125 C -2.546875 -4.3125 -1.234375 -4.015625 -0.015625 -3.421875 C 1.203125 -2.835938 2.191406 -2.023438 2.953125 -0.984375 L 2.640625 -0.703125 C 1.898438 -1.535156 1.035156 -2.125 0.046875 -2.46875 C -0.929688 -2.820312 -2.265625 -3 -3.953125 -3 C -5.628906 -3 -6.957031 -2.820312 -7.9375 -2.46875 C -8.925781 -2.125 -9.796875 -1.535156 -10.546875 -0.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-0">
+<path style="stroke:none;" d="M 0 -0.390625 L -8.609375 -0.390625 L -8.609375 -7.21875 L 0 -7.21875 Z M -1.078125 -6.140625 L -7.53125 -6.140625 L -7.53125 -1.46875 L -1.078125 -1.46875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-1">
+<path style="stroke:none;" d="M -6.28125 -0.171875 L -6.28125 -1.546875 L -4.0625 -2.984375 L -6.28125 -4.4375 L -6.25 -5.71875 L -3.21875 -3.609375 L 0 -5.8125 L 0 -4.46875 L -2.359375 -2.90625 L 0 -1.40625 L 0 -0.0625 L -3.21875 -2.28125 Z "/>
+</symbol>
+</g>
+<clipPath id="clip1">
+ <path d="M 54.019531 14.398438 L 202 14.398438 L 202 180 L 54.019531 180 Z "/>
+</clipPath>
+<clipPath id="clip2">
+ <path d="M 54.019531 152 L 202 152 L 202 153 L 54.019531 153 Z "/>
+</clipPath>
+<clipPath id="clip3">
+ <path d="M 54.019531 114 L 202 114 L 202 115 L 54.019531 115 Z "/>
+</clipPath>
+<clipPath id="clip4">
+ <path d="M 54.019531 76 L 202 76 L 202 77 L 54.019531 77 Z "/>
+</clipPath>
+<clipPath id="clip5">
+ <path d="M 54.019531 38 L 202 38 L 202 39 L 54.019531 39 Z "/>
+</clipPath>
+<clipPath id="clip6">
+ <path d="M 77 14.398438 L 78 14.398438 L 78 180 L 77 180 Z "/>
+</clipPath>
+<clipPath id="clip7">
+ <path d="M 110 14.398438 L 112 14.398438 L 112 180 L 110 180 Z "/>
+</clipPath>
+<clipPath id="clip8">
+ <path d="M 144 14.398438 L 145 14.398438 L 145 180 L 144 180 Z "/>
+</clipPath>
+<clipPath id="clip9">
+ <path d="M 177 14.398438 L 179 14.398438 L 179 180 L 177 180 Z "/>
+</clipPath>
+<clipPath id="clip10">
+ <path d="M 54.019531 171 L 202.601562 171 L 202.601562 173 L 54.019531 173 Z "/>
+</clipPath>
+<clipPath id="clip11">
+ <path d="M 54.019531 132 L 202.601562 132 L 202.601562 135 L 54.019531 135 Z "/>
+</clipPath>
+<clipPath id="clip12">
+ <path d="M 54.019531 94 L 202.601562 94 L 202.601562 96 L 54.019531 96 Z "/>
+</clipPath>
+<clipPath id="clip13">
+ <path d="M 54.019531 56 L 202.601562 56 L 202.601562 58 L 54.019531 58 Z "/>
+</clipPath>
+<clipPath id="clip14">
+ <path d="M 54.019531 18 L 202.601562 18 L 202.601562 20 L 54.019531 20 Z "/>
+</clipPath>
+<clipPath id="clip15">
+ <path d="M 60 14.398438 L 62 14.398438 L 62 180 L 60 180 Z "/>
+</clipPath>
+<clipPath id="clip16">
+ <path d="M 93 14.398438 L 95 14.398438 L 95 180 L 93 180 Z "/>
+</clipPath>
+<clipPath id="clip17">
+ <path d="M 127 14.398438 L 129 14.398438 L 129 180 L 127 180 Z "/>
+</clipPath>
+<clipPath id="clip18">
+ <path d="M 160 14.398438 L 162 14.398438 L 162 180 L 160 180 Z "/>
+</clipPath>
+<clipPath id="clip19">
+ <path d="M 194 14.398438 L 196 14.398438 L 196 180 L 194 180 Z "/>
+</clipPath>
+</defs>
+<g id="surface196">
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 216 L 216 216 L 216 0 L 0 0 Z "/>
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(89.803922%,89.803922%,89.803922%);fill-opacity:1;" d="M 54.019531 179.027344 L 201.601562 179.027344 L 201.601562 14.398438 L 54.019531 14.398438 Z "/>
+</g>
+<g clip-path="url(#clip2)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 152.515625 L 201.601562 152.515625 "/>
+</g>
+<g clip-path="url(#clip3)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 114.449219 L 201.601562 114.449219 "/>
+</g>
+<g clip-path="url(#clip4)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 76.386719 L 201.601562 76.386719 "/>
+</g>
+<g clip-path="url(#clip5)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 38.320312 L 201.601562 38.320312 "/>
+</g>
+<g clip-path="url(#clip6)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 77.496094 179.027344 L 77.496094 14.398438 "/>
+</g>
+<g clip-path="url(#clip7)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 111.039062 179.027344 L 111.039062 14.398438 "/>
+</g>
+<g clip-path="url(#clip8)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 144.578125 179.027344 L 144.578125 14.398438 "/>
+</g>
+<g clip-path="url(#clip9)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 178.121094 179.027344 L 178.121094 14.398438 "/>
+</g>
+<g clip-path="url(#clip10)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 171.546875 L 201.601562 171.546875 "/>
+</g>
+<g clip-path="url(#clip11)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 133.480469 L 201.601562 133.480469 "/>
+</g>
+<g clip-path="url(#clip12)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 95.417969 L 201.601562 95.417969 "/>
+</g>
+<g clip-path="url(#clip13)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 57.355469 L 201.601562 57.355469 "/>
+</g>
+<g clip-path="url(#clip14)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 19.289062 L 201.601562 19.289062 "/>
+</g>
+<g clip-path="url(#clip15)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 179.027344 L 60.726562 14.398438 "/>
+</g>
+<g clip-path="url(#clip16)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 94.269531 179.027344 L 94.269531 14.398438 "/>
+</g>
+<g clip-path="url(#clip17)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 127.808594 179.027344 L 127.808594 14.398438 "/>
+</g>
+<g clip-path="url(#clip18)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 161.351562 179.027344 L 161.351562 14.398438 "/>
+</g>
+<g clip-path="url(#clip19)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.890625 179.027344 L 194.890625 14.398438 "/>
+</g>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 64.445312 171.546875 C 64.445312 176.507812 57.007812 176.507812 57.007812 171.546875 C 57.007812 166.585938 64.445312 166.585938 64.445312 171.546875 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 66.867188 160.5625 C 66.867188 165.523438 59.425781 165.523438 59.425781 160.5625 C 59.425781 155.601562 66.867188 155.601562 66.867188 160.5625 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 69.554688 148.355469 C 69.554688 153.316406 62.113281 153.316406 62.113281 148.355469 C 62.113281 143.394531 69.554688 143.394531 69.554688 148.355469 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 72.242188 136.152344 C 72.242188 141.113281 64.804688 141.113281 64.804688 136.152344 C 64.804688 131.191406 72.242188 131.191406 72.242188 136.152344 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 74.933594 123.945312 C 74.933594 128.90625 67.492188 128.90625 67.492188 123.945312 C 67.492188 118.984375 74.933594 118.984375 74.933594 123.945312 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 77.621094 111.742188 C 77.621094 116.703125 70.179688 116.703125 70.179688 111.742188 C 70.179688 106.78125 77.621094 106.78125 77.621094 111.742188 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 80.308594 99.535156 C 80.308594 104.496094 72.871094 104.496094 72.871094 99.535156 C 72.871094 94.578125 80.308594 94.578125 80.308594 99.535156 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 83 87.332031 C 83 92.292969 75.558594 92.292969 75.558594 87.332031 C 75.558594 82.371094 83 82.371094 83 87.332031 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 85.6875 75.128906 C 85.6875 80.085938 78.246094 80.085938 78.246094 75.128906 C 78.246094 70.167969 85.6875 70.167969 85.6875 75.128906 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 88.375 62.921875 C 88.375 67.882812 80.933594 67.882812 80.933594 62.921875 C 80.933594 57.960938 88.375 57.960938 88.375 62.921875 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 91.066406 50.71875 C 91.066406 55.679688 83.625 55.679688 83.625 50.71875 C 83.625 45.757812 91.066406 45.757812 91.066406 50.71875 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 93.753906 38.511719 C 93.753906 43.472656 86.3125 43.472656 86.3125 38.511719 C 86.3125 33.550781 93.753906 33.550781 93.753906 38.511719 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 96.441406 26.308594 C 96.441406 31.269531 89 31.269531 89 26.308594 C 89 21.347656 96.441406 21.347656 96.441406 26.308594 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 99.132812 21.882812 C 99.132812 26.84375 91.691406 26.84375 91.691406 21.882812 C 91.691406 16.921875 99.132812 16.921875 99.132812 21.882812 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 101.820312 27.984375 C 101.820312 32.945312 94.378906 32.945312 94.378906 27.984375 C 94.378906 23.023438 101.820312 23.023438 101.820312 27.984375 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 104.507812 34.089844 C 104.507812 39.046875 97.066406 39.046875 97.066406 34.089844 C 97.066406 29.128906 104.507812 29.128906 104.507812 34.089844 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 107.195312 40.191406 C 107.195312 45.152344 99.757812 45.152344 99.757812 40.191406 C 99.757812 35.230469 107.195312 35.230469 107.195312 40.191406 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 109.886719 46.292969 C 109.886719 51.253906 102.445312 51.253906 102.445312 46.292969 C 102.445312 41.332031 109.886719 41.332031 109.886719 46.292969 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 112.574219 52.394531 C 112.574219 57.355469 105.132812 57.355469 105.132812 52.394531 C 105.132812 47.433594 112.574219 47.433594 112.574219 52.394531 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 115.261719 58.496094 C 115.261719 63.457031 107.820312 63.457031 107.820312 58.496094 C 107.820312 53.539062 115.261719 53.539062 115.261719 58.496094 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 117.953125 64.601562 C 117.953125 69.5625 110.511719 69.5625 110.511719 64.601562 C 110.511719 59.640625 117.953125 59.640625 117.953125 64.601562 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 120.640625 70.703125 C 120.640625 75.664062 113.199219 75.664062 113.199219 70.703125 C 113.199219 65.742188 120.640625 65.742188 120.640625 70.703125 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 123.328125 76.804688 C 123.328125 81.765625 115.886719 81.765625 115.886719 76.804688 C 115.886719 71.84375 123.328125 71.84375 123.328125 76.804688 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 126.019531 82.90625 C 126.019531 87.867188 118.578125 87.867188 118.578125 82.90625 C 118.578125 77.945312 126.019531 77.945312 126.019531 82.90625 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 128.707031 89.011719 C 128.707031 93.972656 121.265625 93.972656 121.265625 89.011719 C 121.265625 84.050781 128.707031 84.050781 128.707031 89.011719 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 131.394531 95.113281 C 131.394531 100.074219 123.953125 100.074219 123.953125 95.113281 C 123.953125 90.152344 131.394531 90.152344 131.394531 95.113281 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 134.082031 89.621094 C 134.082031 94.582031 126.644531 94.582031 126.644531 89.621094 C 126.644531 84.660156 134.082031 84.660156 134.082031 89.621094 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 136.773438 83.519531 C 136.773438 88.480469 129.332031 88.480469 129.332031 83.519531 C 129.332031 78.558594 136.773438 78.558594 136.773438 83.519531 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 139.460938 77.414062 C 139.460938 82.375 132.019531 82.375 132.019531 77.414062 C 132.019531 72.453125 139.460938 72.453125 139.460938 77.414062 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 142.148438 71.3125 C 142.148438 76.273438 134.707031 76.273438 134.707031 71.3125 C 134.707031 66.351562 142.148438 66.351562 142.148438 71.3125 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 144.839844 65.210938 C 144.839844 70.171875 137.398438 70.171875 137.398438 65.210938 C 137.398438 60.25 144.839844 60.25 144.839844 65.210938 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 147.527344 59.109375 C 147.527344 64.070312 140.085938 64.070312 140.085938 59.109375 C 140.085938 54.148438 147.527344 54.148438 147.527344 59.109375 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 150.214844 53.003906 C 150.214844 57.964844 142.773438 57.964844 142.773438 53.003906 C 142.773438 48.046875 150.214844 48.046875 150.214844 53.003906 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 152.90625 46.902344 C 152.90625 51.863281 145.464844 51.863281 145.464844 46.902344 C 145.464844 41.941406 152.90625 41.941406 152.90625 46.902344 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 155.59375 40.800781 C 155.59375 45.761719 148.152344 45.761719 148.152344 40.800781 C 148.152344 35.839844 155.59375 35.839844 155.59375 40.800781 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 158.28125 34.699219 C 158.28125 39.660156 150.839844 39.660156 150.839844 34.699219 C 150.839844 29.738281 158.28125 29.738281 158.28125 34.699219 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 160.96875 28.597656 C 160.96875 33.554688 153.53125 33.554688 153.53125 28.597656 C 153.53125 23.636719 160.96875 23.636719 160.96875 28.597656 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 163.660156 22.492188 C 163.660156 27.453125 156.21875 27.453125 156.21875 22.492188 C 156.21875 17.53125 163.660156 17.53125 163.660156 22.492188 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 166.347656 25.085938 C 166.347656 30.046875 158.90625 30.046875 158.90625 25.085938 C 158.90625 20.125 166.347656 20.125 166.347656 25.085938 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 169.035156 37.292969 C 169.035156 42.253906 161.597656 42.253906 161.597656 37.292969 C 161.597656 32.332031 169.035156 32.332031 169.035156 37.292969 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 171.726562 49.496094 C 171.726562 54.457031 164.285156 54.457031 164.285156 49.496094 C 164.285156 44.535156 171.726562 44.535156 171.726562 49.496094 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 174.414062 61.703125 C 174.414062 66.664062 166.972656 66.664062 166.972656 61.703125 C 166.972656 56.742188 174.414062 56.742188 174.414062 61.703125 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 177.101562 73.90625 C 177.101562 78.867188 169.660156 78.867188 169.660156 73.90625 C 169.660156 68.945312 177.101562 68.945312 177.101562 73.90625 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 179.792969 86.113281 C 179.792969 91.070312 172.351562 91.070312 172.351562 86.113281 C 172.351562 81.152344 179.792969 81.152344 179.792969 86.113281 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 182.480469 98.316406 C 182.480469 103.277344 175.039062 103.277344 175.039062 98.316406 C 175.039062 93.355469 182.480469 93.355469 182.480469 98.316406 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 185.167969 110.519531 C 185.167969 115.480469 177.726562 115.480469 177.726562 110.519531 C 177.726562 105.5625 185.167969 105.5625 185.167969 110.519531 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 187.859375 122.726562 C 187.859375 127.6875 180.417969 127.6875 180.417969 122.726562 C 180.417969 117.765625 187.859375 117.765625 187.859375 122.726562 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 190.546875 134.929688 C 190.546875 139.890625 183.105469 139.890625 183.105469 134.929688 C 183.105469 129.96875 190.546875 129.96875 190.546875 134.929688 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 193.234375 147.136719 C 193.234375 152.097656 185.792969 152.097656 185.792969 147.136719 C 185.792969 142.175781 193.234375 142.175781 193.234375 147.136719 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 195.921875 159.339844 C 195.921875 164.300781 188.484375 164.300781 188.484375 159.339844 C 188.484375 154.378906 195.921875 154.378906 195.921875 159.339844 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 198.613281 171.546875 C 198.613281 176.507812 191.171875 176.507812 191.171875 171.546875 C 191.171875 166.585938 198.613281 166.585938 198.613281 171.546875 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="174.984375"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="174.984375"/>
+ <use xlink:href="#glyph0-1" x="36.25885" y="174.984375"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="174.984375"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="136.917969"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="136.917969"/>
+ <use xlink:href="#glyph0-3" x="36.25885" y="136.917969"/>
+ <use xlink:href="#glyph0-4" x="41.594437" y="136.917969"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="98.855469"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="98.855469"/>
+ <use xlink:href="#glyph0-4" x="36.25885" y="98.855469"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="98.855469"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="60.792969"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="60.792969"/>
+ <use xlink:href="#glyph0-5" x="36.25885" y="60.792969"/>
+ <use xlink:href="#glyph0-4" x="41.594437" y="60.792969"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="28.257812" y="22.726562"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="22.726562"/>
+ <use xlink:href="#glyph0-1" x="36.25885" y="22.726562"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="22.726562"/>
+</g>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 171.546875 L 54.019531 171.546875 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 133.480469 L 54.019531 133.480469 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 95.417969 L 54.019531 95.417969 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 57.355469 L 54.019531 57.355469 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 19.289062 L 54.019531 19.289062 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 183.28125 L 60.726562 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 94.269531 183.28125 L 94.269531 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 127.808594 183.28125 L 127.808594 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 161.351562 183.28125 L 161.351562 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.890625 183.28125 L 194.890625 179.027344 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="51.390625" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="56.726212" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="59.391663" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="64.727249" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="84.933594" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="90.26918" y="192.992188"/>
+ <use xlink:href="#glyph0-3" x="92.934631" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="98.270218" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="118.472656" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="123.808243" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="126.473694" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="131.80928" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="152.015625" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="157.351212" y="192.992188"/>
+ <use xlink:href="#glyph0-5" x="160.016663" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="165.352249" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="185.554688" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="190.890274" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="193.555725" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="198.891312" y="192.992188"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-1" x="124.808594" y="205.199219"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph2-1" x="21.660156" y="108.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-1" x="21.660156" y="101.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph4-1" x="21.660156" y="96.214844"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-2" x="21.660156" y="90.214844"/>
+</g>
+</g>
+</svg>
diff --git a/documentation/ui/figure/gaussian.svg b/documentation/ui/figure/gaussian.svg
new file mode 100644
index 0000000..3eddc70
--- /dev/null
+++ b/documentation/ui/figure/gaussian.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="216pt" height="216pt" viewBox="0 0 216 216" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 0.3125 0 L 0.3125 -6.875 L 5.765625 -6.875 L 5.765625 0 Z M 4.90625 -0.859375 L 4.90625 -6.015625 L 1.171875 -6.015625 L 1.171875 -0.859375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 2.59375 -6.703125 C 3.457031 -6.703125 4.085938 -6.347656 4.484375 -5.640625 C 4.773438 -5.085938 4.921875 -4.328125 4.921875 -3.359375 C 4.921875 -2.453125 4.785156 -1.695312 4.515625 -1.09375 C 4.128906 -0.238281 3.488281 0.1875 2.59375 0.1875 C 1.78125 0.1875 1.179688 -0.160156 0.796875 -0.859375 C 0.460938 -1.453125 0.296875 -2.238281 0.296875 -3.21875 C 0.296875 -3.976562 0.394531 -4.632812 0.59375 -5.1875 C 0.957031 -6.195312 1.625 -6.703125 2.59375 -6.703125 Z M 2.578125 -0.578125 C 3.015625 -0.578125 3.363281 -0.769531 3.625 -1.15625 C 3.882812 -1.550781 4.015625 -2.273438 4.015625 -3.328125 C 4.015625 -4.085938 3.921875 -4.710938 3.734375 -5.203125 C 3.546875 -5.703125 3.179688 -5.953125 2.640625 -5.953125 C 2.148438 -5.953125 1.789062 -5.71875 1.5625 -5.25 C 1.332031 -4.78125 1.21875 -4.09375 1.21875 -3.1875 C 1.21875 -2.5 1.289062 -1.945312 1.4375 -1.53125 C 1.65625 -0.894531 2.035156 -0.578125 2.578125 -0.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 0.8125 -1.015625 L 1.796875 -1.015625 L 1.796875 0 L 0.8125 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 0.296875 0 C 0.328125 -0.570312 0.445312 -1.070312 0.65625 -1.5 C 0.863281 -1.9375 1.269531 -2.328125 1.875 -2.671875 L 2.765625 -3.1875 C 3.171875 -3.425781 3.457031 -3.628906 3.625 -3.796875 C 3.875 -4.054688 4 -4.351562 4 -4.6875 C 4 -5.070312 3.878906 -5.378906 3.640625 -5.609375 C 3.410156 -5.835938 3.101562 -5.953125 2.71875 -5.953125 C 2.132812 -5.953125 1.734375 -5.734375 1.515625 -5.296875 C 1.398438 -5.066406 1.335938 -4.742188 1.328125 -4.328125 L 0.46875 -4.328125 C 0.476562 -4.910156 0.582031 -5.382812 0.78125 -5.75 C 1.144531 -6.40625 1.789062 -6.734375 2.71875 -6.734375 C 3.488281 -6.734375 4.050781 -6.523438 4.40625 -6.109375 C 4.757812 -5.691406 4.9375 -5.226562 4.9375 -4.71875 C 4.9375 -4.1875 4.75 -3.726562 4.375 -3.34375 C 4.15625 -3.125 3.757812 -2.851562 3.1875 -2.53125 L 2.546875 -2.1875 C 2.242188 -2.019531 2.003906 -1.859375 1.828125 -1.703125 C 1.515625 -1.429688 1.316406 -1.128906 1.234375 -0.796875 L 4.90625 -0.796875 L 4.90625 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 1.1875 -1.703125 C 1.238281 -1.222656 1.460938 -0.894531 1.859375 -0.71875 C 2.054688 -0.625 2.285156 -0.578125 2.546875 -0.578125 C 3.046875 -0.578125 3.414062 -0.734375 3.65625 -1.046875 C 3.894531 -1.367188 4.015625 -1.722656 4.015625 -2.109375 C 4.015625 -2.578125 3.867188 -2.9375 3.578125 -3.1875 C 3.296875 -3.445312 2.957031 -3.578125 2.5625 -3.578125 C 2.269531 -3.578125 2.019531 -3.519531 1.8125 -3.40625 C 1.601562 -3.289062 1.425781 -3.132812 1.28125 -2.9375 L 0.546875 -2.984375 L 1.0625 -6.59375 L 4.546875 -6.59375 L 4.546875 -5.78125 L 1.703125 -5.78125 L 1.40625 -3.921875 C 1.5625 -4.035156 1.710938 -4.125 1.859375 -4.1875 C 2.109375 -4.289062 2.394531 -4.34375 2.71875 -4.34375 C 3.332031 -4.34375 3.851562 -4.140625 4.28125 -3.734375 C 4.707031 -3.335938 4.921875 -2.835938 4.921875 -2.234375 C 4.921875 -1.597656 4.722656 -1.035156 4.328125 -0.546875 C 3.941406 -0.0664062 3.320312 0.171875 2.46875 0.171875 C 1.914062 0.171875 1.429688 0.0195312 1.015625 -0.28125 C 0.597656 -0.59375 0.363281 -1.066406 0.3125 -1.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 5.015625 -6.59375 L 5.015625 -5.859375 C 4.796875 -5.648438 4.507812 -5.285156 4.15625 -4.765625 C 3.800781 -4.242188 3.484375 -3.6875 3.203125 -3.09375 C 2.929688 -2.507812 2.726562 -1.976562 2.59375 -1.5 C 2.5 -1.1875 2.378906 -0.6875 2.234375 0 L 1.3125 0 C 1.519531 -1.28125 1.988281 -2.554688 2.71875 -3.828125 C 3.144531 -4.566406 3.59375 -5.207031 4.0625 -5.75 L 0.34375 -5.75 L 0.34375 -6.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 0.921875 -4.75 L 0.921875 -5.390625 C 1.523438 -5.453125 1.945312 -5.550781 2.1875 -5.6875 C 2.425781 -5.832031 2.609375 -6.164062 2.734375 -6.6875 L 3.390625 -6.6875 L 3.390625 0 L 2.5 0 L 2.5 -4.75 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-0">
+<path style="stroke:none;" d="M 0.390625 0 L 0.390625 -8.609375 L 7.21875 -8.609375 L 7.21875 0 Z M 6.140625 -1.078125 L 6.140625 -7.53125 L 1.46875 -7.53125 L 1.46875 -1.078125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-1">
+<path style="stroke:none;" d="M 0.171875 -6.28125 L 1.546875 -6.28125 L 2.984375 -4.0625 L 4.4375 -6.28125 L 5.71875 -6.25 L 3.609375 -3.21875 L 5.8125 0 L 4.46875 0 L 2.90625 -2.359375 L 1.40625 0 L 0.0625 0 L 2.28125 -3.21875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-0">
+<path style="stroke:none;" d="M 2.125 -0.59375 L -8.46875 -0.59375 L -8.46875 -6.59375 L 2.125 -6.59375 Z M 1.453125 -1.265625 L 1.453125 -5.9375 L -7.78125 -5.9375 L -7.78125 -1.265625 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-1">
+<path style="stroke:none;" d="M -1.828125 -2 C -1.265625 -2 -0.882812 -2.050781 -0.6875 -2.15625 C -0.5 -2.269531 -0.40625 -2.472656 -0.40625 -2.765625 C -0.40625 -3.222656 -0.726562 -3.601562 -1.375 -3.90625 C -2.019531 -4.207031 -2.835938 -4.359375 -3.828125 -4.359375 L -5.390625 -4.359375 L -5.390625 -5.46875 L -1.453125 -5.46875 C -1.097656 -5.46875 -0.832031 -5.503906 -0.65625 -5.578125 C -0.488281 -5.648438 -0.40625 -5.765625 -0.40625 -5.921875 C -0.40625 -6.085938 -0.488281 -6.210938 -0.65625 -6.296875 C -0.820312 -6.390625 -1.066406 -6.4375 -1.390625 -6.4375 L -1.5625 -6.4375 L -1.5625 -6.6875 C -1.53125 -6.6875 -1.492188 -6.6875 -1.453125 -6.6875 C -1.421875 -6.695312 -1.367188 -6.703125 -1.296875 -6.703125 C -0.847656 -6.703125 -0.5 -6.601562 -0.25 -6.40625 C -0.0078125 -6.21875 0.109375 -5.953125 0.109375 -5.609375 C 0.109375 -5.210938 -0.0625 -4.910156 -0.40625 -4.703125 C -0.75 -4.503906 -1.265625 -4.398438 -1.953125 -4.390625 C -1.242188 -4.210938 -0.722656 -3.96875 -0.390625 -3.65625 C -0.0546875 -3.351562 0.109375 -2.96875 0.109375 -2.5 C 0.109375 -2.144531 0.00390625 -1.851562 -0.203125 -1.625 C -0.410156 -1.394531 -0.71875 -1.234375 -1.125 -1.140625 C -1.050781 -1.128906 -0.941406 -1.125 -0.796875 -1.125 C -0.285156 -1.125 0.273438 -1.253906 0.890625 -1.515625 C 1.515625 -1.773438 1.882812 -1.90625 2 -1.90625 C 2.15625 -1.90625 2.28125 -1.859375 2.375 -1.765625 C 2.46875 -1.671875 2.515625 -1.546875 2.515625 -1.390625 C 2.515625 -1.210938 2.445312 -1.082031 2.3125 -1 C 2.175781 -0.914062 1.960938 -0.875 1.671875 -0.875 C 1.597656 -0.875 1.363281 -0.878906 0.96875 -0.890625 C 0.582031 -0.910156 0.226562 -0.921875 -0.09375 -0.921875 C -0.382812 -0.921875 -0.789062 -0.914062 -1.3125 -0.90625 C -1.832031 -0.894531 -2.210938 -0.890625 -2.453125 -0.890625 L -5.390625 -0.890625 L -5.390625 -2 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-0">
+<path style="stroke:none;" d="M 2.65625 -0.75 L -10.578125 -0.75 L -10.578125 -8.25 L 2.65625 -8.25 Z M 1.8125 -1.59375 L 1.8125 -7.40625 L -9.734375 -7.40625 L -9.734375 -1.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-1">
+<path style="stroke:none;" d="M -10.546875 -4.296875 C -9.796875 -3.460938 -8.925781 -2.867188 -7.9375 -2.515625 C -6.945312 -2.171875 -5.617188 -2 -3.953125 -2 C -2.273438 -2 -0.945312 -2.171875 0.03125 -2.515625 C 1.019531 -2.867188 1.890625 -3.460938 2.640625 -4.296875 L 2.953125 -3.984375 C 2.191406 -2.953125 1.203125 -2.144531 -0.015625 -1.5625 C -1.234375 -0.976562 -2.546875 -0.6875 -3.953125 -0.6875 C -5.359375 -0.6875 -6.671875 -0.976562 -7.890625 -1.5625 C -9.117188 -2.15625 -10.109375 -2.960938 -10.859375 -3.984375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-2">
+<path style="stroke:none;" d="M -10.546875 -0.703125 L -10.859375 -0.984375 C -10.109375 -2.023438 -9.117188 -2.835938 -7.890625 -3.421875 C -6.660156 -4.015625 -5.347656 -4.3125 -3.953125 -4.3125 C -2.546875 -4.3125 -1.234375 -4.015625 -0.015625 -3.421875 C 1.203125 -2.835938 2.191406 -2.023438 2.953125 -0.984375 L 2.640625 -0.703125 C 1.898438 -1.535156 1.035156 -2.125 0.046875 -2.46875 C -0.929688 -2.820312 -2.265625 -3 -3.953125 -3 C -5.628906 -3 -6.957031 -2.820312 -7.9375 -2.46875 C -8.925781 -2.125 -9.796875 -1.535156 -10.546875 -0.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-0">
+<path style="stroke:none;" d="M 0 -0.390625 L -8.609375 -0.390625 L -8.609375 -7.21875 L 0 -7.21875 Z M -1.078125 -6.140625 L -7.53125 -6.140625 L -7.53125 -1.46875 L -1.078125 -1.46875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-1">
+<path style="stroke:none;" d="M -6.28125 -0.171875 L -6.28125 -1.546875 L -4.0625 -2.984375 L -6.28125 -4.4375 L -6.25 -5.71875 L -3.21875 -3.609375 L 0 -5.8125 L 0 -4.46875 L -2.359375 -2.90625 L 0 -1.40625 L 0 -0.0625 L -3.21875 -2.28125 Z "/>
+</symbol>
+</g>
+<clipPath id="clip1">
+ <path d="M 54.019531 14.398438 L 202 14.398438 L 202 180 L 54.019531 180 Z "/>
+</clipPath>
+<clipPath id="clip2">
+ <path d="M 54.019531 158 L 202 158 L 202 160 L 54.019531 160 Z "/>
+</clipPath>
+<clipPath id="clip3">
+ <path d="M 54.019531 119 L 202 119 L 202 120 L 54.019531 120 Z "/>
+</clipPath>
+<clipPath id="clip4">
+ <path d="M 54.019531 80 L 202 80 L 202 81 L 54.019531 81 Z "/>
+</clipPath>
+<clipPath id="clip5">
+ <path d="M 54.019531 41 L 202 41 L 202 42 L 54.019531 42 Z "/>
+</clipPath>
+<clipPath id="clip6">
+ <path d="M 77 14.398438 L 78 14.398438 L 78 180 L 77 180 Z "/>
+</clipPath>
+<clipPath id="clip7">
+ <path d="M 110 14.398438 L 112 14.398438 L 112 180 L 110 180 Z "/>
+</clipPath>
+<clipPath id="clip8">
+ <path d="M 144 14.398438 L 145 14.398438 L 145 180 L 144 180 Z "/>
+</clipPath>
+<clipPath id="clip9">
+ <path d="M 177 14.398438 L 179 14.398438 L 179 180 L 177 180 Z "/>
+</clipPath>
+<clipPath id="clip10">
+ <path d="M 54.019531 177 L 202.601562 177 L 202.601562 179 L 54.019531 179 Z "/>
+</clipPath>
+<clipPath id="clip11">
+ <path d="M 54.019531 138 L 202.601562 138 L 202.601562 140 L 54.019531 140 Z "/>
+</clipPath>
+<clipPath id="clip12">
+ <path d="M 54.019531 99 L 202.601562 99 L 202.601562 101 L 54.019531 101 Z "/>
+</clipPath>
+<clipPath id="clip13">
+ <path d="M 54.019531 60 L 202.601562 60 L 202.601562 62 L 54.019531 62 Z "/>
+</clipPath>
+<clipPath id="clip14">
+ <path d="M 54.019531 21 L 202.601562 21 L 202.601562 23 L 54.019531 23 Z "/>
+</clipPath>
+<clipPath id="clip15">
+ <path d="M 60 14.398438 L 62 14.398438 L 62 180 L 60 180 Z "/>
+</clipPath>
+<clipPath id="clip16">
+ <path d="M 93 14.398438 L 95 14.398438 L 95 180 L 93 180 Z "/>
+</clipPath>
+<clipPath id="clip17">
+ <path d="M 127 14.398438 L 129 14.398438 L 129 180 L 127 180 Z "/>
+</clipPath>
+<clipPath id="clip18">
+ <path d="M 160 14.398438 L 162 14.398438 L 162 180 L 160 180 Z "/>
+</clipPath>
+<clipPath id="clip19">
+ <path d="M 194 14.398438 L 196 14.398438 L 196 180 L 194 180 Z "/>
+</clipPath>
+</defs>
+<g id="surface206">
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 216 L 216 216 L 216 0 L 0 0 Z "/>
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(89.803922%,89.803922%,89.803922%);fill-opacity:1;" d="M 54.019531 179.027344 L 201.601562 179.027344 L 201.601562 14.398438 L 54.019531 14.398438 Z "/>
+</g>
+<g clip-path="url(#clip2)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 158.855469 L 201.601562 158.855469 "/>
+</g>
+<g clip-path="url(#clip3)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 119.71875 L 201.601562 119.71875 "/>
+</g>
+<g clip-path="url(#clip4)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 80.585938 L 201.601562 80.585938 "/>
+</g>
+<g clip-path="url(#clip5)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 41.449219 L 201.601562 41.449219 "/>
+</g>
+<g clip-path="url(#clip6)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 77.496094 179.027344 L 77.496094 14.398438 "/>
+</g>
+<g clip-path="url(#clip7)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 111.039062 179.027344 L 111.039062 14.398438 "/>
+</g>
+<g clip-path="url(#clip8)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 144.578125 179.027344 L 144.578125 14.398438 "/>
+</g>
+<g clip-path="url(#clip9)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 178.121094 179.027344 L 178.121094 14.398438 "/>
+</g>
+<g clip-path="url(#clip10)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 178.425781 L 201.601562 178.425781 "/>
+</g>
+<g clip-path="url(#clip11)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 139.289062 L 201.601562 139.289062 "/>
+</g>
+<g clip-path="url(#clip12)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 100.152344 L 201.601562 100.152344 "/>
+</g>
+<g clip-path="url(#clip13)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 61.015625 L 201.601562 61.015625 "/>
+</g>
+<g clip-path="url(#clip14)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 21.882812 L 201.601562 21.882812 "/>
+</g>
+<g clip-path="url(#clip15)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 179.027344 L 60.726562 14.398438 "/>
+</g>
+<g clip-path="url(#clip16)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 94.269531 179.027344 L 94.269531 14.398438 "/>
+</g>
+<g clip-path="url(#clip17)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 127.808594 179.027344 L 127.808594 14.398438 "/>
+</g>
+<g clip-path="url(#clip18)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 161.351562 179.027344 L 161.351562 14.398438 "/>
+</g>
+<g clip-path="url(#clip19)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.890625 179.027344 L 194.890625 14.398438 "/>
+</g>
+<path style="fill:none;stroke-width:7.440945;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:1;" d="M 60.726562 171.546875 L 61.265625 171.195312 L 61.53125 171.011719 L 61.800781 170.828125 L 62.339844 170.445312 L 62.878906 170.046875 L 63.144531 169.839844 L 63.414062 169.632812 L 63.683594 169.417969 L 64.222656 168.980469 L 64.492188 168.753906 L 64.757812 168.519531 L 65.027344 168.285156 L 65.296875 168.046875 L 65.566406 167.800781 L 65.835938 167.550781 L 66.105469 167.296875 L 66.371094 167.039062 L 66.640625 166.777344 L 66.910156 166.507812 L 67.179688 166.234375 L 67.449219 165.957031 L 67.71875 165.671875 L 67.984375 165.382812 L 68.253906 165.089844 L 68.523438 164.789062 L 68.792969 164.484375 L 69.0625 164.175781 L 69.332031 163.859375 L 69.597656 163.539062 L 69.867188 163.214844 L 70.136719 162.882812 L 70.40625 162.542969 L 70.675781 162.199219 L 70.945312 161.851562 L 71.210938 161.496094 L 71.480469 161.136719 L 71.75 160.769531 L 72.019531 160.398438 L 72.289062 160.019531 L 72.558594 159.632812 L 72.824219 159.242188 L 73.09375 158.847656 L 73.632812 158.035156 L 73.902344 157.617188 L 74.167969 157.195312 L 74.4375 156.765625 L 74.707031 156.332031 L 74.976562 155.890625 L 75.246094 155.441406 L 75.515625 154.988281 L 75.78125 154.527344 L 76.050781 154.058594 L 76.320312 153.585938 L 76.589844 153.105469 L 76.859375 152.617188 L 77.128906 152.125 L 77.394531 151.621094 L 77.664062 151.113281 L 77.933594 150.597656 L 78.203125 150.078125 L 78.472656 149.550781 L 78.742188 149.015625 L 79.007812 148.472656 L 79.277344 147.921875 L 79.546875 147.367188 L 79.816406 146.804688 L 80.085938 146.234375 L 80.355469 145.65625 L 80.621094 145.070312 L 80.890625 144.480469 L 81.160156 143.882812 L 81.429688 143.277344 L 81.699219 142.664062 L 81.96875 142.046875 L 82.234375 141.417969 L 82.503906 140.785156 L 82.773438 140.144531 L 83.042969 139.5 L 83.3125 138.84375 L 83.582031 138.183594 L 83.847656 137.515625 L 84.117188 136.839844 L 84.386719 136.15625 L 84.65625 135.46875 L 84.925781 134.773438 L 85.195312 134.070312 L 85.460938 133.363281 L 85.730469 132.644531 L 86 131.921875 L 86.269531 131.195312 L 86.539062 130.457031 L 86.808594 129.714844 L 87.074219 128.964844 L 87.34375 128.210938 L 87.613281 127.449219 L 87.882812 126.679688 L 88.152344 125.90625 L 88.417969 125.125 L 88.6875 124.339844 L 88.957031 123.546875 L 89.226562 122.746094 L 89.496094 121.941406 L 89.765625 121.128906 L 90.03125 120.3125 L 90.300781 119.488281 L 90.570312 118.660156 L 90.839844 117.828125 L 91.109375 116.988281 L 91.378906 116.144531 L 91.644531 115.292969 L 91.914062 114.4375 L 92.183594 113.578125 L 92.453125 112.714844 L 92.722656 111.84375 L 92.992188 110.96875 L 93.257812 110.089844 L 93.527344 109.207031 L 94.066406 107.425781 L 94.605469 105.628906 L 94.871094 104.722656 L 95.140625 103.816406 L 95.679688 101.988281 L 95.949219 101.070312 L 96.21875 100.148438 L 96.484375 99.222656 L 97.023438 97.363281 L 97.5625 95.496094 L 97.832031 94.558594 L 98.097656 93.617188 L 98.636719 91.734375 L 98.90625 90.789062 L 99.175781 89.839844 L 99.445312 88.894531 L 99.710938 87.945312 L 99.980469 86.996094 L 100.25 86.042969 L 100.519531 85.09375 L 100.789062 84.140625 L 101.058594 83.191406 L 101.324219 82.238281 L 101.59375 81.289062 L 101.863281 80.335938 L 102.402344 78.4375 L 102.667969 77.492188 L 102.9375 76.542969 L 103.476562 74.652344 L 103.746094 73.710938 L 104.015625 72.773438 L 104.28125 71.835938 L 104.550781 70.898438 L 105.359375 68.109375 L 105.628906 67.1875 L 105.894531 66.269531 L 106.164062 65.351562 L 106.433594 64.441406 L 106.972656 62.628906 L 107.242188 61.730469 L 107.507812 60.835938 L 107.777344 59.949219 L 108.046875 59.066406 L 108.316406 58.1875 L 108.585938 57.316406 L 108.855469 56.449219 L 109.121094 55.589844 L 109.390625 54.734375 L 109.660156 53.886719 L 109.929688 53.046875 L 110.199219 52.210938 L 110.46875 51.386719 L 110.734375 50.566406 L 111.003906 49.757812 L 111.273438 48.953125 L 111.542969 48.15625 L 111.8125 47.371094 L 112.082031 46.589844 L 112.347656 45.820312 L 112.617188 45.0625 L 112.886719 44.308594 L 113.15625 43.566406 L 113.425781 42.832031 L 113.695312 42.109375 L 113.960938 41.394531 L 114.230469 40.691406 L 114.5 40 L 114.769531 39.316406 L 115.039062 38.644531 L 115.308594 37.984375 L 115.574219 37.332031 L 115.84375 36.695312 L 116.113281 36.066406 L 116.382812 35.449219 L 116.652344 34.847656 L 116.921875 34.253906 L 117.1875 33.675781 L 117.457031 33.105469 L 117.726562 32.550781 L 117.996094 32.007812 L 118.265625 31.476562 L 118.53125 30.960938 L 118.800781 30.457031 L 119.070312 29.964844 L 119.339844 29.488281 L 119.609375 29.023438 L 119.878906 28.574219 L 120.144531 28.136719 L 120.414062 27.710938 L 120.683594 27.304688 L 120.953125 26.910156 L 121.222656 26.527344 L 121.492188 26.160156 L 121.757812 25.808594 L 122.027344 25.472656 L 122.296875 25.148438 L 122.566406 24.839844 L 122.835938 24.546875 L 123.105469 24.269531 L 123.371094 24.007812 L 123.640625 23.757812 L 123.910156 23.523438 L 124.179688 23.308594 L 124.449219 23.105469 L 124.71875 22.917969 L 124.984375 22.746094 L 125.253906 22.589844 L 125.523438 22.449219 L 125.792969 22.324219 L 126.0625 22.210938 L 126.332031 22.117188 L 126.597656 22.039062 L 126.867188 21.976562 L 127.136719 21.929688 L 127.40625 21.898438 L 127.675781 21.882812 L 127.945312 21.882812 L 128.210938 21.898438 L 128.480469 21.929688 L 128.75 21.976562 L 129.019531 22.039062 L 129.289062 22.117188 L 129.558594 22.210938 L 129.824219 22.324219 L 130.09375 22.449219 L 130.363281 22.589844 L 130.632812 22.746094 L 130.902344 22.917969 L 131.171875 23.105469 L 131.4375 23.308594 L 131.707031 23.523438 L 131.976562 23.757812 L 132.246094 24.007812 L 132.515625 24.269531 L 132.78125 24.546875 L 133.050781 24.839844 L 133.320312 25.148438 L 133.589844 25.472656 L 133.859375 25.808594 L 134.128906 26.160156 L 134.394531 26.527344 L 134.664062 26.910156 L 134.933594 27.304688 L 135.203125 27.710938 L 135.472656 28.136719 L 135.742188 28.574219 L 136.007812 29.023438 L 136.277344 29.488281 L 136.546875 29.964844 L 136.816406 30.457031 L 137.085938 30.960938 L 137.355469 31.476562 L 137.621094 32.007812 L 137.890625 32.550781 L 138.160156 33.105469 L 138.429688 33.675781 L 138.699219 34.253906 L 138.96875 34.847656 L 139.234375 35.449219 L 139.503906 36.066406 L 139.773438 36.695312 L 140.042969 37.332031 L 140.3125 37.984375 L 140.582031 38.644531 L 140.847656 39.316406 L 141.117188 40 L 141.386719 40.691406 L 141.65625 41.394531 L 141.925781 42.109375 L 142.195312 42.832031 L 142.460938 43.566406 L 142.730469 44.308594 L 143 45.0625 L 143.269531 45.820312 L 143.539062 46.589844 L 143.808594 47.371094 L 144.074219 48.15625 L 144.34375 48.953125 L 144.613281 49.757812 L 144.882812 50.566406 L 145.152344 51.386719 L 145.421875 52.210938 L 145.6875 53.046875 L 145.957031 53.886719 L 146.226562 54.734375 L 146.496094 55.589844 L 146.765625 56.449219 L 147.03125 57.316406 L 147.300781 58.1875 L 147.570312 59.066406 L 147.839844 59.949219 L 148.109375 60.835938 L 148.378906 61.730469 L 148.644531 62.628906 L 149.183594 64.441406 L 149.453125 65.351562 L 149.992188 67.1875 L 150.257812 68.109375 L 151.066406 70.898438 L 151.605469 72.773438 L 151.871094 73.710938 L 152.140625 74.652344 L 152.679688 76.542969 L 152.949219 77.492188 L 153.21875 78.4375 L 153.484375 79.386719 L 153.753906 80.335938 L 154.023438 81.289062 L 154.292969 82.238281 L 154.5625 83.191406 L 154.832031 84.140625 L 155.097656 85.09375 L 155.367188 86.042969 L 155.636719 86.996094 L 156.175781 88.894531 L 156.445312 89.839844 L 156.710938 90.789062 L 156.980469 91.734375 L 157.789062 94.558594 L 158.058594 95.496094 L 158.324219 96.429688 L 158.59375 97.363281 L 159.132812 99.222656 L 159.402344 100.148438 L 159.671875 101.070312 L 159.9375 101.988281 L 160.476562 103.816406 L 161.015625 105.628906 L 161.28125 106.527344 L 161.550781 107.425781 L 162.089844 109.207031 L 162.359375 110.089844 L 162.628906 110.96875 L 162.894531 111.84375 L 163.164062 112.714844 L 163.433594 113.578125 L 163.703125 114.4375 L 163.972656 115.292969 L 164.242188 116.144531 L 164.507812 116.988281 L 164.777344 117.828125 L 165.046875 118.660156 L 165.316406 119.488281 L 165.585938 120.3125 L 165.855469 121.128906 L 166.121094 121.941406 L 166.390625 122.746094 L 166.660156 123.546875 L 166.929688 124.339844 L 167.199219 125.125 L 167.46875 125.90625 L 167.734375 126.679688 L 168.003906 127.449219 L 168.273438 128.210938 L 168.542969 128.964844 L 168.8125 129.714844 L 169.082031 130.457031 L 169.347656 131.195312 L 169.617188 131.921875 L 169.886719 132.644531 L 170.15625 133.363281 L 170.425781 134.070312 L 170.695312 134.773438 L 170.960938 135.46875 L 171.230469 136.15625 L 171.5 136.839844 L 171.769531 137.515625 L 172.039062 138.183594 L 172.308594 138.84375 L 172.574219 139.5 L 172.84375 140.144531 L 173.113281 140.785156 L 173.382812 141.417969 L 173.652344 142.046875 L 173.921875 142.664062 L 174.1875 143.277344 L 174.457031 143.882812 L 174.726562 144.480469 L 174.996094 145.070312 L 175.265625 145.65625 L 175.535156 146.234375 L 175.800781 146.804688 L 176.070312 147.367188 L 176.339844 147.921875 L 176.609375 148.472656 L 176.878906 149.015625 L 177.144531 149.550781 L 177.414062 150.078125 L 177.683594 150.597656 L 177.953125 151.113281 L 178.222656 151.621094 L 178.492188 152.125 L 178.757812 152.617188 L 179.027344 153.105469 L 179.296875 153.585938 L 179.566406 154.058594 L 179.835938 154.527344 L 180.105469 154.988281 L 180.371094 155.441406 L 180.640625 155.890625 L 180.910156 156.332031 L 181.179688 156.765625 L 181.449219 157.195312 L 181.71875 157.617188 L 181.984375 158.035156 L 182.523438 158.847656 L 182.792969 159.242188 L 183.0625 159.632812 L 183.332031 160.019531 L 183.597656 160.398438 L 183.867188 160.769531 L 184.136719 161.136719 L 184.40625 161.496094 L 184.675781 161.851562 L 184.945312 162.199219 L 185.210938 162.542969 L 185.480469 162.882812 L 185.75 163.214844 L 186.019531 163.539062 L 186.289062 163.859375 L 186.558594 164.175781 L 186.824219 164.484375 L 187.09375 164.789062 L 187.363281 165.089844 L 187.632812 165.382812 L 187.902344 165.671875 L 188.171875 165.957031 L 188.4375 166.234375 L 188.707031 166.507812 L 188.976562 166.777344 L 189.246094 167.039062 L 189.515625 167.296875 L 189.785156 167.550781 L 190.050781 167.800781 L 190.320312 168.046875 L 190.589844 168.285156 L 191.128906 168.753906 L 191.394531 168.980469 L 191.933594 169.417969 L 192.203125 169.632812 L 192.742188 170.046875 L 193.007812 170.246094 L 193.277344 170.445312 L 193.816406 170.828125 L 194.355469 171.195312 L 194.621094 171.371094 L 194.890625 171.546875 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="181.863281"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="181.863281"/>
+ <use xlink:href="#glyph0-1" x="36.25885" y="181.863281"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="181.863281"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="142.726562"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="142.726562"/>
+ <use xlink:href="#glyph0-3" x="36.25885" y="142.726562"/>
+ <use xlink:href="#glyph0-4" x="41.594437" y="142.726562"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="103.589844"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="103.589844"/>
+ <use xlink:href="#glyph0-4" x="36.25885" y="103.589844"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="103.589844"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.257812" y="64.453125"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="64.453125"/>
+ <use xlink:href="#glyph0-5" x="36.25885" y="64.453125"/>
+ <use xlink:href="#glyph0-4" x="41.594437" y="64.453125"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="28.257812" y="25.320312"/>
+ <use xlink:href="#glyph0-2" x="33.593399" y="25.320312"/>
+ <use xlink:href="#glyph0-1" x="36.25885" y="25.320312"/>
+ <use xlink:href="#glyph0-1" x="41.594437" y="25.320312"/>
+</g>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 178.425781 L 54.019531 178.425781 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 139.289062 L 54.019531 139.289062 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 100.152344 L 54.019531 100.152344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 61.015625 L 54.019531 61.015625 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.765625 21.882812 L 54.019531 21.882812 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 183.28125 L 60.726562 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 94.269531 183.28125 L 94.269531 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 127.808594 183.28125 L 127.808594 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 161.351562 183.28125 L 161.351562 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.890625 183.28125 L 194.890625 179.027344 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="51.390625" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="56.726212" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="59.391663" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="64.727249" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="84.933594" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="90.26918" y="192.992188"/>
+ <use xlink:href="#glyph0-3" x="92.934631" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="98.270218" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="118.472656" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="123.808243" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="126.473694" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="131.80928" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="152.015625" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="157.351212" y="192.992188"/>
+ <use xlink:href="#glyph0-5" x="160.016663" y="192.992188"/>
+ <use xlink:href="#glyph0-4" x="165.352249" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="185.554688" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="190.890274" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="193.555725" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="198.891312" y="192.992188"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-1" x="124.808594" y="205.199219"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph2-1" x="21.660156" y="108.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-1" x="21.660156" y="101.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph4-1" x="21.660156" y="96.214844"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-2" x="21.660156" y="90.214844"/>
+</g>
+</g>
+</svg>
diff --git a/documentation/ui/figure/gaussianProduct.svg b/documentation/ui/figure/gaussianProduct.svg
new file mode 100644
index 0000000..0643bbd
--- /dev/null
+++ b/documentation/ui/figure/gaussianProduct.svg
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="216pt" height="216pt" viewBox="0 0 216 216" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 0.3125 0 L 0.3125 -6.875 L 5.765625 -6.875 L 5.765625 0 Z M 4.90625 -0.859375 L 4.90625 -6.015625 L 1.171875 -6.015625 L 1.171875 -0.859375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 2.59375 -6.703125 C 3.457031 -6.703125 4.085938 -6.347656 4.484375 -5.640625 C 4.773438 -5.085938 4.921875 -4.328125 4.921875 -3.359375 C 4.921875 -2.453125 4.785156 -1.695312 4.515625 -1.09375 C 4.128906 -0.238281 3.488281 0.1875 2.59375 0.1875 C 1.78125 0.1875 1.179688 -0.160156 0.796875 -0.859375 C 0.460938 -1.453125 0.296875 -2.238281 0.296875 -3.21875 C 0.296875 -3.976562 0.394531 -4.632812 0.59375 -5.1875 C 0.957031 -6.195312 1.625 -6.703125 2.59375 -6.703125 Z M 2.578125 -0.578125 C 3.015625 -0.578125 3.363281 -0.769531 3.625 -1.15625 C 3.882812 -1.550781 4.015625 -2.273438 4.015625 -3.328125 C 4.015625 -4.085938 3.921875 -4.710938 3.734375 -5.203125 C 3.546875 -5.703125 3.179688 -5.953125 2.640625 -5.953125 C 2.148438 -5.953125 1.789062 -5.71875 1.5625 -5.25 C 1.332031 -4.78125 1.21875 -4.09375 1.21875 -3.1875 C 1.21875 -2.5 1.289062 -1.945312 1.4375 -1.53125 C 1.65625 -0.894531 2.035156 -0.578125 2.578125 -0.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 0.8125 -1.015625 L 1.796875 -1.015625 L 1.796875 0 L 0.8125 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 0.296875 0 C 0.328125 -0.570312 0.445312 -1.070312 0.65625 -1.5 C 0.863281 -1.9375 1.269531 -2.328125 1.875 -2.671875 L 2.765625 -3.1875 C 3.171875 -3.425781 3.457031 -3.628906 3.625 -3.796875 C 3.875 -4.054688 4 -4.351562 4 -4.6875 C 4 -5.070312 3.878906 -5.378906 3.640625 -5.609375 C 3.410156 -5.835938 3.101562 -5.953125 2.71875 -5.953125 C 2.132812 -5.953125 1.734375 -5.734375 1.515625 -5.296875 C 1.398438 -5.066406 1.335938 -4.742188 1.328125 -4.328125 L 0.46875 -4.328125 C 0.476562 -4.910156 0.582031 -5.382812 0.78125 -5.75 C 1.144531 -6.40625 1.789062 -6.734375 2.71875 -6.734375 C 3.488281 -6.734375 4.050781 -6.523438 4.40625 -6.109375 C 4.757812 -5.691406 4.9375 -5.226562 4.9375 -4.71875 C 4.9375 -4.1875 4.75 -3.726562 4.375 -3.34375 C 4.15625 -3.125 3.757812 -2.851562 3.1875 -2.53125 L 2.546875 -2.1875 C 2.242188 -2.019531 2.003906 -1.859375 1.828125 -1.703125 C 1.515625 -1.429688 1.316406 -1.128906 1.234375 -0.796875 L 4.90625 -0.796875 L 4.90625 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 3.171875 -2.375 L 3.171875 -5.421875 L 1.015625 -2.375 Z M 3.1875 0 L 3.1875 -1.640625 L 0.25 -1.640625 L 0.25 -2.46875 L 3.3125 -6.734375 L 4.03125 -6.734375 L 4.03125 -2.375 L 5.015625 -2.375 L 5.015625 -1.640625 L 4.03125 -1.640625 L 4.03125 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 2.8125 -6.734375 C 3.5625 -6.734375 4.082031 -6.535156 4.375 -6.140625 C 4.664062 -5.753906 4.8125 -5.359375 4.8125 -4.953125 L 3.984375 -4.953125 C 3.929688 -5.210938 3.851562 -5.421875 3.75 -5.578125 C 3.539062 -5.859375 3.226562 -6 2.8125 -6 C 2.34375 -6 1.96875 -5.78125 1.6875 -5.34375 C 1.414062 -4.90625 1.265625 -4.28125 1.234375 -3.46875 C 1.421875 -3.75 1.664062 -3.960938 1.96875 -4.109375 C 2.226562 -4.234375 2.523438 -4.296875 2.859375 -4.296875 C 3.421875 -4.296875 3.910156 -4.113281 4.328125 -3.75 C 4.742188 -3.394531 4.953125 -2.863281 4.953125 -2.15625 C 4.953125 -1.539062 4.753906 -1 4.359375 -0.53125 C 3.960938 -0.0625 3.398438 0.171875 2.671875 0.171875 C 2.046875 0.171875 1.503906 -0.0625 1.046875 -0.53125 C 0.585938 -1.007812 0.359375 -1.816406 0.359375 -2.953125 C 0.359375 -3.785156 0.460938 -4.488281 0.671875 -5.0625 C 1.054688 -6.175781 1.769531 -6.734375 2.8125 -6.734375 Z M 2.75 -0.578125 C 3.1875 -0.578125 3.515625 -0.722656 3.734375 -1.015625 C 3.960938 -1.316406 4.078125 -1.671875 4.078125 -2.078125 C 4.078125 -2.421875 3.976562 -2.75 3.78125 -3.0625 C 3.582031 -3.375 3.222656 -3.53125 2.703125 -3.53125 C 2.335938 -3.53125 2.019531 -3.410156 1.75 -3.171875 C 1.476562 -2.929688 1.34375 -2.566406 1.34375 -2.078125 C 1.34375 -1.648438 1.460938 -1.289062 1.703125 -1 C 1.953125 -0.71875 2.300781 -0.578125 2.75 -0.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 2.609375 -3.890625 C 2.984375 -3.890625 3.273438 -3.992188 3.484375 -4.203125 C 3.691406 -4.410156 3.796875 -4.660156 3.796875 -4.953125 C 3.796875 -5.203125 3.691406 -5.429688 3.484375 -5.640625 C 3.285156 -5.847656 2.984375 -5.953125 2.578125 -5.953125 C 2.171875 -5.953125 1.875 -5.847656 1.6875 -5.640625 C 1.507812 -5.429688 1.421875 -5.1875 1.421875 -4.90625 C 1.421875 -4.59375 1.535156 -4.34375 1.765625 -4.15625 C 2.003906 -3.976562 2.285156 -3.890625 2.609375 -3.890625 Z M 2.65625 -0.578125 C 3.050781 -0.578125 3.375 -0.679688 3.625 -0.890625 C 3.882812 -1.097656 4.015625 -1.414062 4.015625 -1.84375 C 4.015625 -2.269531 3.878906 -2.59375 3.609375 -2.8125 C 3.347656 -3.039062 3.007812 -3.15625 2.59375 -3.15625 C 2.195312 -3.15625 1.867188 -3.039062 1.609375 -2.8125 C 1.359375 -2.582031 1.234375 -2.265625 1.234375 -1.859375 C 1.234375 -1.515625 1.347656 -1.210938 1.578125 -0.953125 C 1.816406 -0.703125 2.175781 -0.578125 2.65625 -0.578125 Z M 1.46875 -3.578125 C 1.226562 -3.671875 1.039062 -3.785156 0.90625 -3.921875 C 0.664062 -4.171875 0.546875 -4.5 0.546875 -4.90625 C 0.546875 -5.40625 0.722656 -5.832031 1.078125 -6.1875 C 1.441406 -6.550781 1.957031 -6.734375 2.625 -6.734375 C 3.269531 -6.734375 3.773438 -6.5625 4.140625 -6.21875 C 4.503906 -5.875 4.6875 -5.476562 4.6875 -5.03125 C 4.6875 -4.613281 4.582031 -4.273438 4.375 -4.015625 C 4.25 -3.867188 4.0625 -3.722656 3.8125 -3.578125 C 4.09375 -3.453125 4.3125 -3.304688 4.46875 -3.140625 C 4.769531 -2.828125 4.921875 -2.421875 4.921875 -1.921875 C 4.921875 -1.335938 4.722656 -0.835938 4.328125 -0.421875 C 3.929688 -0.015625 3.367188 0.1875 2.640625 0.1875 C 1.984375 0.1875 1.429688 0.0078125 0.984375 -0.34375 C 0.535156 -0.695312 0.3125 -1.210938 0.3125 -1.890625 C 0.3125 -2.285156 0.40625 -2.625 0.59375 -2.90625 C 0.789062 -3.195312 1.082031 -3.421875 1.46875 -3.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-7">
+<path style="stroke:none;" d="M 1.1875 -1.703125 C 1.238281 -1.222656 1.460938 -0.894531 1.859375 -0.71875 C 2.054688 -0.625 2.285156 -0.578125 2.546875 -0.578125 C 3.046875 -0.578125 3.414062 -0.734375 3.65625 -1.046875 C 3.894531 -1.367188 4.015625 -1.722656 4.015625 -2.109375 C 4.015625 -2.578125 3.867188 -2.9375 3.578125 -3.1875 C 3.296875 -3.445312 2.957031 -3.578125 2.5625 -3.578125 C 2.269531 -3.578125 2.019531 -3.519531 1.8125 -3.40625 C 1.601562 -3.289062 1.425781 -3.132812 1.28125 -2.9375 L 0.546875 -2.984375 L 1.0625 -6.59375 L 4.546875 -6.59375 L 4.546875 -5.78125 L 1.703125 -5.78125 L 1.40625 -3.921875 C 1.5625 -4.035156 1.710938 -4.125 1.859375 -4.1875 C 2.109375 -4.289062 2.394531 -4.34375 2.71875 -4.34375 C 3.332031 -4.34375 3.851562 -4.140625 4.28125 -3.734375 C 4.707031 -3.335938 4.921875 -2.835938 4.921875 -2.234375 C 4.921875 -1.597656 4.722656 -1.035156 4.328125 -0.546875 C 3.941406 -0.0664062 3.320312 0.171875 2.46875 0.171875 C 1.914062 0.171875 1.429688 0.0195312 1.015625 -0.28125 C 0.597656 -0.59375 0.363281 -1.066406 0.3125 -1.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-8">
+<path style="stroke:none;" d="M 5.015625 -6.59375 L 5.015625 -5.859375 C 4.796875 -5.648438 4.507812 -5.285156 4.15625 -4.765625 C 3.800781 -4.242188 3.484375 -3.6875 3.203125 -3.09375 C 2.929688 -2.507812 2.726562 -1.976562 2.59375 -1.5 C 2.5 -1.1875 2.378906 -0.6875 2.234375 0 L 1.3125 0 C 1.519531 -1.28125 1.988281 -2.554688 2.71875 -3.828125 C 3.144531 -4.566406 3.59375 -5.207031 4.0625 -5.75 L 0.34375 -5.75 L 0.34375 -6.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-9">
+<path style="stroke:none;" d="M 0.921875 -4.75 L 0.921875 -5.390625 C 1.523438 -5.453125 1.945312 -5.550781 2.1875 -5.6875 C 2.425781 -5.832031 2.609375 -6.164062 2.734375 -6.6875 L 3.390625 -6.6875 L 3.390625 0 L 2.5 0 L 2.5 -4.75 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-0">
+<path style="stroke:none;" d="M 0.390625 0 L 0.390625 -8.609375 L 7.21875 -8.609375 L 7.21875 0 Z M 6.140625 -1.078125 L 6.140625 -7.53125 L 1.46875 -7.53125 L 1.46875 -1.078125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-1">
+<path style="stroke:none;" d="M 0.171875 -6.28125 L 1.546875 -6.28125 L 2.984375 -4.0625 L 4.4375 -6.28125 L 5.71875 -6.25 L 3.609375 -3.21875 L 5.8125 0 L 4.46875 0 L 2.90625 -2.359375 L 1.40625 0 L 0.0625 0 L 2.28125 -3.21875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-0">
+<path style="stroke:none;" d="M 2.125 -0.59375 L -8.46875 -0.59375 L -8.46875 -6.59375 L 2.125 -6.59375 Z M 1.453125 -1.265625 L 1.453125 -5.9375 L -7.78125 -5.9375 L -7.78125 -1.265625 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-1">
+<path style="stroke:none;" d="M -1.828125 -2 C -1.265625 -2 -0.882812 -2.050781 -0.6875 -2.15625 C -0.5 -2.269531 -0.40625 -2.472656 -0.40625 -2.765625 C -0.40625 -3.222656 -0.726562 -3.601562 -1.375 -3.90625 C -2.019531 -4.207031 -2.835938 -4.359375 -3.828125 -4.359375 L -5.390625 -4.359375 L -5.390625 -5.46875 L -1.453125 -5.46875 C -1.097656 -5.46875 -0.832031 -5.503906 -0.65625 -5.578125 C -0.488281 -5.648438 -0.40625 -5.765625 -0.40625 -5.921875 C -0.40625 -6.085938 -0.488281 -6.210938 -0.65625 -6.296875 C -0.820312 -6.390625 -1.066406 -6.4375 -1.390625 -6.4375 L -1.5625 -6.4375 L -1.5625 -6.6875 C -1.53125 -6.6875 -1.492188 -6.6875 -1.453125 -6.6875 C -1.421875 -6.695312 -1.367188 -6.703125 -1.296875 -6.703125 C -0.847656 -6.703125 -0.5 -6.601562 -0.25 -6.40625 C -0.0078125 -6.21875 0.109375 -5.953125 0.109375 -5.609375 C 0.109375 -5.210938 -0.0625 -4.910156 -0.40625 -4.703125 C -0.75 -4.503906 -1.265625 -4.398438 -1.953125 -4.390625 C -1.242188 -4.210938 -0.722656 -3.96875 -0.390625 -3.65625 C -0.0546875 -3.351562 0.109375 -2.96875 0.109375 -2.5 C 0.109375 -2.144531 0.00390625 -1.851562 -0.203125 -1.625 C -0.410156 -1.394531 -0.71875 -1.234375 -1.125 -1.140625 C -1.050781 -1.128906 -0.941406 -1.125 -0.796875 -1.125 C -0.285156 -1.125 0.273438 -1.253906 0.890625 -1.515625 C 1.515625 -1.773438 1.882812 -1.90625 2 -1.90625 C 2.15625 -1.90625 2.28125 -1.859375 2.375 -1.765625 C 2.46875 -1.671875 2.515625 -1.546875 2.515625 -1.390625 C 2.515625 -1.210938 2.445312 -1.082031 2.3125 -1 C 2.175781 -0.914062 1.960938 -0.875 1.671875 -0.875 C 1.597656 -0.875 1.363281 -0.878906 0.96875 -0.890625 C 0.582031 -0.910156 0.226562 -0.921875 -0.09375 -0.921875 C -0.382812 -0.921875 -0.789062 -0.914062 -1.3125 -0.90625 C -1.832031 -0.894531 -2.210938 -0.890625 -2.453125 -0.890625 L -5.390625 -0.890625 L -5.390625 -2 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-0">
+<path style="stroke:none;" d="M 2.65625 -0.75 L -10.578125 -0.75 L -10.578125 -8.25 L 2.65625 -8.25 Z M 1.8125 -1.59375 L 1.8125 -7.40625 L -9.734375 -7.40625 L -9.734375 -1.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-1">
+<path style="stroke:none;" d="M -10.546875 -4.296875 C -9.796875 -3.460938 -8.925781 -2.867188 -7.9375 -2.515625 C -6.945312 -2.171875 -5.617188 -2 -3.953125 -2 C -2.273438 -2 -0.945312 -2.171875 0.03125 -2.515625 C 1.019531 -2.867188 1.890625 -3.460938 2.640625 -4.296875 L 2.953125 -3.984375 C 2.191406 -2.953125 1.203125 -2.144531 -0.015625 -1.5625 C -1.234375 -0.976562 -2.546875 -0.6875 -3.953125 -0.6875 C -5.359375 -0.6875 -6.671875 -0.976562 -7.890625 -1.5625 C -9.117188 -2.15625 -10.109375 -2.960938 -10.859375 -3.984375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-2">
+<path style="stroke:none;" d="M -10.546875 -0.703125 L -10.859375 -0.984375 C -10.109375 -2.023438 -9.117188 -2.835938 -7.890625 -3.421875 C -6.660156 -4.015625 -5.347656 -4.3125 -3.953125 -4.3125 C -2.546875 -4.3125 -1.234375 -4.015625 -0.015625 -3.421875 C 1.203125 -2.835938 2.191406 -2.023438 2.953125 -0.984375 L 2.640625 -0.703125 C 1.898438 -1.535156 1.035156 -2.125 0.046875 -2.46875 C -0.929688 -2.820312 -2.265625 -3 -3.953125 -3 C -5.628906 -3 -6.957031 -2.820312 -7.9375 -2.46875 C -8.925781 -2.125 -9.796875 -1.535156 -10.546875 -0.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-0">
+<path style="stroke:none;" d="M 0 -0.390625 L -8.609375 -0.390625 L -8.609375 -7.21875 L 0 -7.21875 Z M -1.078125 -6.140625 L -7.53125 -6.140625 L -7.53125 -1.46875 L -1.078125 -1.46875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-1">
+<path style="stroke:none;" d="M -6.28125 -0.171875 L -6.28125 -1.546875 L -4.0625 -2.984375 L -6.28125 -4.4375 L -6.25 -5.71875 L -3.21875 -3.609375 L 0 -5.8125 L 0 -4.46875 L -2.359375 -2.90625 L 0 -1.40625 L 0 -0.0625 L -3.21875 -2.28125 Z "/>
+</symbol>
+</g>
+<clipPath id="clip1">
+ <path d="M 48.683594 14.398438 L 202 14.398438 L 202 180 L 48.683594 180 Z "/>
+</clipPath>
+<clipPath id="clip2">
+ <path d="M 48.683594 153 L 202 153 L 202 155 L 48.683594 155 Z "/>
+</clipPath>
+<clipPath id="clip3">
+ <path d="M 48.683594 114 L 202 114 L 202 116 L 48.683594 116 Z "/>
+</clipPath>
+<clipPath id="clip4">
+ <path d="M 48.683594 75 L 202 75 L 202 77 L 48.683594 77 Z "/>
+</clipPath>
+<clipPath id="clip5">
+ <path d="M 48.683594 36 L 202 36 L 202 38 L 48.683594 38 Z "/>
+</clipPath>
+<clipPath id="clip6">
+ <path d="M 72 14.398438 L 74 14.398438 L 74 180 L 72 180 Z "/>
+</clipPath>
+<clipPath id="clip7">
+ <path d="M 107 14.398438 L 109 14.398438 L 109 180 L 107 180 Z "/>
+</clipPath>
+<clipPath id="clip8">
+ <path d="M 142 14.398438 L 143 14.398438 L 143 180 L 142 180 Z "/>
+</clipPath>
+<clipPath id="clip9">
+ <path d="M 177 14.398438 L 178 14.398438 L 178 180 L 177 180 Z "/>
+</clipPath>
+<clipPath id="clip10">
+ <path d="M 48.683594 173 L 202.601562 173 L 202.601562 175 L 48.683594 175 Z "/>
+</clipPath>
+<clipPath id="clip11">
+ <path d="M 48.683594 134 L 202.601562 134 L 202.601562 136 L 48.683594 136 Z "/>
+</clipPath>
+<clipPath id="clip12">
+ <path d="M 48.683594 95 L 202.601562 95 L 202.601562 97 L 48.683594 97 Z "/>
+</clipPath>
+<clipPath id="clip13">
+ <path d="M 48.683594 56 L 202.601562 56 L 202.601562 58 L 48.683594 58 Z "/>
+</clipPath>
+<clipPath id="clip14">
+ <path d="M 48.683594 17 L 202.601562 17 L 202.601562 19 L 48.683594 19 Z "/>
+</clipPath>
+<clipPath id="clip15">
+ <path d="M 55 14.398438 L 57 14.398438 L 57 180 L 55 180 Z "/>
+</clipPath>
+<clipPath id="clip16">
+ <path d="M 89 14.398438 L 91 14.398438 L 91 180 L 89 180 Z "/>
+</clipPath>
+<clipPath id="clip17">
+ <path d="M 124 14.398438 L 126 14.398438 L 126 180 L 124 180 Z "/>
+</clipPath>
+<clipPath id="clip18">
+ <path d="M 159 14.398438 L 161 14.398438 L 161 180 L 159 180 Z "/>
+</clipPath>
+<clipPath id="clip19">
+ <path d="M 194 14.398438 L 196 14.398438 L 196 180 L 194 180 Z "/>
+</clipPath>
+</defs>
+<g id="surface211">
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 216 L 216 216 L 216 0 L 0 0 Z "/>
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(89.803922%,89.803922%,89.803922%);fill-opacity:1;" d="M 48.683594 179.027344 L 201.601562 179.027344 L 201.601562 14.398438 L 48.683594 14.398438 Z "/>
+</g>
+<g clip-path="url(#clip2)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 154.214844 L 201.601562 154.214844 "/>
+</g>
+<g clip-path="url(#clip3)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 115.226562 L 201.601562 115.226562 "/>
+</g>
+<g clip-path="url(#clip4)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 76.234375 L 201.601562 76.234375 "/>
+</g>
+<g clip-path="url(#clip5)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 37.242188 L 201.601562 37.242188 "/>
+</g>
+<g clip-path="url(#clip6)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 73.011719 179.027344 L 73.011719 14.398438 "/>
+</g>
+<g clip-path="url(#clip7)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 107.765625 179.027344 L 107.765625 14.398438 "/>
+</g>
+<g clip-path="url(#clip8)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 142.519531 179.027344 L 142.519531 14.398438 "/>
+</g>
+<g clip-path="url(#clip9)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 177.273438 179.027344 L 177.273438 14.398438 "/>
+</g>
+<g clip-path="url(#clip10)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 173.710938 L 201.601562 173.710938 "/>
+</g>
+<g clip-path="url(#clip11)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 134.71875 L 201.601562 134.71875 "/>
+</g>
+<g clip-path="url(#clip12)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 95.730469 L 201.601562 95.730469 "/>
+</g>
+<g clip-path="url(#clip13)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 56.738281 L 201.601562 56.738281 "/>
+</g>
+<g clip-path="url(#clip14)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.683594 17.746094 L 201.601562 17.746094 "/>
+</g>
+<g clip-path="url(#clip15)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 55.632812 179.027344 L 55.632812 14.398438 "/>
+</g>
+<g clip-path="url(#clip16)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 90.386719 179.027344 L 90.386719 14.398438 "/>
+</g>
+<g clip-path="url(#clip17)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 125.140625 179.027344 L 125.140625 14.398438 "/>
+</g>
+<g clip-path="url(#clip18)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 159.894531 179.027344 L 159.894531 14.398438 "/>
+</g>
+<g clip-path="url(#clip19)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.648438 179.027344 L 194.648438 14.398438 "/>
+</g>
+<path style="fill:none;stroke-width:7.440945;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:1;" d="M 55.632812 171.546875 L 55.910156 171.480469 L 56.191406 171.414062 L 56.46875 171.34375 L 56.746094 171.269531 L 57.027344 171.199219 L 57.304688 171.121094 L 57.582031 171.046875 L 57.863281 170.964844 L 58.417969 170.800781 L 58.699219 170.714844 L 58.976562 170.628906 L 59.253906 170.539062 L 59.535156 170.445312 L 59.8125 170.351562 L 60.089844 170.253906 L 60.371094 170.152344 L 60.648438 170.050781 L 60.925781 169.945312 L 61.207031 169.839844 L 61.484375 169.730469 L 61.761719 169.617188 L 62.039062 169.5 L 62.320312 169.382812 L 62.597656 169.261719 L 62.875 169.136719 L 63.15625 169.011719 L 63.710938 168.746094 L 63.992188 168.609375 L 64.269531 168.472656 L 64.546875 168.328125 L 64.828125 168.183594 L 65.382812 167.878906 L 65.664062 167.722656 L 65.941406 167.5625 L 66.21875 167.398438 L 66.5 167.230469 L 67.054688 166.886719 L 67.335938 166.707031 L 67.613281 166.523438 L 67.890625 166.335938 L 68.167969 166.144531 L 68.449219 165.949219 L 68.726562 165.75 L 69.003906 165.546875 L 69.285156 165.335938 L 69.5625 165.125 L 69.839844 164.90625 L 70.121094 164.683594 L 70.398438 164.457031 L 70.675781 164.226562 L 70.957031 163.992188 L 71.234375 163.75 L 71.511719 163.503906 L 71.792969 163.253906 L 72.070312 162.996094 L 72.347656 162.734375 L 72.628906 162.46875 L 72.90625 162.199219 L 73.183594 161.921875 L 73.464844 161.636719 L 73.742188 161.351562 L 74.019531 161.054688 L 74.300781 160.757812 L 74.578125 160.453125 L 74.855469 160.140625 L 75.132812 159.824219 L 75.414062 159.5 L 75.691406 159.171875 L 75.96875 158.835938 L 76.25 158.496094 L 76.527344 158.148438 L 76.804688 157.792969 L 77.085938 157.433594 L 77.363281 157.066406 L 77.640625 156.695312 L 77.921875 156.316406 L 78.199219 155.929688 L 78.476562 155.535156 L 78.757812 155.132812 L 79.035156 154.726562 L 79.3125 154.3125 L 79.59375 153.890625 L 79.871094 153.464844 L 80.148438 153.027344 L 80.429688 152.585938 L 80.707031 152.136719 L 80.984375 151.679688 L 81.261719 151.214844 L 81.542969 150.742188 L 81.820312 150.261719 L 82.097656 149.773438 L 82.378906 149.28125 L 82.65625 148.777344 L 82.933594 148.265625 L 83.214844 147.746094 L 83.492188 147.222656 L 83.769531 146.6875 L 84.050781 146.144531 L 84.328125 145.59375 L 84.605469 145.035156 L 84.886719 144.46875 L 85.164062 143.894531 L 85.441406 143.3125 L 85.722656 142.71875 L 86 142.121094 L 86.277344 141.511719 L 86.558594 140.894531 L 86.835938 140.269531 L 87.113281 139.636719 L 87.390625 138.996094 L 87.671875 138.34375 L 87.949219 137.683594 L 88.226562 137.019531 L 88.507812 136.339844 L 88.785156 135.65625 L 89.0625 134.960938 L 89.34375 134.261719 L 89.621094 133.550781 L 89.898438 132.828125 L 90.179688 132.101562 L 90.457031 131.363281 L 90.734375 130.617188 L 91.015625 129.863281 L 91.292969 129.101562 L 91.570312 128.328125 L 91.851562 127.546875 L 92.128906 126.757812 L 92.40625 125.960938 L 92.6875 125.152344 L 92.964844 124.335938 L 93.242188 123.511719 L 93.519531 122.679688 L 93.800781 121.839844 L 94.078125 120.988281 L 94.355469 120.128906 L 94.636719 119.261719 L 94.914062 118.386719 L 95.191406 117.503906 L 95.472656 116.609375 L 95.75 115.710938 L 96.027344 114.800781 L 96.308594 113.882812 L 96.585938 112.957031 L 96.863281 112.023438 L 97.144531 111.082031 L 97.421875 110.132812 L 97.699219 109.175781 L 97.980469 108.210938 L 98.257812 107.238281 L 98.535156 106.253906 L 98.816406 105.265625 L 99.09375 104.269531 L 99.371094 103.265625 L 99.652344 102.257812 L 99.929688 101.238281 L 100.207031 100.214844 L 100.484375 99.179688 L 100.765625 98.140625 L 101.042969 97.097656 L 101.320312 96.042969 L 101.601562 94.984375 L 101.878906 93.917969 L 102.15625 92.847656 L 102.4375 91.769531 L 102.714844 90.683594 L 102.992188 89.59375 L 103.273438 88.5 L 103.550781 87.398438 L 103.828125 86.292969 L 104.109375 85.179688 L 104.386719 84.0625 L 104.664062 82.941406 L 104.945312 81.8125 L 105.5 79.546875 L 105.78125 78.40625 L 106.058594 77.261719 L 106.335938 76.113281 L 106.613281 74.960938 L 106.894531 73.804688 L 107.171875 72.644531 L 107.449219 71.480469 L 107.730469 70.316406 L 108.007812 69.148438 L 108.285156 67.976562 L 108.566406 66.804688 L 109.121094 64.453125 L 109.402344 63.273438 L 109.679688 62.09375 L 109.957031 60.910156 L 110.238281 59.726562 L 110.792969 57.359375 L 111.074219 56.175781 L 111.351562 54.992188 L 111.628906 53.816406 L 111.910156 52.65625 L 112.1875 51.507812 L 112.464844 50.375 L 112.742188 49.253906 L 113.023438 48.152344 L 113.300781 47.0625 L 113.578125 45.988281 L 113.859375 44.933594 L 114.136719 43.894531 L 114.414062 42.875 L 114.695312 41.871094 L 114.972656 40.886719 L 115.25 39.925781 L 115.53125 38.980469 L 115.808594 38.058594 L 116.085938 37.15625 L 116.367188 36.277344 L 116.644531 35.417969 L 116.921875 34.582031 L 117.203125 33.769531 L 117.480469 32.980469 L 117.757812 32.214844 L 118.039062 31.476562 L 118.316406 30.757812 L 118.59375 30.070312 L 118.875 29.402344 L 119.152344 28.765625 L 119.429688 28.152344 L 119.707031 27.566406 L 119.988281 27.007812 L 120.265625 26.476562 L 120.542969 25.972656 L 120.824219 25.496094 L 121.101562 25.050781 L 121.378906 24.632812 L 121.660156 24.242188 L 121.9375 23.882812 L 122.214844 23.550781 L 122.496094 23.25 L 122.773438 22.976562 L 123.050781 22.734375 L 123.332031 22.523438 L 123.609375 22.339844 L 123.886719 22.1875 L 124.167969 22.066406 L 124.445312 21.972656 L 124.722656 21.914062 L 125.003906 21.882812 L 125.28125 21.882812 L 125.558594 21.914062 L 125.835938 21.972656 L 126.117188 22.066406 L 126.394531 22.1875 L 126.671875 22.339844 L 126.953125 22.523438 L 127.230469 22.734375 L 127.507812 22.976562 L 127.789062 23.25 L 128.066406 23.550781 L 128.34375 23.882812 L 128.625 24.242188 L 128.902344 24.632812 L 129.179688 25.050781 L 129.460938 25.496094 L 129.738281 25.972656 L 130.015625 26.476562 L 130.296875 27.007812 L 130.574219 27.566406 L 130.851562 28.152344 L 131.132812 28.765625 L 131.410156 29.402344 L 131.6875 30.070312 L 131.964844 30.757812 L 132.246094 31.476562 L 132.523438 32.214844 L 132.800781 32.980469 L 133.082031 33.769531 L 133.359375 34.582031 L 133.636719 35.417969 L 133.917969 36.277344 L 134.195312 37.15625 L 134.472656 38.058594 L 134.753906 38.980469 L 135.03125 39.925781 L 135.308594 40.886719 L 135.589844 41.871094 L 135.867188 42.875 L 136.144531 43.894531 L 136.425781 44.933594 L 136.703125 45.988281 L 136.980469 47.0625 L 137.261719 48.152344 L 137.539062 49.253906 L 137.816406 50.375 L 138.09375 51.507812 L 138.375 52.65625 L 138.652344 53.816406 L 138.929688 54.992188 L 139.210938 56.175781 L 139.765625 58.542969 L 140.046875 59.726562 L 140.601562 62.09375 L 140.882812 63.273438 L 141.160156 64.453125 L 141.4375 65.628906 L 141.71875 66.804688 L 142.273438 69.148438 L 142.554688 70.316406 L 143.109375 72.644531 L 143.390625 73.804688 L 143.667969 74.960938 L 143.945312 76.113281 L 144.226562 77.261719 L 144.503906 78.40625 L 144.78125 79.546875 L 145.058594 80.679688 L 145.339844 81.8125 L 145.617188 82.941406 L 145.894531 84.0625 L 146.175781 85.179688 L 146.453125 86.292969 L 146.730469 87.398438 L 147.011719 88.5 L 147.289062 89.59375 L 147.566406 90.683594 L 147.847656 91.769531 L 148.125 92.847656 L 148.402344 93.917969 L 148.683594 94.984375 L 148.960938 96.042969 L 149.238281 97.097656 L 149.519531 98.140625 L 149.796875 99.179688 L 150.074219 100.214844 L 150.355469 101.238281 L 150.632812 102.257812 L 150.910156 103.265625 L 151.1875 104.269531 L 151.46875 105.265625 L 151.746094 106.253906 L 152.023438 107.238281 L 152.304688 108.210938 L 152.582031 109.175781 L 152.859375 110.132812 L 153.140625 111.082031 L 153.417969 112.023438 L 153.695312 112.957031 L 153.976562 113.882812 L 154.253906 114.800781 L 154.53125 115.710938 L 154.8125 116.609375 L 155.089844 117.503906 L 155.367188 118.386719 L 155.648438 119.261719 L 155.925781 120.128906 L 156.203125 120.988281 L 156.484375 121.839844 L 156.761719 122.679688 L 157.039062 123.511719 L 157.316406 124.335938 L 157.597656 125.152344 L 157.875 125.960938 L 158.152344 126.757812 L 158.433594 127.546875 L 158.710938 128.328125 L 158.988281 129.101562 L 159.269531 129.863281 L 159.546875 130.617188 L 159.824219 131.363281 L 160.105469 132.101562 L 160.382812 132.828125 L 160.660156 133.550781 L 160.941406 134.261719 L 161.21875 134.960938 L 161.496094 135.65625 L 161.777344 136.339844 L 162.054688 137.019531 L 162.332031 137.683594 L 162.613281 138.34375 L 162.890625 138.996094 L 163.167969 139.636719 L 163.445312 140.269531 L 163.726562 140.894531 L 164.003906 141.511719 L 164.28125 142.121094 L 164.5625 142.71875 L 164.839844 143.3125 L 165.117188 143.894531 L 165.398438 144.46875 L 165.675781 145.035156 L 165.953125 145.59375 L 166.234375 146.144531 L 166.511719 146.6875 L 166.789062 147.222656 L 167.070312 147.746094 L 167.347656 148.265625 L 167.625 148.777344 L 167.90625 149.28125 L 168.183594 149.773438 L 168.460938 150.261719 L 168.742188 150.742188 L 169.019531 151.214844 L 169.296875 151.679688 L 169.578125 152.136719 L 169.855469 152.585938 L 170.132812 153.027344 L 170.410156 153.464844 L 170.691406 153.890625 L 170.96875 154.3125 L 171.246094 154.726562 L 171.527344 155.132812 L 171.804688 155.535156 L 172.082031 155.929688 L 172.363281 156.316406 L 172.640625 156.695312 L 172.917969 157.066406 L 173.199219 157.433594 L 173.476562 157.792969 L 173.753906 158.148438 L 174.035156 158.496094 L 174.3125 158.835938 L 174.589844 159.171875 L 174.871094 159.5 L 175.148438 159.824219 L 175.425781 160.140625 L 175.707031 160.453125 L 175.984375 160.757812 L 176.539062 161.351562 L 176.820312 161.636719 L 177.097656 161.921875 L 177.375 162.199219 L 177.65625 162.46875 L 177.933594 162.734375 L 178.210938 162.996094 L 178.492188 163.253906 L 178.769531 163.503906 L 179.046875 163.75 L 179.328125 163.992188 L 179.605469 164.226562 L 179.882812 164.457031 L 180.164062 164.683594 L 180.441406 164.90625 L 180.71875 165.125 L 181 165.335938 L 181.277344 165.546875 L 181.554688 165.75 L 181.835938 165.949219 L 182.113281 166.144531 L 182.390625 166.335938 L 182.667969 166.523438 L 182.949219 166.707031 L 183.226562 166.886719 L 183.503906 167.058594 L 183.785156 167.230469 L 184.0625 167.398438 L 184.339844 167.5625 L 184.621094 167.722656 L 184.898438 167.878906 L 185.175781 168.03125 L 185.457031 168.183594 L 186.011719 168.472656 L 186.292969 168.609375 L 186.570312 168.746094 L 186.847656 168.878906 L 187.128906 169.011719 L 187.683594 169.261719 L 187.964844 169.382812 L 188.519531 169.617188 L 188.800781 169.730469 L 189.078125 169.839844 L 189.632812 170.050781 L 189.914062 170.152344 L 190.191406 170.253906 L 190.46875 170.351562 L 190.75 170.445312 L 191.027344 170.539062 L 191.304688 170.628906 L 191.585938 170.714844 L 191.863281 170.800781 L 192.140625 170.882812 L 192.421875 170.964844 L 192.699219 171.046875 L 192.976562 171.121094 L 193.257812 171.199219 L 193.535156 171.269531 L 193.8125 171.34375 L 194.09375 171.414062 L 194.648438 171.546875 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.261719" y="177.148438"/>
+ <use xlink:href="#glyph0-2" x="33.597305" y="177.148438"/>
+ <use xlink:href="#glyph0-1" x="36.262756" y="177.148438"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.261719" y="138.15625"/>
+ <use xlink:href="#glyph0-2" x="33.597305" y="138.15625"/>
+ <use xlink:href="#glyph0-3" x="36.262756" y="138.15625"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.261719" y="99.167969"/>
+ <use xlink:href="#glyph0-2" x="33.597305" y="99.167969"/>
+ <use xlink:href="#glyph0-4" x="36.262756" y="99.167969"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.261719" y="60.175781"/>
+ <use xlink:href="#glyph0-2" x="33.597305" y="60.175781"/>
+ <use xlink:href="#glyph0-5" x="36.262756" y="60.175781"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="28.261719" y="21.183594"/>
+ <use xlink:href="#glyph0-2" x="33.597305" y="21.183594"/>
+ <use xlink:href="#glyph0-6" x="36.262756" y="21.183594"/>
+</g>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.429688 173.710938 L 48.683594 173.710938 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.429688 134.71875 L 48.683594 134.71875 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.429688 95.730469 L 48.683594 95.730469 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.429688 56.738281 L 48.683594 56.738281 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.429688 17.746094 L 48.683594 17.746094 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 55.632812 183.28125 L 55.632812 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 90.386719 183.28125 L 90.386719 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 125.140625 183.28125 L 125.140625 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 159.894531 183.28125 L 159.894531 179.027344 "/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(49.803922%,49.803922%,49.803922%);stroke-opacity:1;stroke-miterlimit:10;" d="M 194.648438 183.28125 L 194.648438 179.027344 "/>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="46.296875" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="51.632462" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="54.297913" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="59.633499" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="81.050781" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="86.386368" y="192.992188"/>
+ <use xlink:href="#glyph0-3" x="89.051819" y="192.992188"/>
+ <use xlink:href="#glyph0-7" x="94.387405" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="115.804688" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="121.140274" y="192.992188"/>
+ <use xlink:href="#glyph0-7" x="123.805725" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="129.141312" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="150.558594" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="155.89418" y="192.992188"/>
+ <use xlink:href="#glyph0-8" x="158.559631" y="192.992188"/>
+ <use xlink:href="#glyph0-7" x="163.895218" y="192.992188"/>
+</g>
+<g style="fill:rgb(49.803922%,49.803922%,49.803922%);fill-opacity:1;">
+ <use xlink:href="#glyph0-9" x="185.3125" y="192.992188"/>
+ <use xlink:href="#glyph0-2" x="190.648087" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="193.313538" y="192.992188"/>
+ <use xlink:href="#glyph0-1" x="198.649124" y="192.992188"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-1" x="122.140625" y="205.199219"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph2-1" x="21.660156" y="108.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-1" x="21.660156" y="101.210938"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph4-1" x="21.660156" y="96.214844"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph3-2" x="21.660156" y="90.214844"/>
+</g>
+</g>
+</svg>
diff --git a/documentation/ui/figure/piShape.svg b/documentation/ui/figure/piShape.svg
new file mode 100644
index 0000000..ecf546c
--- /dev/null
+++ b/documentation/ui/figure/piShape.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="216pt" height="216pt" viewBox="0 0 216 216" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 0.3125 0 L 0.3125 -6.875 L 5.765625 -6.875 L 5.765625 0 Z M 4.90625 -0.859375 L 4.90625 -6.015625 L 1.171875 -6.015625 L 1.171875 -0.859375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 2.59375 -6.703125 C 3.457031 -6.703125 4.085938 -6.347656 4.484375 -5.640625 C 4.773438 -5.085938 4.921875 -4.328125 4.921875 -3.359375 C 4.921875 -2.453125 4.785156 -1.695312 4.515625 -1.09375 C 4.128906 -0.238281 3.488281 0.1875 2.59375 0.1875 C 1.78125 0.1875 1.179688 -0.160156 0.796875 -0.859375 C 0.460938 -1.453125 0.296875 -2.238281 0.296875 -3.21875 C 0.296875 -3.976562 0.394531 -4.632812 0.59375 -5.1875 C 0.957031 -6.195312 1.625 -6.703125 2.59375 -6.703125 Z M 2.578125 -0.578125 C 3.015625 -0.578125 3.363281 -0.769531 3.625 -1.15625 C 3.882812 -1.550781 4.015625 -2.273438 4.015625 -3.328125 C 4.015625 -4.085938 3.921875 -4.710938 3.734375 -5.203125 C 3.546875 -5.703125 3.179688 -5.953125 2.640625 -5.953125 C 2.148438 -5.953125 1.789062 -5.71875 1.5625 -5.25 C 1.332031 -4.78125 1.21875 -4.09375 1.21875 -3.1875 C 1.21875 -2.5 1.289062 -1.945312 1.4375 -1.53125 C 1.65625 -0.894531 2.035156 -0.578125 2.578125 -0.578125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 0.8125 -1.015625 L 1.796875 -1.015625 L 1.796875 0 L 0.8125 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 0.296875 0 C 0.328125 -0.570312 0.445312 -1.070312 0.65625 -1.5 C 0.863281 -1.9375 1.269531 -2.328125 1.875 -2.671875 L 2.765625 -3.1875 C 3.171875 -3.425781 3.457031 -3.628906 3.625 -3.796875 C 3.875 -4.054688 4 -4.351562 4 -4.6875 C 4 -5.070312 3.878906 -5.378906 3.640625 -5.609375 C 3.410156 -5.835938 3.101562 -5.953125 2.71875 -5.953125 C 2.132812 -5.953125 1.734375 -5.734375 1.515625 -5.296875 C 1.398438 -5.066406 1.335938 -4.742188 1.328125 -4.328125 L 0.46875 -4.328125 C 0.476562 -4.910156 0.582031 -5.382812 0.78125 -5.75 C 1.144531 -6.40625 1.789062 -6.734375 2.71875 -6.734375 C 3.488281 -6.734375 4.050781 -6.523438 4.40625 -6.109375 C 4.757812 -5.691406 4.9375 -5.226562 4.9375 -4.71875 C 4.9375 -4.1875 4.75 -3.726562 4.375 -3.34375 C 4.15625 -3.125 3.757812 -2.851562 3.1875 -2.53125 L 2.546875 -2.1875 C 2.242188 -2.019531 2.003906 -1.859375 1.828125 -1.703125 C 1.515625 -1.429688 1.316406 -1.128906 1.234375 -0.796875 L 4.90625 -0.796875 L 4.90625 0 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 1.1875 -1.703125 C 1.238281 -1.222656 1.460938 -0.894531 1.859375 -0.71875 C 2.054688 -0.625 2.285156 -0.578125 2.546875 -0.578125 C 3.046875 -0.578125 3.414062 -0.734375 3.65625 -1.046875 C 3.894531 -1.367188 4.015625 -1.722656 4.015625 -2.109375 C 4.015625 -2.578125 3.867188 -2.9375 3.578125 -3.1875 C 3.296875 -3.445312 2.957031 -3.578125 2.5625 -3.578125 C 2.269531 -3.578125 2.019531 -3.519531 1.8125 -3.40625 C 1.601562 -3.289062 1.425781 -3.132812 1.28125 -2.9375 L 0.546875 -2.984375 L 1.0625 -6.59375 L 4.546875 -6.59375 L 4.546875 -5.78125 L 1.703125 -5.78125 L 1.40625 -3.921875 C 1.5625 -4.035156 1.710938 -4.125 1.859375 -4.1875 C 2.109375 -4.289062 2.394531 -4.34375 2.71875 -4.34375 C 3.332031 -4.34375 3.851562 -4.140625 4.28125 -3.734375 C 4.707031 -3.335938 4.921875 -2.835938 4.921875 -2.234375 C 4.921875 -1.597656 4.722656 -1.035156 4.328125 -0.546875 C 3.941406 -0.0664062 3.320312 0.171875 2.46875 0.171875 C 1.914062 0.171875 1.429688 0.0195312 1.015625 -0.28125 C 0.597656 -0.59375 0.363281 -1.066406 0.3125 -1.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 5.015625 -6.59375 L 5.015625 -5.859375 C 4.796875 -5.648438 4.507812 -5.285156 4.15625 -4.765625 C 3.800781 -4.242188 3.484375 -3.6875 3.203125 -3.09375 C 2.929688 -2.507812 2.726562 -1.976562 2.59375 -1.5 C 2.5 -1.1875 2.378906 -0.6875 2.234375 0 L 1.3125 0 C 1.519531 -1.28125 1.988281 -2.554688 2.71875 -3.828125 C 3.144531 -4.566406 3.59375 -5.207031 4.0625 -5.75 L 0.34375 -5.75 L 0.34375 -6.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 0.921875 -4.75 L 0.921875 -5.390625 C 1.523438 -5.453125 1.945312 -5.550781 2.1875 -5.6875 C 2.425781 -5.832031 2.609375 -6.164062 2.734375 -6.6875 L 3.390625 -6.6875 L 3.390625 0 L 2.5 0 L 2.5 -4.75 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-0">
+<path style="stroke:none;" d="M 0.390625 0 L 0.390625 -8.609375 L 7.21875 -8.609375 L 7.21875 0 Z M 6.140625 -1.078125 L 6.140625 -7.53125 L 1.46875 -7.53125 L 1.46875 -1.078125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-1">
+<path style="stroke:none;" d="M 0.171875 -6.28125 L 1.546875 -6.28125 L 2.984375 -4.0625 L 4.4375 -6.28125 L 5.71875 -6.25 L 3.609375 -3.21875 L 5.8125 0 L 4.46875 0 L 2.90625 -2.359375 L 1.40625 0 L 0.0625 0 L 2.28125 -3.21875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-0">
+<path style="stroke:none;" d="M 2.125 -0.59375 L -8.46875 -0.59375 L -8.46875 -6.59375 L 2.125 -6.59375 Z M 1.453125 -1.265625 L 1.453125 -5.9375 L -7.78125 -5.9375 L -7.78125 -1.265625 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-1">
+<path style="stroke:none;" d="M -1.828125 -2 C -1.265625 -2 -0.882812 -2.050781 -0.6875 -2.15625 C -0.5 -2.269531 -0.40625 -2.472656 -0.40625 -2.765625 C -0.40625 -3.222656 -0.726562 -3.601562 -1.375 -3.90625 C -2.019531 -4.207031 -2.835938 -4.359375 -3.828125 -4.359375 L -5.390625 -4.359375 L -5.390625 -5.46875 L -1.453125 -5.46875 C -1.097656 -5.46875 -0.832031 -5.503906 -0.65625 -5.578125 C -0.488281 -5.648438 -0.40625 -5.765625 -0.40625 -5.921875 C -0.40625 -6.085938 -0.488281 -6.210938 -0.65625 -6.296875 C -0.820312 -6.390625 -1.066406 -6.4375 -1.390625 -6.4375 L -1.5625 -6.4375 L -1.5625 -6.6875 C -1.53125 -6.6875 -1.492188 -6.6875 -1.453125 -6.6875 C -1.421875 -6.695312 -1.367188 -6.703125 -1.296875 -6.703125 C -0.847656 -6.703125 -0.5 -6.601562 -0.25 -6.40625 C -0.0078125 -6.21875 0.109375 -5.953125 0.109375 -5.609375 C 0.109375 -5.210938 -0.0625 -4.910156 -0.40625 -4.703125 C -0.75 -4.503906 -1.265625 -4.398438 -1.953125 -4.390625 C -1.242188 -4.210938 -0.722656 -3.96875 -0.390625 -3.65625 C -0.0546875 -3.351562 0.109375 -2.96875 0.109375 -2.5 C 0.109375 -2.144531 0.00390625 -1.851562 -0.203125 -1.625 C -0.410156 -1.394531 -0.71875 -1.234375 -1.125 -1.140625 C -1.050781 -1.128906 -0.941406 -1.125 -0.796875 -1.125 C -0.285156 -1.125 0.273438 -1.253906 0.890625 -1.515625 C 1.515625 -1.773438 1.882812 -1.90625 2 -1.90625 C 2.15625 -1.90625 2.28125 -1.859375 2.375 -1.765625 C 2.46875 -1.671875 2.515625 -1.546875 2.515625 -1.390625 C 2.515625 -1.210938 2.445312 -1.082031 2.3125 -1 C 2.175781 -0.914062 1.960938 -0.875 1.671875 -0.875 C 1.597656 -0.875 1.363281 -0.878906 0.96875 -0.890625 C 0.582031 -0.910156 0.226562 -0.921875 -0.09375 -0.921875 C -0.382812 -0.921875 -0.789062 -0.914062 -1.3125 -0.90625 C -1.832031 -0.894531 -2.210938 -0.890625 -2.453125 -0.890625 L -5.390625 -0.890625 L -5.390625 -2 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-0">
+<path style="stroke:none;" d="M 2.65625 -0.75 L -10.578125 -0.75 L -10.578125 -8.25 L 2.65625 -8.25 Z M 1.8125 -1.59375 L 1.8125 -7.40625 L -9.734375 -7.40625 L -9.734375 -1.59375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-1">
+<path style="stroke:none;" d="M -10.546875 -4.296875 C -9.796875 -3.460938 -8.925781 -2.867188 -7.9375 -2.515625 C -6.945312 -2.171875 -5.617188 -2 -3.953125 -2 C -2.273438 -2 -0.945312 -2.171875 0.03125 -2.515625 C 1.019531 -2.867188 1.890625 -3.460938 2.640625 -4.296875 L 2.953125 -3.984375 C 2.191406 -2.953125 1.203125 -2.144531 -0.015625 -1.5625 C -1.234375 -0.976562 -2.546875 -0.6875 -3.953125 -0.6875 C -5.359375 -0.6875 -6.671875 -0.976562 -7.890625 -1.5625 C -9.117188 -2.15625 -10.109375 -2.960938 -10.859375 -3.984375 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph3-2">
+<path style="stroke:none;" d="M -10.546875 -0.703125 L -10.859375 -0.984375 C -10.109375 -2.023438 -9.117188 -2.835938 -7.890625 -3.421875 C -6.660156 -4.015625 -5.347656 -4.3125 -3.953125 -4.3125 C -2.546875 -4.3125 -1.234375 -4.015625 -0.015625 -3.421875 C 1.203125 -2.835938 2.191406 -2.023438 2.953125 -0.984375 L 2.640625 -0.703125 C 1.898438 -1.535156 1.035156 -2.125 0.046875 -2.46875 C -0.929688 -2.820312 -2.265625 -3 -3.953125 -3 C -5.628906 -3 -6.957031 -2.820312 -7.9375 -2.46875 C -8.925781 -2.125 -9.796875 -1.535156 -10.546875 -0.703125 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-0">
+<path style="stroke:none;" d="M 0 -0.390625 L -8.609375 -0.390625 L -8.609375 -7.21875 L 0 -7.21875 Z M -1.078125 -6.140625 L -7.53125 -6.140625 L -7.53125 -1.46875 L -1.078125 -1.46875 Z "/>
+</symbol>
+<symbol overflow="visible" id="glyph4-1">
+<path style="stroke:none;" d="M -6.28125 -0.171875 L -6.28125 -1.546875 L -4.0625 -2.984375 L -6.28125 -4.4375 L -6.25 -5.71875 L -3.21875 -3.609375 L 0 -5.8125 L 0 -4.46875 L -2.359375 -2.90625 L 0 -1.40625 L 0 -0.0625 L -3.21875 -2.28125 Z "/>
+</symbol>
+</g>
+<clipPath id="clip1">
+ <path d="M 54.019531 14.398438 L 202 14.398438 L 202 180 L 54.019531 180 Z "/>
+</clipPath>
+<clipPath id="clip2">
+ <path d="M 54.019531 152 L 202 152 L 202 154 L 54.019531 154 Z "/>
+</clipPath>
+<clipPath id="clip3">
+ <path d="M 54.019531 115 L 202 115 L 202 116 L 54.019531 116 Z "/>
+</clipPath>
+<clipPath id="clip4">
+ <path d="M 54.019531 77 L 202 77 L 202 79 L 54.019531 79 Z "/>
+</clipPath>
+<clipPath id="clip5">
+ <path d="M 54.019531 40 L 202 40 L 202 41 L 54.019531 41 Z "/>
+</clipPath>
+<clipPath id="clip6">
+ <path d="M 77 14.398438 L 78 14.398438 L 78 180 L 77 180 Z "/>
+</clipPath>
+<clipPath id="clip7">
+ <path d="M 110 14.398438 L 112 14.398438 L 112 180 L 110 180 Z "/>
+</clipPath>
+<clipPath id="clip8">
+ <path d="M 144 14.398438 L 145 14.398438 L 145 180 L 144 180 Z "/>
+</clipPath>
+<clipPath id="clip9">
+ <path d="M 177 14.398438 L 179 14.398438 L 179 180 L 177 180 Z "/>
+</clipPath>
+<clipPath id="clip10">
+ <path d="M 54.019531 171 L 202.601562 171 L 202.601562 173 L 54.019531 173 Z "/>
+</clipPath>
+<clipPath id="clip11">
+ <path d="M 54.019531 133 L 202.601562 133 L 202.601562 135 L 54.019531 135 Z "/>
+</clipPath>
+<clipPath id="clip12">
+ <path d="M 54.019531 96 L 202.601562 96 L 202.601562 98 L 54.019531 98 Z "/>
+</clipPath>
+<clipPath id="clip13">
+ <path d="M 54.019531 58 L 202.601562 58 L 202.601562 60 L 54.019531 60 Z "/>
+</clipPath>
+<clipPath id="clip14">
+ <path d="M 54.019531 21 L 202.601562 21 L 202.601562 23 L 54.019531 23 Z "/>
+</clipPath>
+<clipPath id="clip15">
+ <path d="M 60 14.398438 L 62 14.398438 L 62 180 L 60 180 Z "/>
+</clipPath>
+<clipPath id="clip16">
+ <path d="M 93 14.398438 L 95 14.398438 L 95 180 L 93 180 Z "/>
+</clipPath>
+<clipPath id="clip17">
+ <path d="M 127 14.398438 L 129 14.398438 L 129 180 L 127 180 Z "/>
+</clipPath>
+<clipPath id="clip18">
+ <path d="M 160 14.398438 L 162 14.398438 L 162 180 L 160 180 Z "/>
+</clipPath>
+<clipPath id="clip19">
+ <path d="M 194 14.398438 L 196 14.398438 L 196 180 L 194 180 Z "/>
+</clipPath>
+</defs>
+<g id="surface221">
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<rect x="0" y="0" width="216" height="216" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 216 L 216 216 L 216 0 L 0 0 Z "/>
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(89.803922%,89.803922%,89.803922%);fill-opacity:1;" d="M 54.019531 179.027344 L 201.601562 179.027344 L 201.601562 14.398438 L 54.019531 14.398438 Z "/>
+</g>
+<g clip-path="url(#clip2)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 152.835938 L 201.601562 152.835938 "/>
+</g>
+<g clip-path="url(#clip3)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 115.421875 L 201.601562 115.421875 "/>
+</g>
+<g clip-path="url(#clip4)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 78.007812 L 201.601562 78.007812 "/>
+</g>
+<g clip-path="url(#clip5)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 40.589844 L 201.601562 40.589844 "/>
+</g>
+<g clip-path="url(#clip6)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 77.496094 179.027344 L 77.496094 14.398438 "/>
+</g>
+<g clip-path="url(#clip7)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 111.039062 179.027344 L 111.039062 14.398438 "/>
+</g>
+<g clip-path="url(#clip8)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 144.578125 179.027344 L 144.578125 14.398438 "/>
+</g>
+<g clip-path="url(#clip9)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.531496;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(94.901961%,94.901961%,94.901961%);stroke-opacity:1;stroke-miterlimit:10;" d="M 178.121094 179.027344 L 178.121094 14.398438 "/>
+</g>
+<g clip-path="url(#clip10)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 171.546875 L 201.601562 171.546875 "/>
+</g>
+<g clip-path="url(#clip11)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 134.128906 L 201.601562 134.128906 "/>
+</g>
+<g clip-path="url(#clip12)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 96.714844 L 201.601562 96.714844 "/>
+</g>
+<g clip-path="url(#clip13)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 59.296875 L 201.601562 59.296875 "/>
+</g>
+<g clip-path="url(#clip14)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.019531 21.882812 L 201.601562 21.882812 "/>
+</g>
+<g clip-path="url(#clip15)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 60.726562 179.027344 L 60.726562 14.398438 "/>
+</g>
+<g clip-path="url(#clip16)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:1.062992;stroke-linecap:butt;stroke-linejoin:round;stro